子对象的xtext验证

时间:2013-05-30 10:06:50

标签: validation xtext

我在Xtext中使用了DSL: 我想验证,如果ObjectB有Element,则包含对象(ObjectA)没有Element。我得到了对ObjectB的警告,但没有得到对象A.

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

1 个答案:

答案 0 :(得分:3)

warningerrorinfo有几个“群组”。一个组在参数列表中有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);