Xtend template using a Metamodel (ecore) [message #1771147] |
Tue, 22 August 2017 13:10 |
Estibaliz Amparan Messages: 7 Registered: July 2017 |
Junior Member |
|
|
Hello everybody!
I have a Metamodel (ecore) and I want to generate a template implementing a metamodel. I am trying to generate a template using Xtend technology.
The steps I followed are:
1) I create a Xtext project for an existing Ecore.
2) Once I have my grammar created, I do right-click in my xtext file (Run As-> Generate Xtext Artifacts).
3) From the generated folders, I open generator folder and modified the generator.xtend file with the next code:
package matlabcode.template.generator
import hu.bme.mit.massif.simulink.Block
import hu.bme.mit.massif.simulink.SimulinkElement
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.xtext.generator.AbstractGenerator
import org.eclipse.xtext.generator.IFileSystemAccess2
import org.eclipse.xtext.generator.IGeneratorContext
class MatlabGenerator extends AbstractGenerator {
override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) {
fsa.generateFile('prueba1.m',MatlabCode)
}
def MatlabCode() {
'''
open_system(mdl_03_08_2017) % Open the behavioural model
save_system('mdl_03_08_2017','mdl_03_08_2017_Faulty')
delete_line('mdl_03_08_2017_Faulty','«Block.name»/1','Sub/1')
'''
}
}
4) After that, I run Eclipse Application. Create -> New Java Project. As I have a model file of the metamodel I added it inside the project.
My problem is that nothing appears, the file does not create.
Do you know what is my problem? Or if you know any tutorial about creating a generator code by using ecore metamodel.
Thank you very much!
[Updated on: Mon, 04 September 2017 10:35] Report message to a moderator
|
|
|
|
|
|
Re: Xtend template using a Metamodel (ecore) [message #1771861 is a reply to message #1771244] |
Thu, 31 August 2017 13:22 |
Estibaliz Amparan Messages: 7 Registered: July 2017 |
Junior Member |
|
|
Hi Christian,
I after some days of research I found this post https://christiandietrich.wordpress.com/2011/07/29/xtend2-code-generators-with-non-xtext-models/. I figured out it was your blog.
This is what I want to reach. I followed your example but I have some errors.
I have my EMF metamodel:
Also I created edit and editor projects:
Then, I created its model (.simulink) extension.
After that I created a new Plugin Project and a new Xtend class called "MaltabcodeGenerator.xtend" with the following code:
package matlab.code.generator.xtend
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.xtext.generator.IGenerator
import org.eclipse.xtext.generator.IFileSystemAccess
import org.eclipse.emf.ecore.EObject
import hu.bme.mit.massif.simulink.SimulinkModel
class MatlabcodeGenerator implements IGenerator {
override void doGenerate(Resource resource, IFileSystemAccess fsa) {
for (EObject o : resource.contents) {
o.compile(fsa)
}
}
def dispatch void compile(SimulinkModel m, IFileSystemAccess fsa) {
fsa.generateFile("Code"+".m", '''
this is the matlabcode ''')
}
def dispatch void compile(EObject m, IFileSystemAccess fsa) { }
}
Next, I created "MatlabcodeGeneratorModule", "MatlabcodeGeneratorSetup" and "MatlabcodeGeneratorSupport" java files.
"MatlabcodeGeneratorModule.java":
package matlab.code.generator.xtend;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.xtext.generator.IGenerator;
import org.eclipse.xtext.resource.generic.AbstractGenericResourceRuntimeModule;
import matlab.code.generator.xtend.MatlabcodeGenerator;
public class MatlabcodeGeneratorModule extends AbstractGenericResourceRuntimeModule {
@Override
protected String getLanguageName(){
return "hu.bme.mit.massif.simulink.presentation.SimulinkEditor";
}
@Override
protected String getFileExtensions(){
return "simulink";//
}
public Class<? extends IGenerator> bindIGenerator() {
return MatlabcodeGenerator.class;
}
public Class<? extends ResourceSet> bindResourceSet(){
return ResourceSetImpl.class;
}
}
"MatlabcodeGeneratorSetup.java"
package matlab.code.generator.xtend;
import org.eclipse.xtext.ISetup;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class MatlabcodeGeneratorSetup implements ISetup{
@Override
public Injector createInjectorAndDoEMFRegistration(){
return Guice.createInjector(new MatlabcodeGeneratorModule());
}
}
"MatlabcodeGeneratorSupport.java"
package matlab.code.generator.xtend;
import org.eclipse.xtext.resource.generic.AbstractGenericResourceSupport;
import com.google.inject.Module;
public class MatlabcodeGeneratorSupport extends AbstractGenericResourceSupport {
@Override
protected Module createGuiceModule() {
return new MatlabcodeGeneratorModule();
}
}
As last step, I created the workflow mwe file.
""MatlabcodeGenerator.mwe2"
module matlab.code.generator.xtend.MatlabcodeGenerator
import org.eclipse.emf.mwe.utils.*
var targetDir = "code-generation"
var modelPath = "model"
Workflow {
bean = StandaloneSetup {
registerGeneratedEPackage = "hu.bme.mit.massif.simulink.SimulinkPackage"
}
component = DirectoryCleaner {
directory = targetDir
}
component = matlab.code.generator.xtend.MatlabcodeGeneratorSupport {}
component = org.eclipse.xtext.mwe.Reader {
path = modelPath
register = matlab.code.generator.xtend.MatlabcodeGeneratorSetup {}
loadResource = {
slot = "code-generation"
}
}
component = org.eclipse.xtext.generator.GeneratorComponent {
register = matlab.code.generator.xtend.MatlabcodeGeneratorSetup {}
slot = 'model'
outlet = {
path = targetDir
}
}
}
This is my workspace view:
Until all these steps everything work fine. Now when I run the workflow I get these errors:
Can you please help me?
Thank you very much!
|
|
|
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.03132 seconds