Getting error while calling calculateResolvedType() on scope in Java Parser

30 Views Asked by At

I have below classes in my project.

MyRequest.java:

package com.example.test;

import lombok.Data;

@Data
public class MyRequest {
    private String action;
    private String name;
    private String data;
}

MyService.java:

package com.example.test;

public class MyService {
    public void doStuff(MyRequest request) {
        
        switch(request.getAction()) {
        case "A":
            request.getName();
            break;
        }
    }
}

I am trying to find the full class name of all objects which is calling any method. Below is my code. For simplicity, I have provided the bare minimum replicable code.

App.java:

package com.example.test;

import java.io.IOException;
import java.nio.file.Path;

import com.github.javaparser.ParserConfiguration;
import com.github.javaparser.ParserConfiguration.LanguageLevel;
import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.expr.MethodCallExpr;
import com.github.javaparser.symbolsolver.JavaSymbolSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;

/**
 * Hello world!
 *
 */
public class App {
    public static void main(String[] args) throws IOException {
        String javaFilePath = "path\\to\\src\\main\\java\\com\\example\\test\\MyService.java";

        createSymbolSolver(Path.of("path\\to\\src\\main\\java\\"));
        CompilationUnit cu = StaticJavaParser.parse(Path.of(javaFilePath));
        cu.findAll(MethodCallExpr.class).forEach(method -> processMethod(method));
    }

    public static void createSymbolSolver(Path srcPath) throws IOException {

        CombinedTypeSolver typeSolver = new CombinedTypeSolver();

        typeSolver.add(new JavaParserTypeSolver(srcPath));

        typeSolver.add(new ReflectionTypeSolver());

        JavaSymbolSolver symbolSolver = new JavaSymbolSolver(typeSolver);

        ParserConfiguration config = new ParserConfiguration();
        config.setSymbolResolver(symbolSolver);
        config.setLanguageLevel(LanguageLevel.JAVA_17);
        StaticJavaParser.setConfiguration(config);

    }

    public static void processMethod(MethodCallExpr method) {
        method.getScope().ifPresent(scope -> {
            System.out.println(scope.calculateResolvedType().describe());
        });
    }
}

But while calling the scope.calculateResolvedType() for request.getName(), I am getting below error:

Exception in thread "main" UnsolvedSymbolException{context='null', name='Method 'getAction' cannot be resolved in context request.getAction() (line: 6) MethodCallExprContext{wrapped=request.getAction()}. Parameter types: []', cause='null'}
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.solveMethodAsUsage(JavaParserFacade.java:659)
    at com.github.javaparser.symbolsolver.javaparsermodel.TypeExtractor.visit(TypeExtractor.java:324)
    at com.github.javaparser.symbolsolver.javaparsermodel.TypeExtractor.visit(TypeExtractor.java:64)
    at com.github.javaparser.ast.expr.MethodCallExpr.accept(MethodCallExpr.java:118)
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getTypeConcrete(JavaParserFacade.java:501)
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getType(JavaParserFacade.java:349)
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getType(JavaParserFacade.java:331)
    at com.github.javaparser.symbolsolver.javaparsermodel.contexts.SwitchEntryContext.solveSymbol(SwitchEntryContext.java:54)
    at com.github.javaparser.symbolsolver.javaparsermodel.contexts.AbstractJavaParserContext.solveSymbolInParentContext(AbstractJavaParserContext.java:166)
    at com.github.javaparser.symbolsolver.javaparsermodel.contexts.StatementContext.solveSymbol(StatementContext.java:312)
    at com.github.javaparser.symbolsolver.javaparsermodel.contexts.StatementContext.solveSymbol(StatementContext.java:194)
    at com.github.javaparser.symbolsolver.javaparsermodel.contexts.AbstractJavaParserContext.solveSymbolInParentContext(AbstractJavaParserContext.java:166)
    at com.github.javaparser.resolution.Context.solveSymbolAsValueInParentContext(Context.java:194)
    at com.github.javaparser.symbolsolver.javaparsermodel.contexts.MethodCallExprContext.solveSymbolAsValue(MethodCallExprContext.java:145)
    at com.github.javaparser.symbolsolver.resolution.SymbolSolver.solveSymbolAsValue(SymbolSolver.java:76)
    at com.github.javaparser.symbolsolver.resolution.SymbolSolver.solveSymbolAsValue(SymbolSolver.java:82)
    at com.github.javaparser.symbolsolver.javaparsermodel.TypeExtractor.visit(TypeExtractor.java:334)
    at com.github.javaparser.symbolsolver.javaparsermodel.TypeExtractor.visit(TypeExtractor.java:64)
    at com.github.javaparser.ast.expr.NameExpr.accept(NameExpr.java:81)
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getTypeConcrete(JavaParserFacade.java:501)
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getType(JavaParserFacade.java:349)
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getType(JavaParserFacade.java:331)
    at com.github.javaparser.symbolsolver.JavaSymbolSolver.calculateType(JavaSymbolSolver.java:403)
    at com.github.javaparser.ast.expr.Expression.calculateResolvedType(Expression.java:575)
    at com.example.test.App.lambda$1(App.java:54)
    at java.base/java.util.Optional.ifPresent(Optional.java:178)
    at com.example.test.App.processMethod(App.java:53)
    at com.example.test.App.lambda$0(App.java:32)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    at com.example.test.App.main(App.java:32)

Is this a bug in java-parser library or is there something wrong in my code.

0

There are 0 best solutions below