Я попытался настроить область видимости следующим образом:
В файле MyDslScopeProvider, расширяющем AbstractMyDslScopeProvider, я реализовал функцию с такой сигнатурой:
override def IScope getScope(EObject context, EReference reference)
и я использовал такие случаи
if (reference == SpectraPackage.Literals.SOMETHING__POINTER)
но у меня есть функция в моей грамматике, у которой есть параметры, и мы можем объявить их внутри локальных переменных. Я не хочу, чтобы эти локальные переменные и параметры этой функции были видны снаружи, я хочу, чтобы они были видны только внутри функции, поэтому я сделал что-то вроде этого:
if (contextDecl instanceof function) {
val fun= contextDecl as function
val allContentsCurrFile = EcoreUtil2.getAllContentsOfType(fun,Constant)
EObjectsInScope.addAll(fun.params)
EObjectsInScope.addAll(allContentsCurrFile)
return Scopes.scopeFor(EObjectsInScope)
}
else{
val removeEobjects = newArrayList()
EObjectsInScope.addAll(EcoreUtil2.getAllContentsOfType(root,EObject))
val funList= EcoreUtil2.getAllContentsOfType(root,function) as List<function>
for(function f: funList){
removeEobjects.addAll(f.varDeclList)
removeEobjects.addAll(f.params.params)
removeEobjects.addAll(EcoreUtil2.getAllContentsOfType(f,Constant))
}
EObjectsInScope.removeAll(removeEobjects)
return Scopes.scopeFor(EObjectsInScope)
Это очень неэффективно, чтобы получить все EObjects и удалить переменные, которые я не хочу видеть снаружи (это занимает много времени). Есть ли способ сделать это более эффективно? Спасибо.