XText:允许无效的交叉引用

时间:2012-11-29 20:32:51

标签: reference grammar xtext cross-reference

我需要构建一个包含交叉引用的语法,它可能无效,即指向一个不存在的目标。包含此类引用的文件不应产生错误,而应仅产生警告。生成器将像处理特殊情况一样处理它。

如何使用XText执行此操作?

2 个答案:

答案 0 :(得分:5)

无法在EMF中为不存在的目标创建有效的交叉引用。

我建议使用EAttributes代替EReferences:

  • 在{YourDSL}语法中按功能= ID 更改功能= [EClass | ID]
  • 提供范围计算实用程序,就像在 {YourDSL} ScopeProvider 类中的* scope_EClass_feature(context,reference)*方法中所做的那样。由于这种范围方法只使用给定引用的eType,因此重新实现应该是直截了当的。
  • {YourDSL} ProposalProvider 中使用此范围计算实用程序为引入的EAttribute建议值。
  • 您可以选择在验证规则中使用此实用程序,以便在此EAttribute不是“有效”时向其添加警告/信息。
  • 最后在生成器中使用该实用程序,根据有效的目标eObjects创建输出。

答案 1 :(得分:1)

在创建DSL时,我也遇到了这个问题,为转换pahse的非翻译语言提供变量的解码。这个方法有效,但问问自己,你是否真的想要那些讨厌的可能引用。

您可以在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。特别是名称已丢失,您无法通过CyclicLinkingException进行设置。但是您可以创建一个直接设置名称的新方法。

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