Как получить имя метода MethodCallExpr и FieldAccessExpr от каждого метода в классе? - PullRequest
1 голос
/ 22 июня 2019

У меня есть MethodCallExpr и FieldAccessExpr от каждого метода.Вот код, который я сделал.

for (TypeDeclaration<?> typeDec : cu.getTypes()) {
        for (MethodDeclaration method : typeDec.getMethods()) {
            method.getBody().ifPresent(field -> {
                System.out.println(ml.getMethodsByClass(0,methodCol));
                System.out.println("Method call : " + field.findAll(MethodCallExpr.class));
                //stmtMethod = field.findAll(MethodCallExpr.class);
                System.out.println("Field access : " + field.findAll(FieldAccessExpr.class));
                //stmtVariables = field.findAll(FieldAccessExpr.class);
            });
            methodCol++;
            System.out.println();
        }
    }

ПРИЧИНА: Я не могу получить имя MethodAccessExpr и FieldAccessExpr.

Фактический результат:

methodC
ethod calls : [d1.methodA(), d1.methodB(), System.out.println(d1.text1 + "\t" + d1.text2)]
field access : [System.out, d1.text1, d1.text2]<br>
methodD
method calls : [d3.methodE(), System.out.println(d3.d3x + "\t" + d3.d3y)]
field access : [System.out, d3.d3x, d3.d3y]

Ожидаемый результат:

methodC
method calls: methodA, methodB, println
field access: out, text1, text2
methodD
method calls: methodE, out
field access: out, d3x, d3y

1 Ответ

0 голосов
/ 22 июня 2019

Ты почти у цели. Единственная проблема, которую я вижу, состоит в том, что findAll возвращает список, и вы используете этот список в качестве аргумента для System.out. Что вам нужно сделать, это получить каждый элемент в списке, чтобы получить его имя. Вот пример (обратите внимание, что я переименовал field в blockStatement для согласованности):

for (TypeDeclaration<?> typeDec : cu.getResult().get().getTypes()) {
    for (MethodDeclaration method : typeDec.getMethods()) {
        method.getBody().ifPresent(blockStatement -> {
            List<FieldAccessExpr> results = blockStatement.findAll(FieldAccessExpr.class);
                for( FieldAccessExpr expr : results ) {
                    System.out.println(expr.getName());
                }

Если вы просто хотите напечатать все имена полей (и методов), более компактный способ - использовать потоки:

blockStatement.findAll(FieldAccessExpr.class)
    .stream()
    .map(FieldAccessExpr::getName)
    .forEach(System.out::println);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...