Подсчет методов Объявление + методы Вызовы в классе с использованием 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 и исключить это.

Другие вопросы по тегам