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.