【问题标题】:XText w/ XBase - Initialize generated variableXText w/ XBase - 初始化生成的变量
【发布时间】:2014-03-06 20:31:50
【问题描述】:

我正在使用带有 XBase 语法的 Xtext。
在每个生成的 java 类中,我需要在我的模型推断器中初始化类变量。这个变量没有在我的模型中定义,但这没有什么区别。
我已经可以通过函数生成这个变量了

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

,但我无法初始化它。我确定我应该使用带有名为 initializer 的附加参数的 toField 函数,但由于这是 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)
            }
        ]
    }
}

【问题讨论】:

    标签: dsl xtext xtend


    【解决方案1】:

    该过程封装了配置字段所需的代码,例如设置可见性、静态标志、文档或字段初始化器:

    element.toField("isSomethingSet", newTypeRef("boolean")) [
      initializer = '''false''' // with Xtext 2.5 or
      initializer = [ append('false') ] // prior to 2.5
    ]
    

    【讨论】:

    • 如果你有一个XExpression类型的属性,你可以直接把它赋值给initializer,例如initializer = element.initValue
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2012-08-23
    • 2021-07-07
    • 2014-09-08
    相关资源
    最近更新 更多