Reference XText:允许无效的交叉引用

Reference XText:允许无效的交叉引用,reference,grammar,xtext,cross-reference,Reference,Grammar,Xtext,Cross Reference,我需要构建一个包含交叉引用的语法,该交叉引用可能无效,即指向不存在的目标。包含此类引用的文件不应产生错误,而应仅产生警告。发电机会将此作为特殊情况处理 如何使用XText实现这一点?不可能创建对EMF中不存在的目标的有效交叉引用 我建议使用EatAttributes而不是eReference: 通过{YourDSL}语法中的feature=ID更改feature=[EClass | ID] 提供一个作用域计算实用程序,就像在{YourDSL}ScopeProvider类中的*scope\u E

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


如何使用XText实现这一点?

不可能创建对EMF中不存在的目标的有效交叉引用

我建议使用EatAttributes而不是eReference:

  • 通过{YourDSL}语法中的feature=ID更改feature=[EClass | ID]
  • 提供一个作用域计算实用程序,就像在{YourDSL}ScopeProvider类中的*scope\u EClass\u功能(context,reference)*方法中一样。由于这种范围界定方法只是使用给定引用的词组,因此重新实现应该很简单
  • 在{YourDSL}ProposalProvider中使用此作用域计算实用程序为引入的EAAttribute建议值
  • 或者,您可以在验证规则中使用此实用程序,如果此EAttribute无效,则向其添加警告/信息
  • 最后,使用生成器中的实用程序根据有效的目标对象创建输出

我在创建DSL为转换pahse的非减容语言提供变量减容时也遇到了这个问题。这个方法很管用,但是问问你自己,你是否真的想要那些讨厌的参考资料

只能在UI模块中删除自动生成的错误。为此,请提供一个
ILinkingDiagnosticMessageProvider
并覆盖函数
GetUnsolvedProxyMessage

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的伪引用对象。例如,名称丢失,您无法设置它,因为出现了
cycliclingexception
。但是您可以创建一个直接设置名称的新方法

请注意,虚拟对象将具有您在语法中输入的类型。如果它是抽象的,你可以很容易地检查它的引用是否没有链接