Я использую библиотеку JavaParser
(https://github.com/javaparser/javaparser) для анализа объявлений методов Java. Я хочу идентифицировать различные объявления методов из разных пакетов, классов, областей и т. Д., Чтобы я мог точно идентифицировать все объявления методов.
Например:
Вот файл Java с именем MainClass.java
:
package com.company.packA.packB;
public class MainClass {
void doTask(int x, int y) {
//...
}
private class InnerClass {
void doTask(int x, int y) {
//...
}
}
}
class AnotherClassSameFile {
void doTask(int x, int y) {
//...
}
}
Обратите внимание, что приведенный выше пример содержит три void doTask(int x, int y)
методы:
com.company.packA.packB
→ MainClass
→ doTask(int x, int y)
com.company.packA.packB
→ MainClass
→ InnerClass
→ doTask(int x, int y)
com.company.packA.packB
→ AnotherClassSameFile
→ doTask(int x, int y)
Чтобы идентифицировать различные объявления методов с одинаковыми сигнатурами методов, мне нужно пройти через все родительские узлы до корневого узла.
До сих пор я пробовал этот код (упрощенно), используя JavaParser
библиотеку:
class MethodStruct { // the second example will be:
String parentNodes; // com.company.packA.packB#MainClass#InnerClass
String returnType; // void
String methodName; // doTask
String parameters; // int,int
}
class JavaParserTest {
// this is the method to be called from outside
static List<MethodStruct> getMethodStructs(Reader reader) {
CompilationUnit cu = JavaParser.parse(reader);
List<MethodStruct> methodStructs = new LinkedList<>();
cu.accept(new MethodVisitor(), methodStructs);
return methodStructs;
}
static class MethodVisitor extends VoidVisitorAdapter<List<MethodStruct>> {
@Override
public void visit(MethodDeclaration methodDeclaration, List<MethodStruct> methodStructs) {
super.visit(methodDeclaration, methodStructs);
// adding individual methodStruct into the list
methodStructs.add(getMethodStruct(methodDeclaration));
}
static MethodStruct getMethodStruct(MethodDeclaration methodDeclaration) {
return new MethodStruct(
getParents(methodDeclaration),
methodDeclaration.getTypeAsString(),
methodDeclaration.getNameAsString(),
getParameterAsString(methodDeclaration.getParameters()));
}
// it is the method to be concerned for my question
static String getParents(MethodDeclaration methodDeclaration) {
StringBuilder parents = new StringBuilder();
Node currentNode = methodDeclaration;
while (currentNode.getParentNode().isPresent()) {
// goto parent node
currentNode = currentNode.getParentNode().get();
//TODO: I'm stuck here. Help me please!
//TODO: How to identify each node whether
// it is a package, innerClass, etc?
}
// convert StringBuilder into String and return the String
return parents.toString();
}
static String getParameterAsString(NodeList<Parameter> parameters) {
// easy task! convert parameter string list
// into a single string (comma separated)
}
}
}
Я столкнулся с трудностями при определении моего getParents(MethodDeclaration methodDeclaration)
метода. Как я могу решить это (то есть идентифицировать все родительские узлы)? Я не могу найти какой-либо полезный метод класса Node
для моей цели. Возможно, я что-то пропустил в библиотеке JavaParser
.