如何访问更高规则的方法?

时间:2015-05-23 19:55:45

标签: xtext xtend

在编写验证规则期间,我遇到了一个问题,即我需要一些来自语法规则的内容,该规则的层次结构高于我传递给validationMethod的规则。
我知道我可以用.eContainer引用一个“更高”的规则但是我不知道如何访问我想要的值。

例如,我有以下语法片段:

{{1}}

如果我有一个带有参数rule1的正常validationMethod,那么我可以通过.name访问该名称,但是当我将rule2作为参数,然后通过.eConatiner引用规则时,.name方法不存在。

问候Krzmbrzl

2 个答案:

答案 0 :(得分:1)

EObject是所有AST节点类的根类。它来自EMF Ecore框架,Xtext使用它来生成AST实现。因此,EObject类包含许多树结构特征,例如,遍历树。 EObject.eContainer()方法返回一个EObject类型的元素,它实际上是实际返回对象类型的超类型。要访问下一个更高元素的方法,您必须转换eContainers方法结果,如下所示:

@Check
public void check(rule2 r2) {
    EObject o = r2.eContainer();
    rule1 r1 = (rule1) o;
    String r1Name = r1.getName();
}

如果父对象的类型是不明确的,您应该测试实际类型是否是带有instanceof表达式的预期类型:

@Check
public void check(rule2 r2) {
    EObject o = r2.eContainer();
    if (o instanceof rule1) {
        rule1 r1 = (rule1) o;
        String r1Name = r1.getName();
    }
}

答案 1 :(得分:1)

Xtend提供与Java相同的instanceof-expression。但是如果要检查的对象可以有多种类型,那么你可以使用Xtends真正强大的切换表达式。它支持所谓的类型保护。您可以切换任何对象而不是case value:警卫只需编写具体类型:

switch (anyAbstractTypeObject) {
    ConcreteSubtypeA: {...}
    ConcreteSubtypeB: {...}
}

这是一个优雅的简写if-instanceof-eleseif -...在Xtend中。