Before you can start, you need to install the following features:
Altenatively you may install the Xtend Backend SDK and Xpand Middleend SDK
As a quickstart you may use the Xpand Project wizard and select "Generate a sample EMF based Xpand project". After completion of the wizard you will find the workflow file "generatorWithBackend.mwe" in the "workflow"-folder. The workflow is ready to use the backend for generation.
Before you can use a language like Xpand with the backend, the
responsible middleend must be registered at the backend. This is done
with the org.eclipse.xtend.middleend.LanguageSetup
.
Middleends are being called a languageContributor
here. You can register any language specific middleend. Language
specific middleend implement the interface
org.eclipse.xtend.middleend.plugins.LanguageSpecificMiddleEnd
. To register the Xpand, Xtend and Check middleends, do the
following in the workflow before invoking the middleend component of
any of the respective languages:
<component class="org.eclipse.xtend.middleend.LanguageSetup"> <languageContributor value="org.eclipse.xtend.middleend.xtend.plugin.OldXtendRegistryFactory"/> <languageContributor value="org.eclipse.xtend.middleend.xtend.plugin.OldCheckRegistryFactory"/> <languageContributor value="org.eclipse.xtend.middleend.xpand.plugin.OldXpandRegistryFactory"/> </component>
Now that the middleends are registered, you can use the respective middleend workflow components to use the backend in interpreted mode.
The Xpand middleend introduces a new component to be used instead of
org.eclipse.xpand2.Generator
to call Xpand templates from a workflow. The component has the same
parameters as the Xpand Generator
component. Hence, the following workflow fragment calls the template
template::Template::main
:
<component class="org.eclipse.xtend.middleend.xpand.XpandComponent"> <metaModel idRef="mm_emf"/> <expand value="template::Template::main FOR model" /> <outlet path="${src-gen}" > <postprocessor class="org.eclipse.xpand2.output.JavaBeautifier" /> </outlet> </component>
The component supports all properties of Generator
,
except collectProfileSummary
and
verboseProfileFilename
Just as the Xpand middleend, the Check middleend also provides a new component
to execute checks on the backend. The component
org.eclipse.xtend.check.CheckComponent
has to be replaced with org.eclipse.xtend.middleend.xtend.CheckComponent
. The new component uses the same properties as
org.eclipse.xtend.check.CheckComponent
.
Hence calling checks using the backend would look like this:
<component class="org.eclipse.xtend.middleend.xtend.CheckComponent"> <metaModel idRef="mm_emf"/> <checkFile value="metamodel::Checks" /> <emfAllChildrenSlot value="model"/> </component>
To invoke Xtend extensions from the workflow, the Xtend middleend
introduces the new component
org.eclipse.xtend.middleend.xtend.XtendComponent
. The new component provides the same configuration
properties as the old one. Hence, you may invoke the extension
extensions::modification::modify
using the following workflow fragment:
>component class="org.eclipse.xtend.middleend.xtend.XtendComponent"> >metaModel idRef="mm_emf"/> >invoke value="extensions::modification::modify(model)"/> >/component>
Functions may also be contributed by the Java Annotations Middleend
to the M2T Backend. The middleend is implemented by
org.eclipse.xtend.middleend.javaannotations.JavaFunctionClassContributor
. Registration of Java classes is done by calling the method
classAsResource
with a class.
Functions have qualified names in the backend represented by
org.eclipse.xtend.backend.common.QualifiedName
consisting of a namespace and a simple name. E.g. the Xpand
definition template::Template::main
has the namespace template::Template
and the simple name main
. The String representation
of the QualifiedName would be template::Template::main
.
When registering Java Defined Functions, normally only the simple
name of a function will be defined as it's name. The simple name is method name.
To set the qualified name of a function use the annotation
@M2tQualifiedName
. The namespace will be
derived from the fully qualified class name.
Per default, all public methods will be registered as functions. To
prevent the registration of a method, annotate it with
@M2tNoFunction
.
You may also use one of the following annotations:
@M2tCached
- use caching
@M2tPrivateFunction
- mark the function as private
@M2tAroundAdvice(pointcut)
- use the method as around advice. The pointcut has the
parameters:
namePattern
- a pattern for function names as in Xpand
paramTypeNames
- an array with patterns of parameter type names
hasVarArgs
- true, if the matching functions have any number of
parameters after paramTypeNames
the specified in the pointcut
Functions defined by methods of a Java class can be directly called
on the facade
org.eclipse.xtend.middleend.javaannotations.JavaAnnotationBackendFacade
. Call the method invoke to invoke functions defined in Java:
invokeFunction(String className, BackendTypesystem ts, QualifiedName functionName, List<?> params)