在编写验证规则期间,我遇到了一个问题,即我需要一些来自语法规则的内容,该规则的层次结构高于我传递给validationMethod的规则。
我知道我可以用.eContainer引用一个“更高”的规则但是我不知道如何访问我想要的值。
例如,我有以下语法片段:
{{1}}
如果我有一个带有参数rule1的正常validationMethod,那么我可以通过.name访问该名称,但是当我将rule2作为参数,然后通过.eConatiner引用规则时,.name方法不存在。
问候Krzmbrzl
答案 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中。