如何在XText / EMF中区分0和未设置

时间:2014-08-18 18:31:44

标签: eclipse xtext emf

使用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.

是否有修复或更好的方法?

1 个答案:

答案 0 :(得分:2)

为了防止任何人遇到同样的问题并找到一个未解决的问题,我采用的解决方案是用ecore :: EBigDecimal替换ecore :: ELong。由于这是一个对象,它将使用空引用而不是0来表示“未设置”。