2015-10-27 3 views
0

Я хочу проверить тип функции внутри моей проверки подлинности Xtend.Проверить тип в валидаторе Xtend

XText грамматика выглядит следующим образом:

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

Это, как он используется:

Element MyElement 
    feature 2.5 
end Element 

Если пытаться использовать INTEGER значение вместо DOUBLE для feature, редактор показывает ошибка:

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

Как я могу выполнить проверку типа или есть лучший способ, чтобы переопределить стандартное сообщение упомянутого выше?

ответ

0

Благодаря Себастьяну, я нашел решение.

Прежде всего, необходимо добавить 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"; 
} 
1

Чтобы переопределить сообщение, созданное парсером, вам необходимо специализировать org.eclipse.xtext.parser.antlr.ISyntaxErrorMessageProvider и привязать собственную реализацию в модуле времени выполнения вашего языка.

Смежные вопросы