我在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
还有许多其他原型,但没有一个只需要String
和Eobject
。使用null
或从eContainingFeature
中提取的各种值会记录错误,并且有时会在正确的位置显示警告。在搜索示例时,我发现值通常来自名为Literals
或***Package
的类的静态字段,项目中生成的值包含EStructuralFeature
s,但我没有想知道哪一个使用,或者为什么我需要其中一个。
所以问题是:
如何在给定的AST元素上发出警告?
答案 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);
}
我不知道这是否应该是正确的方式,但它似乎适用于我使用它的各种情况,并且需要保留最少量的状态。