Я хочу проанализировать зависимости между классами, которые я начал использовать JavaParser и его SymbolResolver для. Но он продолжает сбой при разрешении нескольких ссылок на методы в примере проекта из Eclipse Scout . Scout использует собственный менеджер BEAN , где он загружает java классы при запуске jvm в список, что делает его более гибким для загрузки и выгрузки классов во время выполнения. Но Eclipse IDE может разрешать зависимости так или иначе . Вот мой рабочий пример, который я использую для разбора проекта Eclipse Scout:
private static String getFullyQualifiedName(MethodCallExpr exp) {
String result = "";
try {
result = exp.getName() + " --> " + exp.resolve().getQualifiedSignature();
} catch (RuntimeException e) {
result = "!unable to resolve! " + exp.getName();
}
return result;
}
private static void runAnalysis(String sourceFolder) {
final ProjectRoot projectRoot = new SymbolSolverCollectionStrategy().collect(new File(sourceFolder).toPath());
projectRoot.getSourceRoots().forEach(sourceRoot -> sourceRoot.tryToParseParallelized()
.forEach(parsedSource -> parsedSource.getResult().get().findAll(MethodCallExpr.class)
.forEach(exp -> System.out.println(parsedSource.getResult().get().getPackageDeclaration().get().getNameAsString()
+ "." + parsedSource.getResult().get().getStorage().get().getFileName()
+ " (" + exp.getBegin().get().line + ") "
+ getFullyQualifiedName(exp)))));
}
Я добавляю все jav-файлы зависимостей maven в исходную папку root, а также весь исходный код, и я просто использую простой пример helloworld от Скаута. Мне кажется совершенно случайным, почему и когда это работает против того, когда не удается разрешить MethodCallEx. Java Symbol Solver даже может разрешить некоторые из зависимостей BEAN.get (), что приятно.
Успешный вывод выглядит следующим образом:
scout.ui.html.UiServletFilter.java (66) destroy --> org.eclipse.scout.rt.server.commons.authentication.DevelopmentAccessController.destroy()
И неудачный вывод, например что:
scout.server.helloworld.HelloWorldService.java (15) !unable to resolve! getUserId
Но Eclipse IDE может разрешать все классы и вызовы методов.