|
|
Re: Bind JVM object reference to a grammar element [message #1699849 is a reply to message #1699838] |
Sat, 27 June 2015 06:47 |
|
maybe
grammar org.xtext.example.mydsl1.MyDsl with org.eclipse.xtext.xbase.Xbase
generate myDsl "http://www.xtext.org/example/mydsl1/MyDsl"
import "http://www.eclipse.org/xtext/common/JavaVMTypes" as types
import "http://www.eclipse.org/xtext/xbase/Xbase" as xbase
Model:
imports=XImportSection?
elements+=Element*;
Element:
'element' name=ID '{'
thingys+=Thingy*
'}';
Thingy:
type=NonQualifiedJvmParameterizedTypeReference body=XReducedFeatureCall";"
;
NonQualifiedJvmParameterizedTypeReference returns types::JvmParameterizedTypeReference:
type=[types::JvmType|ValidID] (
=>'<' arguments+=JvmArgumentTypeReference (',' arguments+=JvmArgumentTypeReference)* '>'
(=>({JvmInnerTypeReference.outer=current} '.') type=[types::JvmType|ValidID] (=>'<' arguments+=JvmArgumentTypeReference (',' arguments+=JvmArgumentTypeReference)* '>')?)*
)?;
XReducedFeatureCall returns xbase::XExpression:
{xbase::XFeatureCall}"."
feature=[types::JvmIdentifiableElement|IdOrSuper]
(=>explicitOperationCall?='('
(
featureCallArguments+=XShortClosure
| featureCallArguments+=XExpression (',' featureCallArguments+=XExpression)*
)?
')')?;
class MyDslJvmModelInferrer extends AbstractModelInferrer {
@Inject extension JvmTypesBuilder
def dispatch void infer(Element element, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
acceptor.accept(element.toClass("test."+element.name)) [
var counter = 0
for (t : element.thingys) {
members += t.toMethod("thingy"+counter++,Void.TYPE.typeRef) [
parameters += t.toParameter("it", t.type)
body = t.body
]
}
]
}
}
you have to adapt XExpressionHelper regarding has side effect
Twitter : @chrdietrich
Blog : https://www.dietrich-it.de
|
|
|
Powered by
FUDForum. Page generated in 0.02919 seconds