2012-11-29 72 views
2

我需要构建一个包含交叉引用的语法,该交叉引用可能无效,即指向不存在的目标。包含这种引用的文件不应该产生错误,而只会产生警告。发生器将作为一种特殊情况处理。XText:允许无效的交叉引用

我该如何使用XText做到这一点?

回答

5

无法在EMF中创建对现有目标的有效交叉引用。

我建议去与EAttributes代替EReferences:

  • 更改功能=的EClass | ID]通过功能= ID在{} YourDSL语法。
  • 提供范围计算实用程序,就像在{YourDSL} ScopeProvider类中的* scope_EClass_feature(context,reference)*方法中所做的那样。由于此范围方法仅使用给定引用的eType,重新实现应该很简单。
  • {YourDSL} ProposalProvider中使用此范围计算实用程序为推荐的EAttribute提出值。
  • (可选)您可以在验证规则中使用此实用程序向此EAttribute添加警告/信息(如果它不是“有效的”)。
  • 最后,在您的生成器中使用该实用程序根据有效的目标eObject创建输出。
1

我也遇到了这个问题,当创建一个DSL提供变量的过渡pahse非declerative语言的变量。这种方法的作品,但问问自己,如果你真的想要有那些讨厌的可能引用。

您可以将自动生成的错误放入您的UI模块只有。要做到这一点,提供了一个ILinkingDiagnosticMessageProvider和覆盖功能getUnresolvedProxyMessage

class DSLLinkingDiagnosticMessageProvider extends LinkingDiagnosticMessageProvider { 
    override getUnresolvedProxyMessage(ILinkingDiagnosticContext context) { 
     if(context.context instanceof YourReference) { 
      // return null so the your error is left out 
      null 
     } else { 
      // use super implementation for others 
      super.getUnresolvedProxyMessage(context) 
     } 
    } 
} 

YourReference所有链接,错误会被错过。但请注意,将会有一个虚拟引用对象,其中所有fealds都为null。 exspecialy的名称ist丢失,并且由于CyclicLinkingException,您无法设置它。但是您可以创建一个直接设置名称的新方法。

请注意,虚拟对象将具有您在语法中输入的类型。如果它的摘要很容易检查女巫的参考是没有联系的。