2012-06-18 26 views
5

Tôi đang tìm cách tổng quát để chuyển đổi cá thể org.eclipse.jdt.core.dom.ITypeBinding thành một phiên bản org.eclipse.jdt.core.dom.Type. Mặc dù tôi cảm thấy có một số cuộc gọi API để thực hiện việc này, tôi không thể định vị được một cuộc gọi.Chuyển đổi Eclipse JDT ITypeBinding thành Loại

Dường như có nhiều cách khác nhau để thực hiện việc này theo cách thủ công tùy thuộc vào loại cụ thể.

Có cách nào chung để chụp ITypeBinding và nhận được Type mà không có tất cả các trường hợp đặc biệt này không? Lấy một số String và trả về số Type cũng sẽ được chấp nhận.

Cập nhật

Từ phản ứng cho đến nay, dường như tôi phải xử lý tất cả những trường hợp đặc biệt. Đây là một nỗ lực đầu tiên làm như vậy. Tôi chắc chắn điều này không hoàn toàn chính xác, do đó, giám sát được đánh giá cao:

public static Type typeFromBinding(AST ast, ITypeBinding typeBinding) { 
    if(ast == null) 
     throw new NullPointerException("ast is null"); 
    if(typeBinding == null) 
     throw new NullPointerException("typeBinding is null"); 

    if(typeBinding.isPrimitive()) { 
     return ast.newPrimitiveType(
      PrimitiveType.toCode(typeBinding.getName())); 
    } 

    if(typeBinding.isCapture()) { 
     ITypeBinding wildCard = typeBinding.getWildcard(); 
     WildcardType capType = ast.newWildcardType(); 
     ITypeBinding bound = wildCard.getBound(); 
     if(bound != null) { 
      capType.setBound(typeFromBinding(ast, bound)), 
       wildCard.isUpperbound()); 
     } 
     return capType; 
    } 

    if(typeBinding.isArray()) { 
     Type elType = typeFromBinding(ast, typeBinding.getElementType()); 
     return ast.newArrayType(elType, typeBinding.getDimensions()); 
    } 

    if(typeBinding.isParameterizedType()) { 
     ParameterizedType type = ast.newParameterizedType(
      typeFromBinding(ast, typeBinding.getErasure())); 

     @SuppressWarnings("unchecked") 
     List<Type> newTypeArgs = type.typeArguments(); 
     for(ITypeBinding typeArg : typeBinding.getTypeArguments()) { 
      newTypeArgs.add(typeFromBinding(ast, typeArg)); 
     } 

     return type; 
    } 

    // simple or raw type 
    String qualName = typeBinding.getQualifiedName(); 
    if("".equals(qualName)) { 
     throw new IllegalArgumentException("No name for type binding."); 
    } 
    return ast.newSimpleType(ast.newName(qualName)); 
} 
+1

Có một lỗi nhỏ: _capType.setBound (typeFromBinding (ast, ** wildCard.getBound() **), wildCard.isUpperbound()); _ Nếu typeBinding là một bộ sưu tập thô, wildCard.getBound() sẽ trả về null và phương thức sẽ thất bại trong việc tạo ra một kiểu cho một tình huống hợp lệ. Bạn chỉ cần kiểm tra các ràng buộc và không đặt nó để sửa mã. – taksan

Trả lời

2

Tôi vừa tìm ra giải pháp thay thế có thể thích hợp hơn. Bạn có thể sử dụng org.eclipse.jdt.core.dom.rewrite.ImportRewrite, quản lý các câu lệnh nhập của một đơn vị biên dịch. Sử dụng Type addImport (ITypeBinding, AST), bạn có thể tạo một nút Type mới, nhập vào các mục nhập hiện có và thêm những cái mới nếu cần thiết.

+0

Bởi vì tôi đã bị ảnh hưởng bởi điều này: ImportRewrite có yêu cầu "AST phải được tạo ra từ một ICompilationUnit, có nghĩa là ASTParser.setSource (ICompilationUnit) đã được sử dụng khi tạo AST". – sevenforce

0

Tôi không chắc chắn bạn muốn làm gì với đối tượng 'Loại' hoặc lý do bạn cần.

  • Nếu bạn cần nói nút tuyên bố cho TypeBinding tức là một nút Loại hiện - bạn có thể sử dụng http://wiki.eclipse.org/JDT/FAQ#From_an_IBinding_to_its_declaring_ASTNode

  • Tuy nhiên, nếu bạn cần một ASTNode mới được sử dụng để thay đổi nguồn qua ASTRewrite sau đó bạn phải tự tay làm thủ công và xử lý tất cả các trường hợp. Lưu ý rằng bạn không cần xử lý tất cả các loại phụ của 'Loại' trong mọi tình huống, ví dụ: UnionType (Java 7) chỉ liên quan đến các khối catch.

+0

Tôi cần nó cho 'ASTRewrite', nơi tôi muốn nắm bắt kết quả biểu thức thành một biến mới thông qua gán nội tuyến mà không thay đổi loại biểu thức. –

+0

Tôi đã cập nhật câu hỏi với mã tiềm năng để xử lý các trường hợp. Bạn có thể đề nghị bất kỳ trường hợp tôi đã bỏ lỡ? –

+0

Từ một cái nhìn nhanh, có vẻ ổn với tôi. –

Các vấn đề liên quan