Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » TMF (Xtext) » How to use xtext and xpand together
How to use xtext and xpand together [message #1066062] Sat, 29 June 2013 16:32 Go to next message
psilos panipsilos is currently offline psilos panipsilosFriend
Messages: 23
Registered: June 2013
Junior Member
Hi guys,

I am a bit confused of how to use xtext and xpand together.

I have created a simple dsl using xtext. Then I have also tried xpand (create a meta-model, some models and generate template code).

Now i want to create dsl models and let xpand generate the code using my template. There are lot of tutorials on the web saying how to do that in a simple way.

http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.xtext.doc%2Fhelp%2Fgetting-started-xpand.html

However the problem is that I don`t have the same project structure. I read some similar topics in the forum :

http://www.eclipse.org/forums/index.php/m/891578/?srch=xtext+and+xpand#msg_891578

http://www.eclipse.org/forums/index.php/m/1061151/?srch=xtext+and+xpand#msg_1061151

It seems that I use a newer version of xtext. I managed to generate the org.xtext.example.mydsl.generator package which includes the MyDslGenerator.xtend. However I am not sure how to use the xtend generator.

Ideally I would like to have the generator.mwe file to generate the code for me. So is there a way to use xtext and xpand or shall i use xtend instead?

Any suggestions? Thank you
  • Attachment: Capture.PNG
    (Size: 17.49KB, Downloaded 167 times)
Re: How to use xtext and xpand together [message #1066063 is a reply to message #1066062] Sat, 29 June 2013 16:38 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14716
Registered: July 2009
Senior Member
Hi,

it is possible to use xtext with xpand. Xtexts Reader componet can be used to load stuff to a slot and let then the XpandComponent work on this stuff.
you can (can maybe should) you the new xtend.

you can change the GeneratorFragment in the language workflow to generate you an initial mwe workflow.

~Christian


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: How to use xtext and xpand together [message #1066066 is a reply to message #1066063] Sat, 29 June 2013 17:09 Go to previous messageGo to next message
psilos panipsilos is currently offline psilos panipsilosFriend
Messages: 23
Registered: June 2013
Junior Member
Hi Christian , thank you for your quick reply.

Quote:
you can change the GeneratorFragment in the language workflow to generate you an initial mwe workflow.


Could you please tell me how to do that? Sorry but I am really new to xtext and xpand.

Currently my generator looks like the following:

module org.xtext.example.mydsl1.GenerateMyDsl

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

var grammarURI = "classpath:/org/xtext/example/mydsl1/MyDsl.xtext"
var fileExtensions = "mydsl1"
var projectName = "org.xtext.example.mydsl1"
var runtimeProject = "../${projectName}"
var generateXtendStub = true

Workflow {
    bean = StandaloneSetup {
    	scanClassPath = true
    	platformUri = "${runtimeProject}/.."
    	// The following two lines can be removed, if Xbase is not used.
    	registerGeneratedEPackage = "org.eclipse.xtext.xbase.XbasePackage"
    	registerGenModelFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel"
    }
    
    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 = auto-inject {
    		uri = grammarURI
    
    		// Java API to access grammar elements (required by several other fragments)
    		fragment = grammarAccess.GrammarAccessFragment auto-inject {}
    
    		// generates Java API for the generated EPackages
    		fragment = ecore.EcoreGeneratorFragment auto-inject {
    		// referencedGenModels = "
    		//  platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel,
    		//  platform:/resource/org.eclipse.xtext.common.types/model/JavaVMTypes.genmodel
    		// "
    		}
    
    		// the old serialization component
    		// fragment = parseTreeConstructor.ParseTreeConstructorFragment auto-inject {}    
    
    		// serializer 2.0
    		fragment = serializer.SerializerFragment auto-inject {
    			generateStub = false
    		}
    
    		// a custom ResourceFactory for use with EMF
    		fragment = resourceFactory.ResourceFactoryFragment auto-inject {}
    
    		// The antlr parser generator fragment.
    		fragment = parser.antlr.XtextAntlrGeneratorFragment auto-inject {
    		//  options = {
    		//      backtrack = true
    		//  }
    		}
    
    		// Xtend-based API for validation
    		fragment = validation.ValidatorFragment auto-inject {
    		//    composedCheck = "org.eclipse.xtext.validation.ImportUriValidator"
    		//    composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
    		}
    
    		// old scoping and exporting API
    		// fragment = scoping.ImportURIScopingFragment auto-inject {}
    		// fragment = exporting.SimpleNamesFragment auto-inject {}
    
    		// scoping and exporting API
    		fragment = scoping.ImportNamespacesScopingFragment auto-inject {}
    		fragment = exporting.QualifiedNamesFragment auto-inject {}
    		fragment = builder.BuilderIntegrationFragment auto-inject {}
    
    		// generator API
    		fragment = generator.GeneratorFragment auto-inject {}
    
    		// formatter API
    		fragment = formatting.FormatterFragment auto-inject {}
    
    		// labeling API
    		fragment = labeling.LabelProviderFragment auto-inject {}
    
    		// outline API
    		fragment = outline.OutlineTreeProviderFragment auto-inject {}
    		fragment = outline.QuickOutlineFragment auto-inject {}
    
    		// quickfix API
    		fragment = quickfix.QuickfixProviderFragment auto-inject {}
    
    		// content assist API
    		fragment = contentAssist.ContentAssistFragment auto-inject {}
    
    		// generates a more lightweight Antlr parser and lexer tailored for content assist
    		fragment = parser.antlr.XtextAntlrUiGeneratorFragment auto-inject {}
    
    		// generates junit test support classes into Generator#pathTestProject
    		fragment = junit.Junit4Fragment auto-inject {}
    
    		// project wizard (optional)
    		// fragment = projectWizard.SimpleProjectWizardFragment auto-inject {
    		//      generatorProjectName = "${projectName}"
    		// }
    
    		// rename refactoring
    		fragment = refactoring.RefactorElementNameFragment auto-inject {}
    
    		// provides the necessary bindings for java types integration
    		fragment = types.TypesGeneratorFragment auto-inject {}
    
    		// generates the required bindings only if the grammar inherits from Xbase
    		fragment = xbase.XbaseGeneratorFragment auto-inject {}
    
    		// provides a preference page for template proposals
    		fragment = templates.CodetemplatesGeneratorFragment auto-inject {}
    
    		// provides a compare view
    		fragment = compare.CompareFragment auto-inject {}
    	}
    }
}

Re: How to use xtext and xpand together [message #1066068 is a reply to message #1066066] Sat, 29 June 2013 17:26 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14716
Registered: July 2009
Senior Member
fragment = generator.GeneratorFragment auto-inject {
generateMwe = true
}


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: How to use xtext and xpand together [message #1066069 is a reply to message #1066068] Sat, 29 June 2013 17:48 Go to previous messageGo to next message
psilos panipsilos is currently offline psilos panipsilosFriend
Messages: 23
Registered: June 2013
Junior Member
Christian, thank you again for your quick response.

I managed to generate the mwe workflow. I hope that I ll be configure the xpand generator.

I will try it tomorrow and let you know if I have any more issues.

Cheers,
psilos
Re: How to use xtext and xpand together [message #1066174 is a reply to message #1066069] Mon, 01 July 2013 12:09 Go to previous messageGo to next message
psilos panipsilos is currently offline psilos panipsilosFriend
Messages: 23
Registered: June 2013
Junior Member
Christian is there a way to generate the: org.xtext.example.domainmodel.generator project?

Just like in the following tutorial?

http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.xtext.doc%2Fhelp%2Fgetting-started-xpand.html

Shall i add anything to the GeneratorEntity.mwe2 file?

Ultimately I am trying to create a simple DSL and let the users generate code directly out of the dsl model that they create.

I am following the following tutorial: http://www.peterfriese.de/getting-started-with-xtext-part-2/

I am stuck at two points:

1) How to integrate xpand in my xtext project
2) How to create a plugin for my dsl , so that users can create their models and then directly generate code.

If you know any other tutorials , please let me know.

Thank you
Re: How to use xtext and xpand together [message #1066181 is a reply to message #1066174] Mon, 01 July 2013 12:30 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14716
Registered: July 2009
Senior Member
Nope you have to digging yourself.

--
Need training, onsite consulting or any other kind of help for Xtext?
Go visit http://xtext.itemis.com or send a mail to xtext at itemis dot de


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: How to use xtext and xpand together [message #1066236 is a reply to message #1066181] Mon, 01 July 2013 15:56 Go to previous messageGo to next message
psilos panipsilos is currently offline psilos panipsilosFriend
Messages: 23
Registered: June 2013
Junior Member
I think I made some progress regarding the entityGeneratorMWE.mwe2 file.

However, when I run the generator I run into the following exception:

0    [main] ERROR        org.eclipse.xpand2.Generator  - Error in Component  of type org.eclipse.xpand2.Generator: 
	EvaluationException : No Definition 'src::org::xtext::example::templates::Main::main for Object' found! Maybe your forgot to configure the correct meta model in the workflow?
	[23,68] on line 1 'EXPAND src::org::xtext::example::templates::Main::main FOREACH model'

2    [main] ERROR mf.mwe2.launch.runtime.Mwe2Launcher  - Problems running workflow org.xtext.example.generator.EntityGeneratorMWE: No Definition 'src::org::xtext::example::templates::Main::main for Object' found! Maybe your forgot to configure the correct meta model in the workflow?
java.lang.RuntimeException: Problems running workflow org.xtext.example.generator.EntityGeneratorMWE: No Definition 'src::org::xtext::example::templates::Main::main for Object' found! Maybe your forgot to configure the correct meta model in the workflow?
	at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:104)
	at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:62)
	at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:52)
	at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.run(Mwe2Launcher.java:74)
	at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.main(Mwe2Launcher.java:35)
Caused by: org.eclipse.emf.mwe.core.WorkflowInterruptedException: No Definition 'src::org::xtext::example::templates::Main::main for Object' found! Maybe your forgot to configure the correct meta model in the workflow?
	at org.eclipse.xtend.expression.AbstractExpressionsUsingWorkflowComponent.invokeInternal(AbstractExpressionsUsingWorkflowComponent.java:239)
	at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:126)
	at org.eclipse.emf.mwe.core.lib.Mwe2Bridge.invoke(Mwe2Bridge.java:34)
	at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:201)
	at org.eclipse.emf.mwe2.runtime.workflow.AbstractCompositeWorkflowComponent.invoke(AbstractCompositeWorkflowComponent.java:35)
	at org.eclipse.emf.mwe2.runtime.workflow.Workflow.run(Workflow.java:19)
	at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:102)
	... 4 more


does this mean that generator cannot load template Main.xpt file?

My generator looks like this and I have also attached the project structure:

module org.xtext.example.generator.EntityGeneratorMWE

import org.eclipse.emf.mwe.utils.*

var targetDir = 'src-gen'

// F change to my model path
var modelPath = 'src/org/xtext/example/model/MyModel.entity'


Workflow {

	
	//F Change to UriBasedReader cause of zipexception
	component = org.eclipse.xtext.mwe.UriBasedReader {
		
		// lookup all resources on the classpath
		// useJavaClassPath = true

		// or define search scope explicitly
		//F change to uri instead of path cause of the UriBasedReader
		uri = "src/org/xtext/example/model/MyModel.entity"
//		path = modelPath

		// this class will be generated by the xtext generator 
		register = org.xtext.example.EntityStandaloneSetup {}
		loadResource = {
			slot = "model"
		}
	}
	
	component = org.eclipse.xpand2.Generator {
		metaModel = org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel {}
		//F change FOR to FOREACH
		expand =  'src::org::xtext::example::templates::Main::main FOREACH model'
		outlet = {
			path = targetDir
			postprocessor = org.eclipse.xpand2.output.JavaBeautifier {}
		}
	}

	component = org.eclipse.xtext.generator.GeneratorComponent {
		
		register = org.xtext.example.EntityStandaloneSetup {}
		slot = 'model'
		outlet = {
			path = targetDir 
		
		}
	}
}

  • Attachment: Capture.PNG
    (Size: 16.71KB, Downloaded 147 times)
Re: How to use xtext and xpand together [message #1066238 is a reply to message #1066236] Mon, 01 July 2013 16:09 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14716
Registered: July 2009
Senior Member
Hi

id use javabeansmetamodel


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: How to use xtext and xpand together [message #1066242 is a reply to message #1066238] Mon, 01 July 2013 16:41 Go to previous messageGo to next message
psilos panipsilos is currently offline psilos panipsilosFriend
Messages: 23
Registered: June 2013
Junior Member
Christian thank you for your reply. However as I mentioned , I am a beginner in xtext and would appreciate if you could provide some more information in your reply.

Where should i use the JavaBeansMetaModel? I guess in the component = org.eclipse.xpand2.Generator , right?

I couldn`find how to use it as an value in the "id" parameter.

Do you mean that I need to replace the EMFRegistryMetaModel with the JavaBeansMetaModel like this:

component = org.eclipse.xpand2.Generator {
		metaModel = org.eclipse.internal.xtend.type.impl.java.JavaBeansMetaModel{}
		
		//F change FOR to FOREACH
		expand =  'src::org::xtext::example::templates::Main::main FOREACH model'
		outlet = {
			path = targetDir
			postprocessor = org.eclipse.xpand2.output.JavaBeautifier {}
		}
	}


However in this case I get another error :

EvaluationException : No Definition 'src::org::xtext::example::templates::Main::main for org::eclipse::xtext::linking::lazy::LazyLinkingResource' found!


Thank you

Re: How to use xtext and xpand together [message #1066253 is a reply to message #1066242] Mon, 01 July 2013 17:43 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14716
Registered: July 2009
Senior Member
Hi,

i thought you know xpand
here is what works with the greeting example

module org.xtext.example.mydsl.generator.MyDslGeneratorMWE

import org.eclipse.emf.mwe.utils.*

var modelPath = "model"

Workflow {

	component = org.eclipse.xtext.mwe.Reader {
		// lookup all resources on the classpath
		// useJavaClassPath = true

		// or define search scope explicitly
		path = modelPath

		// this class will be generated by the xtext generator 
		register = org.xtext.example.mydsl.MyDslStandaloneSetup {}
		loadResource = {
			slot = "model"
		}
	}

	component = org.eclipse.xpand2.Generator {
		expand = "org::xtext::example::mydsl::generator::Main::main FOREACH model"
		
		outlet = {
			path = "xpand-gen"
		}
	}
}


«DEFINE main FOR org::eclipse::emf::ecore::resource::Resource»
«FILE URI.lastSegment()+".txt"»
«EXPAND main FOREACH contents»
«ENDFILE»
«ENDDEFINE»

«DEFINE main FOR org::xtext::example::mydsl::myDsl::Model»
«FOREACH greetings AS g»
Here we go «g.name»!
«ENDFOREACH»
«ENDDEFINE»


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: How to use xtext and xpand together [message #1066264 is a reply to message #1066062] Mon, 01 July 2013 19:03 Go to previous messageGo to next message
psilos panipsilos is currently offline psilos panipsilosFriend
Messages: 23
Registered: June 2013
Junior Member
Hi,

I tried your code bit I have the following problems:

1) In the template file there is the error in line 4: "Couldn't find definition main for type org::eclipse::emf::ecore::EObject" in the line 4

«DEFINE main FOR org::eclipse::emf::ecore::resource::Resource»
«FILE URI.lastSegment()+".txt"»

«EXPAND main FOREACH contents»
«ENDFILE»
«ENDDEFINE»

«DEFINE main FOR org::xtext::example::mydsl::myDsl::Model»
«FOREACH greetings AS g»
Here we go «g.name»!
«ENDFOREACH»
«ENDDEFINE»


I use the UriBasedReader instead of the normal reader cause i get a zipException.

Any tips regarding those 2 issues?

Thank you very much

2) In the generator I still receive the following error :

0    [main] INFO         org.eclipse.xpand2.Generator  - No meta models configured, using JavaBeans as default.
292  [main] ERROR        org.eclipse.xpand2.Generator  - Error in Component  of type org.eclipse.xpand2.Generator: 
	EvaluationException : No Definition 'org::xtext::example::mydsl::generator::Main::main for org::eclipse::xtext::linking::lazy::LazyLinkingResource' found!
	[23,70] on line 1 'EXPAND org::xtext::example::mydsl::generator::Main::main FOREACH model'

292  [main] ERROR mf.mwe2.launch.runtime.Mwe2Launcher  - Problems running workflow org.xtext.example.mydsl.generator.MyDslGeneratorMWE: No Definition 'org::xtext::example::mydsl::generator::Main::main for org::eclipse::xtext::linking::lazy::LazyLinkingResource' found!
java.lang.RuntimeException: Problems running workflow org.xtext.example.mydsl.generator.MyDslGeneratorMWE: No Definition 'org::xtext::example::mydsl::generator::Main::main for org::eclipse::xtext::linking::lazy::LazyLinkingResource' found!
	at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:104)
	at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:62)
	at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:52)
	at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.run(Mwe2Launcher.java:74)
	at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.main(Mwe2Launcher.java:35)
