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çingrammar 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)
}
}
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. –