2017-05-08 181 views
1

我不确定是否在标题中描述了问题,但这里是背景: 我想解析Java源代码,说TestClassOne.java。javaparser UnsolvedSymbolException - 正在分析的类上使用的类,使用另一个未解析的类

TestClassOne使用声明为实例变量的另一个类“TestClassTwo”。现在,TestClassTwo将一个TestClassThree类声明为实例变量。

所以,现在,问题出现了,当我的目标类TestClassOne,获取TestClassThree经由TestClassTwo)低于参考,从而方法试验(:

public class TestClassOne {  
     private TestClassTwo testTwo = new TestClassTwo(); 

    public void test() { 
     TestClassThree three = testTwo.getTestThree(); 
    } 
    } 

这是例外:

Exception in thread "main" UnsolvedSymbolException{context='unknown', name='TestClassThree', typeSolver=null} 
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.convertToUsage(JavaParserFacade.java:418) 
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.convertToUsage(JavaParserFacade.java:395) 
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.convertToUsageVariableType(JavaParserFacade.java:387) 
    at com.github.javaparser.symbolsolver.javaparsermodel.TypeExtractor.visit(TypeExtractor.java:302) 
    at com.github.javaparser.symbolsolver.javaparsermodel.TypeExtractor.visit(TypeExtractor.java:34) 
    at com.github.javaparser.ast.expr.VariableDeclarationExpr.accept(VariableDeclarationExpr.java:104) 
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getTypeConcrete(JavaParserFacade.java:371) 
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getType(JavaParserFacade.java:263) 
    at com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade.getType(JavaParserFacade.java:257) 

这里是我的代码:

import com.github.javaparser.JavaParser; 
import com.github.javaparser.ParseException; 
import com.github.javaparser.ast.CompilationUnit; 
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade; 
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver; 
import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver; 
import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver; 
public class TestParser { 

    public static void main(String[] args) throws FileNotFoundException, ParseException { 

     TypeCalculatorVisitor visitor = new TypeCalculatorVisitor(); 

     CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver(); 
     combinedTypeSolver.add(new ReflectionTypeSolver()); 

     combinedTypeSolver 
     .add(new JavaParserTypeSolver(new File("..src/javaparser"))); 

     combinedTypeSolver.add(
     new JavaParserTypeSolver(new File("..src/javaparser_pkg2"))); 

     combinedTypeSolver.add(
     new JavaParserTypeSolver(new File("..src/javaparser_pkg3")));  

     CompilationUnit agendaCu = JavaParser.parse(new FileInputStream(
       new File("..src/javaparser/TestClassOne.java"))); 

     agendaCu.accept(visitor, JavaParserFacade.get(combinedTypeSolver)); 

     System.out.println(visitor.getParseResult()); 
    } 

} 

TestClassOne:

import javaparser_pkg2.TestClassTwo; 
import javaparser_pkg3.TestClassThree; 

public class TestClassOne { 
    private TestClassTwo testTwo = new TestClassTwo(); 

    public void test() { 
     TestClassThree three = testTwo.getTestThree(); 
    } 
} 

TestClassTwo:

import javaparser_pkg3.TestClassThree; 

public class TestClassTwo { 
    private int age; 
    private String status; 

    private TestClassThree testThree = new TestClassThree(); 

    public TestClassThree getTestThree() { 
     return testThree; 
    } 
    public void setTestThree(TestClassThree testThree) { 
     this.testThree = testThree; 
    } 
    public int getAge() { 
     return age; 
    } 
    public void setAge(int age) { 
     this.age = age; 
    } 
    public String getStatus() { 
     return status; 
    } 
    public void setStatus(String status) { 
     this.status = status; 
    } 

} 

TestClassThree:

package javaparser_pkg3; 

public class TestClassThree { 
    private String name; 
    private int ID; 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public int getID() { 
     return ID; 
    } 
    public void setID(int iD) { 
     ID = iD; 
    } 

} 

我已经加入TestClassThree的目录combinedTypeResolver(见上文),但仍然不能正常工作:

combinedTypeSolver.add(
      new JavaParserTypeSolver(new File("..src/javaparser_pkg3"))); 

这应该如何正确完成?

感谢和问候!

回答

1

这里是JavaSymbolSolver的mantainer。定义JavaParserTypeSolver实例时,应指向源目录的根目录,因为JavaSymbolSolver将查找考虑该包的源目录根目录中的路径。例如,如果您指定JavaSymbolSolver(new File("/src/foo")),然后查找a.b.C.java类,它将检查是否存在名为/src/foo/a/b/C.java的文件。您不指定软件包目录。如果指定JavaSymbolSolver(new File("/src/foo/a/b")),它会查找不存在的文件src/foo/a/b/a/b/C.java

它有帮助吗?