2013-06-10 3 views
3

У меня есть рабочая грамматика по xtext, и я начинаю проверку кода.Какие параметры следует использовать для AbstractDeclarativeValidator.warning и ошибки?

Для этого я добавил метод в validator 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, но я понятия не имею, какой из них использовать или зачем мне нужно один из них.

Так что вопрос:

Как я могу поместить предупреждение на данном AST элемент?

ответ

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); 
} 

Я понятия не имею о том, является ли это должно быть верным путем, но, похоже, он работал в различных случаях, когда я его использовал, и требует минимального количества состояний.

3

EStructuralFeature является собственностью вашего АСТ. Вы найдете сгенерированный класс EPackage, который содержит константы.

Я думаю, в вашем случае это что-то вроде:

MyDslPackage.Literals.EXPRESSION_MULTIPLICATION__LEFT 

и

MyDslPackage.Literals.EXPRESSION_MULTIPLICATION__RIGHT 
+0

Хотя это не решение, которое я использовал, он работает, если вы готовы сохранить много состояния. –

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