1

我在 Xtext 中有闲置的 DSL:我想验证,如果 ObjectB 有 Element,则包含的对象(ObjectA)没有 Element。我收到了对 ObjectB 的警告,但没有收到对 Object 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)
              }
     }
  }
}
4

1 回答 1

3

和有几个“组warning” 。一组确实在参数列表中,其他组没有。errorinfoEObject

您已经使用了不使用的那个。在这种情况下,消息附加到EObjectcheck 方法的参数。

因此,为了将消息附加到任何随机数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);
于 2013-05-30T11:16:13.407 回答