Найти имя класса по ключевому слову Super в JavaParser

#java #super #javaparser

#java #супер #javaparser

Вопрос:

Я разрабатываю Java-приложение на основе JavaParser. Я не знаю, как получить имя класса по ключевому слову, используемому в теле метода. В качестве примера, мне нужно знать, что ключевое слово Super в приведенном ниже коде относится к классу A.

 class A { 
   public void bar(){...}
}

class B extends A {}

class C extends B {
   void foo(){
      super.bar() // I want to find that the super keyword is referred to Class A.
    }
}
  

Я проверил эти функции (1, 2 и 3), предоставленные JavaParser, но ни одна из них не сработала, все возвращают null.

 MethodCallExpr methodCallExpr = ...
Optional<Expression> scope = methodCallExpr.getScope();
SuperExpr superExp = scope.get().asSuperExpr();
1. superExp.findAll(ClassOrInterfaceDeclaration.class);   and 
2. superExp.getTypeName();
3. superExp.getClassExpr();  //I do not know why this method also returns null
  

Комментарии:

1. Является expr типа MethodCallExpr ? Если это так, похоже, вам нужно использовать getScope() : expr.getScope().asSuperExpr()

2. Я на самом деле сделал то же самое, но не работает. Я обновил вопрос, чтобы показать это.

3. super в вашем примере относится к классу B (который является суперклассом текущего класса C), а не A.

4. Предположим, что класс C наследуется непосредственно от класса A. это не имеет никакого эффекта, и результаты по-прежнему равны нулю.

Ответ №1:

Я нахожу правильный метод.

 ResolvedType resolvedType = superExp.calculateResolvedType();
  

Этот метод работает правильно, если вы также добавляете JavaSymbolSolver в конфигурацию синтаксического анализатора. JavaSymbolSolver необходим для разрешения ссылок и поиска связей между узлами.

 TypeSolver reflectionTypeSolver = new ReflectionTypeSolver();
TypeSolver javaParserTypeSolver = new JavaParserTypeSolver(projectSourceDir);
CombinedTypeSolver combinedSolver = new CombinedTypeSolver();
combinedSolver.add(reflectionTypeSolver);
combinedSolver.add(javaParserTypeSolver);
        
ParserConfiguration parserConfiguration = new ParserConfiguration()
                                         .setSymbolResolver(new JavaSymbolSolver(combinedSolver));
        
SourceRoot sourceRoot = new SourceRoot(projectSourceDir.toPath());
sourceRoot.setParserConfiguration(parserConfiguration);