How to register my DSL to Java code generator? [message #949994] |
Fri, 19 October 2012 14:24 |
Espinosa CZ Messages: 27 Registered: July 2009 |
Junior Member |
|
|
Hi guys,
Documentation at eclipse.org/Xtext/documentation.html#TutorialCodeGeneration
just laconically says:
First of all, locate the file DomainmodelGenerator.xtend in the package org.eclipse.xtext.example.generator
But DomainmodelGenerator.xtend is not generated anymore for (current Xtext plugin 2.3.1) for DomainModel example project. Or any other. It is confusing.
Does this line suggest that all you need is to create a class extending IGenerator?
I guess it is not enough. You should somehow register your generator.
As a EMF Registration in StandaloneSetup? Somewhere in injector using Guice binding?
How to register the generator? That is my question.
Either by manually coding it or by recreating a specialized workflow as it used to be.
In older times, year ago when I first started to play with Xtext, there used to be "secondary" MWE2 in the sample project. When run it created some basic infrastructure for the generator.
It is suppressed now, I guess, judging from this section from main generator workflow from "new Xtext project template":
Workflow {
...
component = Generator {
...
// generator API
fragment = generator.GeneratorFragment {
generateMwe = false
generateJavaMain = false
}
What the GeneratorFragment generates when both flags are false?
Is the generator generated Generator MWE2 really needed these days?
So I did not create any registration.
I just created an Xtend based Generator:
package my.home.dsl.generator
import org.eclipse.xtext.generator.IGenerator
class DeepCloneGenerator implements IGenerator { ...
override void doGenerate(Resource resource, IFileSystemAccess fsa) {...}
}
My unit test:
@RunWith(typeof(XtextRunner))
@InjectWith(typeof(DeepCloneInjectorProvider))
class DeepCloneGeneratorTest {
@Inject IGenerator generatorDslToJava // how to ensure DeepCloneGenerator implementation?
@Inject ParseHelper<Model> parseHelper
@Test
def test() {
val code = '''
package a.b.c
a.b.c.OpeningHours {
weekDay, from, to
}'''
val model = parseHelper.parse(code)
val fsa = new InMemoryFileSystemAccess()
generatorDslToJava.doGenerate(model.eResource, fsa)
println(fsa.files)
assertEquals(1, fsa.files.size)
val topClonerJavaFileName = IFileSystemAccess::DEFAULT_OUTPUT + "Cloner.java"
assertTrue(fsa.files.containsKey(topClonerJavaFileName))
assertEquals('''
package
public class OpeningHoursCloner {
}'''.toString,
fsa.files.get(topClonerJavaFileName).toString
)
}
}
..but the org.eclipse.xtext.xbase.compiler.JvmModelGenerator::doGenerate()
was called instead of expected my.home.dsl.generator.DeepCloneGenerator::doGenerate()
Thank you for any hint
Espinosa
|
|
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.10021 seconds