Подсчет методов Объявление + методы Вызовы в классе с использованием JavaParser
Я пытаюсь закодировать RFC метрику (Ответ для класса), он считает объявления методов + вызовы методов.
Объявления методов работают нормально, но у меня возникла проблема при подсчете вызовов методов с использованием API JavaParser.
Вот мой код:
public class MethodPrinter {
public static void main(String[] args) throws Exception {
// creates an input stream for the file to be parsed
FileInputStream in = new FileInputStream("D://test.java");
CompilationUnit cu;
try {
// parse the file
cu = JavaParser.parse(in);
} finally {
in.close();
}
// visit and print the methods names
MethodVisitor MV =new MethodVisitor();
cu.accept(new VoidVisitorAdapter<Void>(){
@Override
public void visit(final MethodCallExpr n, final Void arg){
System.out.println("method call :"+n);
super.visit(n, arg);
}
}, null);
}
}
test.java
package test;
import java.util.*;
public class ClassA
{
private int test;
private ClassB classB = new ClassB();
public void doSomething(int t){
System.out.println ( toString());
int i= doSomethingBasedOnClassBBV(classB.toString());
}
protected void doSomethingBasedOnClassB(){
System.out.println (classB.toString());
}
}
public class ClassB
{
private ClassA classA = new ClassA();
public void doSomethingBasedOneClassA(){
System.out.println (classA.toString());
}
private String toString(){
return "classB";
}
private String toString(){
return "classB";
}
public void doSomethingBasedOneClassA(){
System.out.println (classA.toString());
}
protected void doSomethingBasedOnClassB(){
System.out.println (classB.toString());
}
}
результат этого кода:
*method call :System.out.println(toString())
method call :toString()
method call :doSomethingBasedOnClassBBV(classB.toString())
method call :classB.toString()
method call :System.out.println(classB.toString())
method call :classB.toString()
method call :System.out.println(classA.toString())
method call :classA.toString()
method call :System.out.println(classA.toString())
method call :classA.toString()
method call :System.out.println(classB.toString())
method call :classB.toString()*
действительно, этот код проверяет вызовы методов, но в моем случае я не хочу, чтобы он подсчитывал вызовы методов библиотек, такие как System.out.println(toString())
Хочу только посчитать toString()
,
Если вы получили лучший код или другой API для использования... любая помощь приветствуется, заранее спасибо.
1 ответ
Вы не можете легко решить вашу проблему, используя исключительно анализатор, потому что вам нужно разрешить вызов метода и выяснить, является ли это вызовом части метода стандартной библиотеки.
Вы можете легко сделать это, используя JavaSymbolSolver, библиотеку, созданную для дополнения JavaParser. На практике вы звоните:
JavaParserFacade.solveMethodAsUsage(myMethodCallExpr)
И вы возвращаете MethodDeclaration, который также сообщает вам тип, для которого был определен этот метод. Как только у вас есть тип, вы можете посмотреть на пакет и проверить, начинается ли он с java
или же javax
и исключить это.