2010-04-13 11 views
6

Tôi đang viết một trình cắm thêm Eclipse sử dụng JD2 AST ASTParser để phân tích cú pháp phương pháp. Tôi đang tìm trong phương pháp đó để tạo ra một loại đối tượng cụ thể.Tại sao solutionBinding() trả về null mặc dù tôi setResolveBindings (true) trên ASTParser của tôi?

Khi tôi tìm thấy ClassInstanceCreation, tôi gọi getType() trên đó để xem loại nào đang được khởi tạo. Tôi muốn chắc chắn rằng loại được giải quyết hoàn toàn đang được xử lý có một cái tôi nghĩ là vậy, vì vậy tôi nói đối tượng Type kết quả là resolveBinding(). Tôi nhận được null trở lại mặc dù không có lỗi biên dịch và mặc dù tôi đã gọi số setResolveBindings(true) trên số ASTParser của mình. Tôi đã cung cấp ASTParser (thông qua setSource()) ICompilationUnit chứa phương pháp của tôi, do đó trình phân tích cú pháp có quyền truy cập vào toàn bộ bối cảnh không gian làm việc.

final IMethod method = ...; 
final ASTParser parser = ASTParser.newParser(AST.JLS3); 
parser.setResolveBindings(true); 
parser.setSource(method.getCompilationUnit()); 
parser.setSourceRange(method.getSourceRange().getOffset(), method.getSourceRange().getLength()); 
parser.setKind(ASTParser.K_CLASS_BODY_DECLARATIONS); 
final TypeDeclaration astRoot = (TypeDeclaration) parser.createAST(null); 
final ClassInstanceCreation classInstanceCreation = walkAstAndFindMyExpression(astRoot); 
final Type instantiatedType = classInstanceCreation.getType(); 
System.out.println("BINDING: " + instantiatedType.resolveBinding()); 

Tại sao resolveBinding() trả lại null? Làm thế nào tôi có thể nhận được thông tin ràng buộc?

Trả lời

5

Ẩn mình ở dưới cùng của tổng quan về ASTParser.setKind(), ẩn một cách cẩn thận từ những người xử lý sự cố resolveBinding()setResolveBindings(), là báo cáo kết quả

thông tin Binding chỉ tính khi kindK_COMPILATION_UNIT.

(từ the online Javadoc)

Tôi không hiểu ngay tại sao điều này sẽ là trường hợp, nhưng nó dường như chỉ khá rõ ràng về những gì cần phải được khác nhau!

+0

Tôi có trường hợp tương tự với loại K_COMPILATION_UNIT nhưng vẫn resolveBinding() trả về giá trị rỗng. Bất kỳ ý tưởng tại sao? – Dana

+0

Câu trả lời có vẻ là: http://stackoverflow.com/a/5803778/48369 – Dana

+1

Chỉ cần một bình luận muộn về * "tại sao đây là trường hợp" *: nếu bạn phân tích cú pháp nhỏ hơn một đơn vị biên dịch thì bạn không có báo cáo nhập khẩu và do đó độ phân giải ràng buộc có thể không thành công. –