Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » TMF (Xtext) » Cross references across multiple DSL files. How ?(Cross references across multiple DSL files. How ?)
Cross references across multiple DSL files. How ? [message #1067755] Wed, 10 July 2013 13:05 Go to next message
Chris Twigt is currently offline Chris TwigtFriend
Messages: 1
Registered: July 2013
Junior Member
Hi,

I want to generate code with Xtext.
I want to support generating code based on multiple DSL files.
The DSL files must use package names and imports to allow for cross references:

DSL file a:

package a {
class A {
int i;
}
}


DSL file b:


import a.*;

package b {
class B {
A a;
}
}


So file b refers to type A of file a.

This seems to work alright in the Editor.
But when I start the generator I notice that xtend fails because in the model
there is no class with name "A". The model only contains class "B".
It looks like cross references are not resolved. All resources (files a and b) are picked up but their contents ends up in different models.

I'm probably overlooking something extremely basic but I don't have a clue.
Can you help me?

Regards,
Chris




I use qualified names and a rule with importedNamespace.
I have a rule that uses cross references for attribute types:

type=[Class|QualifiedName] name=ID

I use the following binding:

IQualifiedNameProvider -> DefaultDeclarativeQualifiedNameProvider


All other bindings follow from my workflow file:

module comdsl.j2ee.GeneratePersistence

import org.eclipse.emf.mwe.utils.*
import org.eclipse.xtext.generator.*
import org.eclipse.xtext.ui.generator.*

var grammarURI = "classpath:/com/dsl/j2ee/Persistence.xtext"
var file.extensions = "persistence"
var projectName = "com.dsl.j2ee"
var runtimeProject = "../${projectName}"

Workflow {
bean = StandaloneSetup {
scanClassPath = true
platformUri = "${runtimeProject}/.."
//registerGeneratedEPackage = "org.eclipse.xtext.xbase.XbasePackage"
//registerGenModelFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel"
//registerGenModelFile = "platform:/resource/org.eclipse.xtext.common.types/model/JavaVMTypes.genmodel"

// registerGenModelFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel"
// registerGenModelFile = "platform:/resource/org.eclipse.xtext.common.types/model/JavaVMTypes.genmodel"
// registerGeneratedEPackage = "org.eclipse.xtext.xbase.XbasePackage"
// registerGeneratedEPackage = "org.eclipse.xtext.common.types.TypesPackage"

}

component = DirectoryCleaner {
directory = "${runtimeProject}/src-gen"
}

component = DirectoryCleaner {
directory = "${runtimeProject}.ui/src-gen"
}

component = Generator {
pathRtProject = runtimeProject
pathUiProject = "${runtimeProject}.ui"
pathTestProject = "${runtimeProject}.tests"
projectNameRt = projectName
projectNameUi = "${projectName}.ui"
language = {
uri = grammarURI
fileExtensions = file.extensions

// Java API to access grammar elements (required by several other fragments)
fragment = grammarAccess.GrammarAccessFragment {}

// generates Java API for the generated EPackages
fragment = ecore.EcoreGeneratorFragment {
}

// the serialization component
fragment = parseTreeConstructor.ParseTreeConstructorFragment {}

// a custom ResourceFactory for use with EMF
fragment = resourceFactory.ResourceFactoryFragment {
fileExtensions = file.extensions
}

// The antlr parser generator fragment.
fragment = parser.antlr.XtextAntlrGeneratorFragment {
antlrParam = "-Xconversiontimeout" antlrParam = "10000"
// options = {
// backtrack = true
// }
}

// java-based API for validation
fragment = validation.JavaValidatorFragment {
composedCheck = "org.eclipse.xtext.validation.ImportUriValidator"
composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
}

// scoping and exporting API
// fragment = scoping.ImportURIScopingFragment {}
// fragment = exporting.SimpleNamesFragment {}

// scoping and exporting API
fragment = scoping.ImportNamespacesScopingFragment {}
fragment = exporting.QualifiedNamesFragment {}
fragment = builder.BuilderIntegrationFragment {}

// generator API
fragment = generator.GeneratorFragment {
generateMwe = true
generateJavaMain = true
}

// formatter API
fragment = formatting.FormatterFragment {}

// labeling API
fragment = labeling.LabelProviderFragment {}

// outline API
fragment = outline.OutlineTreeProviderFragment {}
fragment = outline.QuickOutlineFragment {}

// quickfix API
fragment = quickfix.QuickfixProviderFragment {}

// content assist API
fragment = contentAssist.JavaBasedContentAssistFragment {}

// generates a more lightweight Antlr parser and lexer tailored for content assist
fragment = parser.antlr.XtextAntlrUiGeneratorFragment {}

// generates junit test support classes into Generator#pathTestProject
fragment = junit.Junit4Fragment {}

// project wizard (optional)
// fragment = projectWizard.SimpleProjectWizardFragment {
// generatorProjectName = "${projectName}"
// modelFileExtension = file.extensions
// }

// provides the necessary bindings for java types integration
//fragment = types.TypesGeneratorFragment {}

// generates the required bindings only if the grammar inherits from Xbase
//fragment = xbase.XbaseGeneratorFragment {}

// provides a preference page for template proposals
fragment = templates.CodetemplatesGeneratorFragment {}

// rename refactoring
// fragment = refactoring.RefactorElementNameFragment {}

// provides a compare view
// fragment = compare.CompareFragment {
// fileExtensions = file.extensions
// }

// Serializer 2.0
// fragment = serializer.SerializerFragment {}
}
}
}



Re: Cross references across multiple DSL files. How ? [message #1067791 is a reply to message #1067755] Wed, 10 July 2013 15:12 Go to previous message
Alexander Nittka is currently offline Alexander NittkaFriend
Messages: 1193
Registered: July 2009
Senior Member
How do you "start the generator"? If you use a workflow, you must make sure, that the reader component processes all files.

Alex


Need training, onsite consulting or any other kind of help for Xtext?
Go visit http://xtext.itemis.com or send a mail to xtext@itemis.de
Previous Topic:Unwanted match.
Next Topic:Get the effective type of JvmField in parametrized context
Goto Forum:
  


Current Time: Sat Apr 27 00:58:13 GMT 2024

Powered by FUDForum. Page generated in 0.02707 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top