使用XText 2.6.2,我有一个引用ecore的语法,以及一个包含:
的模型NumberLiteral :
int= LONG;
terminal LONG returns ecore::ELong:
('-')? (NUMBER)+;
terminal fragment NUMBER:
'0'..'9';
这将生成一个NumberLiteralImpl类,其中包含:
protected static final long INT_EDEFAULT = 0L;
和
@Override
public boolean eIsSet(int featureID)
{
switch (featureID)
{
case XCoGPackage.NUMBER_LITERAL__INT:
return int_ != INT_EDEFAULT;
}
return super.eIsSet(featureID);
}
这显然意味着当您将int
属性设置为0时,它将计为未设置。
这根本没有用;例如,您不能将任何带有0的表达式序列化。如果您尝试,则会收到以下格式的错误:
org.eclipse.xtext.validation.IConcreteSyntaxValidator$InvalidConcreteSyntaxException: These errors need to be fixed before the model can be serialized.
SystemModel.{*snip*}.value->NumberLiteral: Feature NumberLiteral.int must be set.
是否有修复或更好的方法?
答案 0 :(得分:2)
为了防止任何人遇到同样的问题并找到一个未解决的问题,我采用的解决方案是用ecore :: EBigDecimal替换ecore :: ELong。由于这是一个对象,它将使用空引用而不是0来表示“未设置”。