【问题标题】:How to distinguish between 0 and unset in XText/EMF如何区分 XText/EMF 中的 0 和未设置
【发布时间】:2014-08-19 18:36:23
【问题描述】:

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

有解决办法,还是有更好的方法?

【问题讨论】:

    标签: eclipse xtext emf


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      相关资源
      最近更新 更多