检查Xtend验证器中的类型

时间:2015-10-27 07:23:51

标签: java validation xtext xtend

我想检查Xtend验证器中的功能类型。

Xtext语法如下所示:

Element:
    'Element' name=ID
    'feature' feature=DOUBLE
    'end' 'Element'
;

这是如何使用的:

Element MyElement
    feature 2.5
end Element

如果INTEGER尝试使用DOUBLE值代替feature,编辑器会显示错误:

  

不匹配的输入'84900'期待RULE_DOUBLE

我想覆盖这条消息。因此,我在验证器中创建了一个验证方法。在方法中,我想检查功能的类型。这就是我想要做的事情:

@Check
def checkFeatureType(Element element) {
    if (element.feature instanceof Double) {
        // shows error!
    }
}

instanceof检查显示以下错误:

  

不兼容的条件操作数类型double或Double和Double      或加倍

如何执行类型检查或是否有更好的方法来覆盖上述标准消息?

2 个答案:

答案 0 :(得分:1)

要覆盖解析器生成的消息,您需要专门化org.eclipse.xtext.parser.antlr.ISyntaxErrorMessageProvider并在您的语言的运行时模块中绑定您自己的实现。

答案 1 :(得分:0)

感谢Sebastian,我找到了解决方案。

首先,有必要向SyntaxErrorMessageProvider添加RuntimeModule,其名称为<LanguageName>RuntimeModule。如果在我的开场白中给出了示例,则为MyLanguageRuntimeModule

public class MyLanguageRuntimeModule extends my.language.AbstractMyLanguageRuntimeModule {
    public Class<? extends org.eclipse.xtext.generator.IGenerator> bindIGenerator() {
        return my.language.generator.MyLanguageGenerator.class;
    }

    public Class<? extends ISyntaxErrorMessageProvider> bindISyntaxErrorMessageProvider() {
        return MyLanguageSyntaxErrorMessageProvider.class;
    }
}

之后,应该创建新类。在我的例子中,班级名称是MyLanguageSyntaxErrorMessageProvider.java。然后应该用逻辑填充这个类。例如,要覆盖我在第一篇文章中提到的消息,getSyntaxErrorMessage()中的MyLanguageSyntaxErrorMessageProvider可能如下所示:

@Override
public SyntaxErrorMessage getSyntaxErrorMessage(IParserErrorContext context) {
    if (context.getRecognitionException() instanceof MismatchedTokenException) {
        MismatchedTokenException exception = (MismatchedTokenException) context.getRecognitionException();
        String value = exception.token.getText();
        return new SyntaxErrorMessage("The type of " + value + " is wrong.", IssueCodes.FALSE_PARAMETER_TYPE);
    }
    // additional implementations
    return null;
}

我的班级IssueCodes.java如下所示(可以使用其他问题代码进行扩展):

public interface IssueCodes {
    String PREFIX = "my.language.";

    String UNCAPITALIZED_ENTITY_NAME = "UncapitalizedEntityName";
    String FALSE_PARAMETER_TYPE = "FalseParameterType";
}