2016-03-25 28 views
3

Xtext 2.9, kapsam sağlayıcılarının çalışma şeklini değiştirdi ve şimdi nasıl çalıştıklarını anlamıyorum. Xtext 2.9 kapsam sağlayıcısı

en aşağıdaki dilbilgisi var diyelim: çalışmak Referans maddesi için

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] 
; 

, bir kapsam sağlayıcı gerekir.

Xtext 2.9 (MyDslScopeProvider.xtend olarak) sizin için aşağıdaki kapsam sağlayıcı kodu oluşturur:

class MyDslScopeProvider extends AbstractMyDslScopeProvider { 
} 

AbstractMyDslScopeProvider kendi var hiçbir yöntemleri vardır, sadece DelegatingScopeProvider devralır.

Kafamı, bunun nasıl çalıştığını veya kapsam aramasının kodunun nereye gitmesi gerektiği konusunda saramam. "Belgeler" gerçekten işe yaramıyor çünkü tam bir çalışma örneği yerine sadece işe yaramaz kod parçacıkları var. Xtext ait

önceki sürümleri AbstractDeclarativeScopeProvider kullanılan ve bu kadar olurdu öncesi, 2.9 anlamak ve kullanmak oldukça kolay oldu:

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

cevap

3

Sen getScope yöntemi olarak

override getScope(EObject ctx, EReference ref) { 
    if (ref == MyDslPackage.Literals.REFERENCE_THING) { 
     return createScopeForThings() 
    } else if (ref == MyDslPackage.Literals.REFERENCE_STUFF) { 
     return createScopeForStuff() 
    } 
} 

uygulamak gerekir senin durumda, EObject öğesinin bir Reference olduğu ve EReference'nin MyDslPackage.Literals.REFERENCE_THING veya MyDslPackage.Literals.REFERENCE_STUFF olduğu bir çağrı alırsınız.

Bağlayıcı ve içerik yardımı tarafından kullanılabilecek bir örnek oluşturmak ve IScope örneğini döndürmeniz gerekir. Daha fazla ayrıntı için IScopeProvider ve IScope JavaDoc'larına bakın.

+1

Hala tam olarak anlamadığım: AbstractMyDslScopeProvider sınıfı ne için kullanılır? MyDslScopeProvider, DelegateScopeProvider'ı aradaki boş özet sınıfı olmadan doğrudan genişletebilir. –