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]
;
Чтобы предложение Reference работало, мне нужен поставщик области.
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)
}
}