2012-06-18 11 views
5

Estoy buscando una forma general de convertir una instancia org.eclipse.jdt.core.dom.ITypeBinding en una instancia org.eclipse.jdt.core.dom.Type. Aunque creo que debería haber alguna llamada API para hacer esto, no puedo encontrar uno.Convertir Eclipse JDT ITypeBinding en un tipo

Parece haber varias maneras de hacerlo manualmente dependiendo del tipo específico.

¿Hay alguna manera general de tomar un ITypeBinding y obtener un Type sin todos estos casos especiales? Tomar un String y devolver un Type también sería aceptable.

actualización

A partir de la respuesta hasta el momento, parece que tengo que manejar todos estos casos especiales. Aquí hay un primer intento de hacerlo. Estoy seguro de que esto no es del todo correcta para el escrutinio se aprecia:

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

Hay un pequeño fallo: _capType.setBound (typeFromBinding (AST, ** wildCard.getBound() **), wildCard.isUpperbound()); _ Si el typeBinding es una colección crudo, wildCard.getBound() devolverá nulo y el método no producirá un tipo para una situación válida. Solo necesita verificar el límite y no configurarlo para corregir el código. – taksan

Respuesta

2

Acabo de encontrar una solución alternativa que podría ser preferible. Puede usar org.eclipse.jdt.core.dom.rewrite.ImportRewrite, que gestiona las declaraciones de importación de una unidad de compilación. Usando Type addImport (ITypeBinding, AST), puede crear un nuevo nodo Tipo tomando en cuenta las importaciones existentes y agregando nuevas si es necesario.

+0

Porque me afectó esto: ImportRewrite tiene el requisito "El AST debe crearse desde una ICompilationUnit, eso significa que ASTParser.setSource (ICompilationUnit) se ha utilizado al crear el AST". – sevenforce

0

No estoy seguro de lo que quiere hacer con el objeto 'Tipo' o por qué lo necesita.

  • Si necesita especificar el nodo de declarar para el TypeBinding es decir, un nodo de tipo existente - se puede utilizar http://wiki.eclipse.org/JDT/FAQ#From_an_IBinding_to_its_declaring_ASTNode

  • Sin embargo, si necesita un nuevo ASTNode que se utiliza para modificar la fuente a través de ASTRewrite entonces tienes que hacerlo tú mismo y manejar todos los casos. Tenga en cuenta que no necesita manejar todos los subtipos de 'Tipo' en todas las situaciones, p. UnionType (Java 7) solo es relevante en los bloques catch.

+0

Lo necesito para 'ASTRewrite', donde quiero capturar el resultado de la expresión en una nueva variable a través de la asignación en línea sin alterar el tipo de la expresión. –

+0

Actualicé la pregunta con un código potencial para manejar los casos. ¿Puedes sugerir algún caso que me haya perdido? –

+0

De un vistazo rápido se ve bien para mí. –

Cuestiones relacionadas