AbstractDeclarativeValidator.warning和错误应该使用哪些参数?

时间:2013-06-10 14:26:56

标签: xtext eclipse-emf

我在xtext上有一个工作语法,我开始验证代码。

为此,我在为我创建的验证器xtext中添加了一个方法。

当然,当表达式无效时,我希望能够在给定的AST节点上发出警告。

我尝试了显而易见的事实:

@Check
public void testCheck(Expression_Multiplication m){
    if(!(m.getLeft() instanceof Expression_Number)){
        warning("Multiplication should be on numbers.",m.getLeft());
    }
    if(!(m.getRight() instanceof Expression_Number)){
        warning("Multiplication should be on numbers.",m.getRight());
    }
}

没有成功,因为Expression_Number扩展EObject,但不是EStructuralFeature

warning(String message, EStructuralFeature feature)

warning还有许多其他原型,但没有一个只需要StringEobject。使用null或从eContainingFeature中提取的各种值会记录错误,并且有时会在正确的位置显示警告。在搜索示例时,我发现值通常来自名为Literals***Package的类的静态字段,项目中生成的值包含EStructuralFeature s,但我没有想知道哪一个使用,或者为什么我需要其中一个。

所以问题是:

如何在给定的AST元素上发出警告?

2 个答案:

答案 0 :(得分:3)

EStructuralFeature是AST的属性。你会发现一个生成的EPackage类,它包含常量。

我想在你的情况下它是这样的:

MyDslPackage.Literals.EXPRESSION_MULTIPLICATION__LEFT

MyDslPackage.Literals.EXPRESSION_MULTIPLICATION__RIGHT

答案 1 :(得分:1)

我最终使用

private void warning(String text, EObject badAstNode){
    // The -1 seems to come from a static member somewhere. Probably cleaner to
    // name it, but I couldn't find it again.
    warning(text,badAstNode,null,-1);
}

我不知道这是否应该是正确的方式,但它似乎适用于我使用它的各种情况,并且需要保留最少量的状态。