Caused by: org.eclipse.emf.mwe.core.WorkflowInterruptedException: No Definition 'org::xtext::example::mydsl::generator::Main::main for org::eclipse::xtext::linking::lazy::LazyLinkingResource' found!
	at org.eclipse.xtend.expression.AbstractExpressionsUsingWorkflowComponent.invokeInternal(AbstractExpressionsUsingWorkflowComponent.java:239)
	at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:126)
	at org.eclipse.emf.mwe.core.lib.Mwe2Bridge.invoke(Mwe2Bridge.java:34)
	at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:201)
	at org.eclipse.emf.mwe2.runtime.workflow.AbstractCompositeWorkflowComponent.invoke(AbstractCompositeWorkflowComponent.java:35)
	at org.eclipse.emf.mwe2.runtime.workflow.Workflow.run(Workflow.java:19)
	at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:102)
	... 4 more


My generator looks like yours:

module org.xtext.example.mydsl.generator.MyDslGeneratorMWE

import org.eclipse.emf.mwe.utils.*

var targetDir = 'src-gen'
var modelPath = 'src/org/xtext/example/mydsl/model/MyModel.hello'

Workflow {

	component = org.eclipse.xtext.mwe.UriBasedReader {
		// lookup all resources on the classpath
		// useJavaClassPath = true

		// or define search scope explicitly
		uri = "src/org/xtext/example/mydsl/model/MyModel.hello"
		//path = modelPath

		// this class will be generated by the xtext generator 
		register = org.xtext.example.mydsl.MyDslStandaloneSetup {}
		loadResource = {
			slot = "model"
		}
	}
	
	component = org.eclipse.xpand2.Generator {
		expand = "org::xtext::example::mydsl::generator::Main::main FOREACH model"
		
		outlet = {
			path = targetDir
		}
	}


I use UriBasedReader instead of the normal Reader cause I get a ZipException.

Any tips of how to resolve those two issues?
Thank you very much
Re: How to use xtext and xpand together [message #1066266 is a reply to message #1066264] Mon, 01 July 2013 19:10 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14716
Registered: July 2009
Senior Member
Hi,

(1) you have to configure javabeansmetamodel in projects xtend/xpand properties.
which xpand version? depending on which (stoneage old) you may have to define JavaBeansMetamodel explicitely
(2) i have no idea why it does not work with a proper template (i put all right next to the generated mwe file in org.xtext.example.mydsl project)
(3) what kind of error do you get with uribasedreader. why do you want to use it at all.


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: How to use xtext and xpand together [message #1066267 is a reply to message #1066266] Mon, 01 July 2013 19:13 Go to previous messageGo to next message
Christian Dietrich is currently offline Christian DietrichFriend
Messages: 14716
Registered: July 2009
Senior Member
btw why expand = 'src::org::xtext::example::templates::Main::main FOREACH model'
and not

expand = 'org::xtext::example::templates::Main::main FOREACH model'


Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
Re: How to use xtext and xpand together [message #1066273 is a reply to message #1066062] Mon, 01 July 2013 20:02 Go to previous message
psilos panipsilos is currently offline psilos panipsilosFriend
Messages: 23
Registered: June 2013
Junior Member
Christian,

thank you for all your support.

However, I switched to xtend. I think that I managed to get xtend to work . So I quit xpand ,I have already lost enough time trying to configure it and got really tired.

If I really need to configure xpand I ll let you know.

Thank you.

Previous Topic:Duplicate methodes in generated SemanticSequencer
Next Topic:suppress generation of .gitignore by Xtend
Goto Forum:
  


Current Time: Wed Sep 25 13:43:43 GMT 2024

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

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

Back to the top