在 Xtend 验证器中检查类型
Check type in Xtend validator
我想检查我的 Xtend 验证器中的功能类型。
Xtext 语法如下所示:
Element:
'Element' name=ID
'feature' feature=DOUBLE
'end' 'Element'
;
它是这样使用的:
Element MyElement
feature 2.5
end Element
如果尝试对 feature
使用 INTEGER
值而不是 DOUBLE
,编辑器会显示错误:
mismatched input '84900' expecting RULE_DOUBLE
我想覆盖消息。因此,我在我的验证器中创建了一个验证方法。在方法中,我想检查功能的类型。这就是我想要做的:
@Check
def checkFeatureType(Element element) {
if (element.feature instanceof Double) {
// shows error!
}
}
instanceof
检查显示以下错误:
Incompatible conditional operand types double or Double and Double
or double
如何执行类型检查或是否有更好的方法来覆盖上述标准消息?
要覆盖解析器生成的消息,您需要专门化 org.eclipse.xtext.parser.antlr.ISyntaxErrorMessageProvider
并在您的语言的运行时模块中绑定您自己的实现。
感谢塞巴斯蒂安,我找到了解决方案。
首先,需要在RuntimeModule
中添加一个SyntaxErrorMessageProvider
,其名称为<LanguageName>RuntimeModule
。对于我开头 post 中给出的示例,它将是 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;
}
}
之后,应该创建新的 class。在我的例子中,class 名称是 MyLanguageSyntaxErrorMessageProvider.java
。这个 class 然后应该充满逻辑。例如,要覆盖我在第一个 post 中提到的消息,MyLanguageSyntaxErrorMessageProvider
中的 getSyntaxErrorMessage()
可能如下所示:
@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;
}
我的 class IssueCodes.java
如下所示(并且可以使用其他问题代码进行扩展):
public interface IssueCodes {
String PREFIX = "my.language.";
String UNCAPITALIZED_ENTITY_NAME = "UncapitalizedEntityName";
String FALSE_PARAMETER_TYPE = "FalseParameterType";
}
我想检查我的 Xtend 验证器中的功能类型。
Xtext 语法如下所示:
Element:
'Element' name=ID
'feature' feature=DOUBLE
'end' 'Element'
;
它是这样使用的:
Element MyElement
feature 2.5
end Element
如果尝试对 feature
使用 INTEGER
值而不是 DOUBLE
,编辑器会显示错误:
mismatched input '84900' expecting RULE_DOUBLE
我想覆盖消息。因此,我在我的验证器中创建了一个验证方法。在方法中,我想检查功能的类型。这就是我想要做的:
@Check
def checkFeatureType(Element element) {
if (element.feature instanceof Double) {
// shows error!
}
}
instanceof
检查显示以下错误:
Incompatible conditional operand types double or Double and Double or double
如何执行类型检查或是否有更好的方法来覆盖上述标准消息?
要覆盖解析器生成的消息,您需要专门化 org.eclipse.xtext.parser.antlr.ISyntaxErrorMessageProvider
并在您的语言的运行时模块中绑定您自己的实现。
感谢塞巴斯蒂安,我找到了解决方案。
首先,需要在RuntimeModule
中添加一个SyntaxErrorMessageProvider
,其名称为<LanguageName>RuntimeModule
。对于我开头 post 中给出的示例,它将是 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;
}
}
之后,应该创建新的 class。在我的例子中,class 名称是 MyLanguageSyntaxErrorMessageProvider.java
。这个 class 然后应该充满逻辑。例如,要覆盖我在第一个 post 中提到的消息,MyLanguageSyntaxErrorMessageProvider
中的 getSyntaxErrorMessage()
可能如下所示:
@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;
}
我的 class IssueCodes.java
如下所示(并且可以使用其他问题代码进行扩展):
public interface IssueCodes {
String PREFIX = "my.language.";
String UNCAPITALIZED_ENTITY_NAME = "UncapitalizedEntityName";
String FALSE_PARAMETER_TYPE = "FalseParameterType";
}