По каким-то причинам моим JvmModelInferrer
требуется для поиска всех элементов специального типа, которые соответствуют критерию. Эти элементы необходимы для полного вывода модели. Но все эти элементы могут быть распределены по всем файлам исходного кода проекта. Точнее: есть элемент, который вводит класс и несколько элементов, которые изменяют этот класс. Грамматика это выглядит следующим образом (упрощено до минимальной глубины):Обратный поиск ссылок
DeltaAction:
AddsUnit | ModifiesUnit | RemovesUnit;
AddsUnit:
{AddsUnit} 'adds' '{' unit=JavaCompilationUnit? '}';
JavaCompilationUnit:
('package' name=QualifiedName EOL)?
importSection=XImportSection?
// ...
typeDeclarations=ClassOrInterface;
ClassOrInterface:
ClassDeclaration /* | ... */;
ClassDeclaration:
'class' name=QualifiedName
// ...
;
ModifiesUnit:
'modifies' unit=[ClassOrInterface|QualifiedName] '{'
// ...
'}';
Если я теперь вывести модель Jvm для класса pkg.A
, мне нужно найти все ModifiesUnit
единиц, которые ссылаются на pkg.A
для создания этого класса.
Это вопрос, как найти все элементы, ссылающиеся на pkg.A
? Я нашел душу, но я думаю, что она очень неэффективна и, возможно, есть API, который делает меня для меня намного более эффективным.
класс DeltaJJvmModelInferrer расширяет AbstractModelInferrer {
@Inject ResourceDescriptionsProvider descsProvider
@Inject ResourceSet set
@Inject IQualifiedNameProvider qnameProvider
def dispatch void infer(DeltaJUnit unit, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
descsProvider.createResourceDescriptions.allResourceDescriptions.forEach [ rd |
val res = set.getResource(rd.URI, true)
res.unload
res.load(null)
EcoreUtil2.resolveAll(res)
]
try {
set.allContents.filter(typeof(ModifiesUnit)).filter [ mu |
qnameProvider.getFullyQualifiedName(mu.unit).equals(qnameProvider.getFullyQualifiedName(cd))
].forEach [ mu |
// Do the stuff I need to do!
]
} catch (Exception e) {
return
}
]
}
Что такое avout с запросом индекса для всех ModificationsUnit с нужным именем, а затем посмотреть? –
и посмотрите ссылочные описания в индексе –
Я еще не использовал индекс. Я посмотрю на это завтра. Есть ли какая-либо документация об ее использовании? – Joko