Я использую JavaParser (из javaparser.org) и javasymbolsolver для анализа Java.
У меня есть простой источник Java, который обращается к File.separator
(см. Многострочную строку в источнике);Я хочу, чтобы моя программа печатала java.io.File.fileseparator
.Вместо этого он печатает File.separator
, и я получаю UnsolvedSymbolException{context='File', name='Solving File'}
;затем он печатает System.out
, и я получаю UnsolvedSymbolException{context='System', name='Solving System'}
.
@Test
public void parserTest() {
CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
combinedTypeSolver.add(new ReflectionTypeSolver());
JavaSymbolSolver symbolSolver = new JavaSymbolSolver(combinedTypeSolver);
JavaParser.getStaticConfiguration().setSymbolResolver(symbolSolver);
CompilationUnit compilationUnit = JavaParser.parse(
"import java.io.File;\n" +
"\n" +
"public class Main {\n" +
" static String s = File.separator;\n" +
" public static void main(String args[]) {\n" +
" System.out.println(s);\n" +
" }\n" +
"}\n");
compilationUnit.accept(
new ModifierVisitor<Void>() {
@Override
public Visitable visit(final FieldAccessExpr n, final Void arg) {
System.out.println(n);
try { // this does not work!!!
System.out.println(n.getScope().calculateResolvedType());
} catch (Exception e) {
e.printStackTrace();
}
return super.visit(n, arg);
}
},
null
);
}
Как я понимаю, где-то глубоко в Java Symbol Solver он пытается разрешить File как значение, и, конечно, не удается.
Как получить полное имя поля?