当方法具有泛型类型时,Eclipse JDT AST 解析 returns null
Eclipse JDT AST parsing returns null when method has a generic type
解析签名方法时:
<T> T get(int index);
调用:
c.<Object>get(1);
MethodInvocation.resolveMethodBinding() and resolveTypeBinding(), return null
.
但是,如果使用
调用,它 return 是一个绑定
c.get(1);
我需要找到一种方法来绑定所有场景。
完整案例:
public class MyTest {
@Test
public void test() throws IOException {
Path path = Paths.get("src/main/java/ab/MyClass.java");
TypeDeclaration typeDeclaration = getTypeDeclaration(path);
typeDeclaration.accept(new ASTVisitor() {
@Override
public boolean visit(MethodInvocation node) {
System.out.println(node.resolveMethodBinding());
System.out.println(node.resolveTypeBinding());
return true;
}
});
}
public static TypeDeclaration getTypeDeclaration(Path path) throws IOException {
ASTParser parser = ASTParser.newParser(AST.JLS9);
String value = new String(Files.readAllBytes(path), UTF_8);
parser.setResolveBindings(true);
parser.setBindingsRecovery(true);
parser.setSource(value.toCharArray());
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setCompilerOptions(JavaCore.getOptions());
parser.setUnitName(path.getFileName().toString());
String[] classpathEntries = {};
String[] sourcepathEntries = { "C:\test\src\main\java" };
parser.setEnvironment(classpathEntries, sourcepathEntries,
new String[] { UTF_8.name() }, true);
final CompilationUnit cu = (CompilationUnit) parser.createAST(null);
return (TypeDeclaration) cu.types().get(0);
}
}
public interface SomeInterface {
<T> T get(int index);
}
public abstract class AbstractClass implements SomeInterface {
}
public class MyClass {
AbstractClass c;
public MyClass() {
c.<Object>get(1);
}
}
类似问题(2017945, 2631981, 12755640)没有相关答案。
其实是因为需要指定COMPILER_SOURCE
:
Hashtable<String, String> options = JavaCore.getOptions();
options.put(JavaCore.COMPILER_SOURCE, "1.8");
parser.setCompilerOptions(options);
解析签名方法时:
<T> T get(int index);
调用:
c.<Object>get(1);
MethodInvocation.resolveMethodBinding() and resolveTypeBinding(), return null
.
但是,如果使用
调用,它 return 是一个绑定c.get(1);
我需要找到一种方法来绑定所有场景。
完整案例:
public class MyTest {
@Test
public void test() throws IOException {
Path path = Paths.get("src/main/java/ab/MyClass.java");
TypeDeclaration typeDeclaration = getTypeDeclaration(path);
typeDeclaration.accept(new ASTVisitor() {
@Override
public boolean visit(MethodInvocation node) {
System.out.println(node.resolveMethodBinding());
System.out.println(node.resolveTypeBinding());
return true;
}
});
}
public static TypeDeclaration getTypeDeclaration(Path path) throws IOException {
ASTParser parser = ASTParser.newParser(AST.JLS9);
String value = new String(Files.readAllBytes(path), UTF_8);
parser.setResolveBindings(true);
parser.setBindingsRecovery(true);
parser.setSource(value.toCharArray());
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setCompilerOptions(JavaCore.getOptions());
parser.setUnitName(path.getFileName().toString());
String[] classpathEntries = {};
String[] sourcepathEntries = { "C:\test\src\main\java" };
parser.setEnvironment(classpathEntries, sourcepathEntries,
new String[] { UTF_8.name() }, true);
final CompilationUnit cu = (CompilationUnit) parser.createAST(null);
return (TypeDeclaration) cu.types().get(0);
}
}
public interface SomeInterface {
<T> T get(int index);
}
public abstract class AbstractClass implements SomeInterface {
}
public class MyClass {
AbstractClass c;
public MyClass() {
c.<Object>get(1);
}
}
类似问题(2017945, 2631981, 12755640)没有相关答案。
其实是因为需要指定COMPILER_SOURCE
:
Hashtable<String, String> options = JavaCore.getOptions();
options.put(JavaCore.COMPILER_SOURCE, "1.8");
parser.setCompilerOptions(options);