2016-03-25 57 views
3

Xtext 2.9改變了範圍提供者的工作方式,我不明白他們現在的工作方式。Xtext 2.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] 
; 

爲參考條款的工作,我需要一個範圍提供商。

XTEXT 2.9生成(在MyDslScopeProvider.xtend)爲您提供以下範圍提供商代碼:

class MyDslScopeProvider extends AbstractMyDslScopeProvider { 
} 

AbstractMyDslScopeProvider沒有它自己的方法,它只是從DelegatingScopeProvider繼承。

我無法將我的頭圍繞着它如何工作或範圍查找的代碼應該放在哪裏。 「文檔」並沒有真正的幫助,因爲只有無用的代碼片段而不是完整的工作示例。

XTEXT的早期版本使用AbstractDeclarativeScopeProvider,那是很容易理解和使用,預2.9它將是:

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

回答

3

您需要實現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_THING或MyDslPackage.Literals.REFERENCE_STUFF的實例,您將收到呼叫。

您需要創建並返回IScope的實例,鏈接器和內容幫助可以使用該實例。有關更多詳細信息,請參閱IScopeProviderIScope的JavaDoc。

+1

我還是不太明白:什麼是AbstractMyDslScopeProvider類用於? MyDslScopeProvider可以直接擴展DelegateScopeProvider而不需要在兩者之間的空抽象類。 –