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));
}
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