0

The code is here,

class Bar {
    private int a;
    void aMethod() {
        while (true) {
            String a = "0";
            a = a + "1";
        }
    }
}

I want to get the real type of a. I tried to use the code below,

public class GetTypeOfReference {
     private static final String FILE_PATH = "src\\com\\test\\Bar.java";

     public static void main(String[] args) throws FileNotFoundException {
         TypeSolver typeSolver = new CombinedTypeSolver();

         JavaSymbolSolver symbolSolver = new JavaSymbolSolver(typeSolver);
         StaticJavaParser.getConfiguration().setSymbolResolver(symbolSolver);

         CompilationUnit cu = StaticJavaParser.parse(new File(FILE_PATH));

         cu.findAll(AssignExpr.class).forEach(ae -> {
             ResolvedType resolvedType = ae.calculateResolvedType();
             System.out.println(ae.toString() + " is a: " + resolvedType.describe());
         });

      }
}


But got the error, Exception in thread "main" UnsolvedSymbolException{context='null', name='String', cause='null'} at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.convertToUsage(JavaParserFacade.java:509) at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.convert(JavaParserFacade.java:567) at com.github.javaparser.symbolsolver.javaparsermodel.declarations.JavaParserSymbolDeclaration.getType(JavaParserSymbolDeclaration.java:146) at com.github.javaparser.symbolsolver.model.resolution.Value.from(Value.java:40) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) at java.base/java.util.LinkedList$LLSpliterator.tryAdvance(LinkedList.java:1253) at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127) at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:476) at com.github.javaparser.symbolsolver.javaparsermodel.contexts.AbstractJavaParserContext.solveWithAsValue(AbstractJavaParserContext.java:149) at com.github.javaparser.symbolsolver.javaparsermodel.contexts.StatementContext.solveSymbolAsValue(StatementContext.java:135) at com.github.javaparser.symbolsolver.resolution.SymbolSolver.solveSymbolAsValue(SymbolSolver.java:68) at com.github.javaparser.symbolsolver.resolution.SymbolSolver.solveSymbolAsValue(SymbolSolver.java:73) at com.github.javaparser.symbolsolver.javaparsermodel.TypeExtractor.visit(TypeExtractor.java:277) at com.github.javaparser.symbolsolver.javaparsermodel.TypeExtractor.visit(TypeExtractor.java:44) at com.github.javaparser.ast.expr.NameExpr.accept(NameExpr.java:79) at com.github.javaparser.symbolsolver.javaparsermodel.TypeExtractor.visit(TypeExtractor.java:98) at com.github.javaparser.symbolsolver.javaparsermodel.TypeExtractor.visit(TypeExtractor.java:44) at com.github.javaparser.ast.expr.AssignExpr.accept(AssignExpr.java:135) at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getTypeConcrete(JavaParserFacade.java:448) at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getType(JavaParserFacade.java:310) at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getType(JavaParserFacade.java:292) at com.github.javaparser.symbolsolver.JavaSymbolSolver.calculateType(JavaSymbolSolver.java:250) at com.github.javaparser.ast.expr.Expression.calculateResolvedType(Expression.java:564) at test.GetTypeOfReference.lambda$0(GetTypeOfReference.java:32) at java.base/java.util.ArrayList.forEach(ArrayList.java:1378) at test.GetTypeOfReference.main(GetTypeOfReference.java:31)

What is the right way to do this?

heshuguo
  • 21
  • 4

1 Answers1

0

The answer is late but for those who are interested this is the right approach. With javaparser 3.16.1 the result is

a = a + "1" is a: java.lang.String
jpl
  • 347
  • 3
  • 11