Java Xtext 2.9作用域提供程序

Java Xtext 2.9作用域提供程序,java,dsl,modeling,xtext,xtend,Java,Dsl,Modeling,Xtext,Xtend,XTEXT2.9改变了作用域提供程序的工作方式,我不明白它们现在是如何工作的 假设我有以下语法: grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals generate myDsl "http://www.xtext.org/example/mydsl/MyDsl" Model: ((things+=Thing) | (refs+=Reference))* ; Thing:

XTEXT2.9改变了作用域提供程序的工作方式,我不明白它们现在是如何工作的

假设我有以下语法:

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals

generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"

Model:
    ((things+=Thing) | (refs+=Reference))*
;

Thing:
    'thing' name=ID '{'
        stuff += Stuff* 
    '}'
;

Stuff:
    'stuff' name=ID
;

Reference:
    'reference' thing=[Thing] stuff=[Stuff] 
;
为了使Reference子句起作用,我需要一个作用域提供程序

XText 2.9为您生成以下作用域提供程序代码(在MyDslScopeProvider.xtend中):

AbstractMyDslScopeProvider没有自己的方法,它只是从DelegatingScopeProvider继承的

我不知道这是如何工作的,也不知道范围查找的代码应该放在哪里。“文档”并没有真正的帮助,因为只有无用的代码片段,而没有完整的工作示例

XText的早期版本使用AbstractDeclarativeScopeProvider,这非常容易理解和使用,在2.9之前,它应该是:

class MyDslScopeProvider extends AbstractDeclarativeScopeProvider {
    def IScope scope_Reference_stuff(Reference reference, EReference ref) {
        scopeFor(reference?.thing.stuff)
    }
}

您需要实现
getScope
方法

override getScope(EObject ctx, EReference ref) {
   if (ref == MyDslPackage.Literals.REFERENCE_THING) {
      return createScopeForThings()
   } else if (ref == MyDslPackage.Literals.REFERENCE_STUFF) {
      return createScopeForStuff()
   }
}
在您的情况下,您将得到一个调用,其中EObject是
Reference
的实例,EReference是MyDslPackage.Literals.Reference\u THING或MyDslPackage.Literals.Reference\u THING


您需要创建并返回
IScope
的实例,链接器和内容辅助程序可以使用该实例。有关更多详细信息,请参阅
IScopeProvider
IScope
的JavaDoc。

我仍然不太明白的是:AbstractMyDslScopeProvider类用于什么?MyDslScopeProvider可以直接扩展DelegateScopeProvider,而不需要中间的空抽象类。
override getScope(EObject ctx, EReference ref) {
   if (ref == MyDslPackage.Literals.REFERENCE_THING) {
      return createScopeForThings()
   } else if (ref == MyDslPackage.Literals.REFERENCE_STUFF) {
      return createScopeForStuff()
   }
}