Я начал разработку XText DSL, который теперь имеет два подъязыка, которые ссылаются друг на друга (точнее, A относится к B). У каждого из них есть свои собственные плагины и рабочий процесс генератора.
Соответствующая часть выглядит примерно так:
Язык А:
ARoot:
'rootOfB:' (foos+=Foo)*;
Foo:
'foo' name=ID;
Язык Б:
import 'url-of-a' as A
BRoot:
'rootOfA:' (bars+=Bar)*;
Bar:
'bar' name=ID 'for' foo=[A::Foo] ;
Теперь я пытаюсь предоставить поставщика области видимости, чтобы в языке B распознавались элементы foo
, но я еще не нашел способа получить доступ к проанализированным элементам A. Я провел некоторую отладку, и похоже, что ни параметр foo , ни eReference не имеет какой-либо связи с элементами языка A:
class MyScopeProvider extends AbstractDeclarativeScopeProvider {
def IScope scope_Bar_foo(Bar bar, EReference eReference){
// How should i reference and return all the Foo objects here?
}
}
У элементов Foo также есть поставщик полного имени, так что это не должно быть проблемой, я протестировал его из другой области, все еще работая над плагином A:
class MyQualifiedNameProvider extends DefaultDeclarativeQualifiedNameProvider {
override qualifiedName(Object o) {
if (o instanceof Foo) {
val f = o as Foo
return QualifiedName.create(f.name)
}
super.qualifiedName(o);
}
}
Итак, у меня вопрос: как мне получить проанализированные объекты EObject в другом плагине?
Пример использования:
Содержимое файла, использующего грамматику A:
rootOfA
foo firstFoo
foo secondFoo
Содержимое файла, использующего грамматику B:
rootOfB
bar firstBar for [i would like reference firstFoo or secondFoo here]