2013-05-30 1 views
1

У меня есть DSL в Xtext: Я хочу проверить, что если ObjectB имеет Element, объекты, содержащие Object (ObjectA), не имеют Element. Я получаю предупреждение в ObjectB, но не к объекту А.xtext проверка подобъектов

Domainmodel: 
    ObjectA | ObjectB 
    ; 

ObjectB: 
    'ObjectB' 
    '{' 
    (element = Element)? 
    (objects += ObjectA)* 
    '}' 
; 

ObjectA: 
'ObjectA' 
    '{' 
    (element = Element)? 
    '}' 

; 

Element: 
    'Element' name=ID 
; 

Я хотел бы предупреждение, как парование также в Objecta:

@check 
def ObjectinObject(ObjectB object) 
{ 
    if(object.element != null) 
    { 
    for (ObjectA e : object.objects) 
    { 
     if(e.element != null) 
       {//The fallowing Code will make Warning at the element and the subelement 
       warning('warning', DomainmodelPackage$Literals::DOMAINMODEL__ELEMENT) 
       warning('warning2',e.element ,DomainmodelPackage$Literals::ELEMENT__NAME) 
       } 
    } 
    } 
} 

ответ

3

Есть несколько «групп» для warning, error и info , Одна группа имеет список EObject в списке параметров, другие группы - нет.

Вы уже используете тот, который делает не. В этом случае сообщение присоединяется к EObject, который является параметром метода проверки.

Так что для того, чтобы прикрепить сообщение любого случайного EObject вы должны использовать метод с EObject параметром. В вашем случае:

protected void warning(String message, EObject source, EStructuralFeature feature); 

и в действии:

warning('warning', e, DomainmodelPackage$Literals::OBJECT_A__OBJECTS) 

Эта вторая группа методов сообщения доступна только с XText 2.4. Если вы используете более старую версию, вы можете попробовать эту строфу (на Java, пожалуйста, примените синтаксис Xtend самостоятельно):

getMessageAcceptor().acceptWarning('warning', e, 
    DomainmodelPackage$Literals::OBJECT_A__OBJECTS, -1, 
    null); 
+0

спасибо, что мне очень помогло. Я немного потрудился и заставил его работать. У меня не было OBJECT_A__OBJECTS в качестве литералов, просто Object_B__OBJECTS, но это тоже не сработало. это было на самом деле: предупреждение («warning2», e.element, DomainmodelPackage $ Literals :: ELEMENT__NAME) – Iron