2017-12-20 14 views
0

이있는 경우 널 (null) : 이클립스 JDT AST 구문 분석 반환 서명하는 방법을 구문 분석 할 때 방법은 제네릭 형식

<T> T get(int index); 

는 호출 :

c.<Object>get(1); 

위한 MethodInvocation. resolveMethodBinding()resolveTypeBinding() 인 경우 null을 반환하십시오.

그러나

c.get(1); 

호출하는 경우 나는 모든 scnearios 바인딩을 할 수있는 방법을 찾을 필요가 바인딩을 반환합니다.

전체 경우 :

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 요구를 지정할 수 있기 때문에

답변

0

사실,은 다음과 같습니다

Hashtable<String, String> options = JavaCore.getOptions(); 
options.put(JavaCore.COMPILER_SOURCE, "1.8"); 
parser.setCompilerOptions(options);