XText с XBase — инициализировать сгенерированную переменную

Я использую Xtext с грамматикой XBase.
В каждом сгенерированном классе Java мне нужно инициализировать переменную класса в моем выводе модели. Эта переменная не определена в моей модели, но это не имеет значения.
Я уже могу сгенерировать эту переменную через функцию

element.toField("isSomethingSet", newTypeRef("boolean"))

, но я не могу его инициализировать. Я уверен, что мне следует использовать функцию toField с дополнительным параметром, называемым initializer, но поскольку это тип Procedure1, я не знаю, как это сделать. используй это.

Вот мой слегка измененный пример, взятый из документации Xtext. Грамматика:

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.xbase.Xbase
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
Domainmodel:
  (elements += AbstractElement)*; 
AbstractElement:
   Entity;
Entity:
  'entity' name = ID ('extends' superType = JvmTypeReference)?
  '{'
    (features += Feature)*
  '}';
Feature:
  name = ID ':' type = JvmTypeReference;

ModelInferrer.xtend

import com.google.inject.Inject
import org.eclipse.xtext.naming.IQualifiedNameProvider
import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer
import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor
import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder
import org.xtext.example.mydsl.myDsl.Entity

class MyDslJvmModelInferrer extends AbstractModelInferrer {

    @Inject extension JvmTypesBuilder

    @Inject extension IQualifiedNameProvider

    def dispatch void infer(Entity element, IJvmDeclaredTypeAcceptor acceptor,
        boolean isPrelinkingPhase) {
        acceptor.accept(element.toClass(element.fullyQualifiedName)).initializeLater     [
            documentation = element.documentation
            members += element.toField("isSomethingSet", newTypeRef("boolean"))
            for (feature : element.features) {
                members += feature.toField(feature.name, feature.type)
                members += feature.toSetter(feature.name, feature.type)
                members += feature.toGetter(feature.name, feature.type)
            }
        ]
    }
}

person borism    schedule 06.03.2014    source источник


Ответы (1)


Процедура инкапсулирует код, необходимый для настройки поля, например. установите видимость, статические флаги, документацию или инициализатор поля:

element.toField("isSomethingSet", newTypeRef("boolean")) [
  initializer = '''false''' // with Xtext 2.5 or
  initializer = [ append('false') ] // prior to 2.5
]
person Sebastian Zarnekow    schedule 06.03.2014
comment
И если у вас есть свойство типа XExpression, вы можете присвоить его непосредственно initializer, например, initializer = element.initValue - person Davor Cubranic; 06.04.2016