Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert Eclipse JDT ITypeBinding to a Type

I'm looking for a general way to convert an org.eclipse.jdt.core.dom.ITypeBinding instance to an org.eclipse.jdt.core.dom.Type instance. Although I feel there should be some API call to do this, I cannot locate one.

There appear to be various ways to do this manually depending on the specific type.

Is there any general way to take an ITypeBinding and get a Type without all of these special cases? Taking a String and returning a Type would also be acceptable.

Update

From the response so far, it appears I do have to handle all these special cases. Here is a first attempt at doing so. I'm sure this is not completely correct so scrutiny is appreciated:

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));
}
like image 954
Jake Cobb Avatar asked Nov 04 '22 21:11

Jake Cobb


1 Answers

I've just found an alternative solution which might be preferable. You could use org.eclipse.jdt.core.dom.rewrite.ImportRewrite, which manages import statements of a compilation unit. Using Type addImport(ITypeBinding,AST), you can create a new Type node taking existing imports into account and adding new ones if necessary.

like image 110
ruediste Avatar answered Nov 12 '22 10:11

ruediste