我在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)
}
}
}
}
答案 0 :(得分: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);