5

我正在寻找一种将org.eclipse.jdt.core.dom.ITypeBinding实例转换为实例的通用方法org.eclipse.jdt.core.dom.Type。虽然我觉得应该有一些 API 调用来做到这一点,但我找不到一个。

根据具体类型,似乎有多种手动执行此操作的方法。

在没有所有这些特殊情况的情况下,是否有任何一般的方法来获取ITypeBinding和获取?Type接受 aString并返回 aType也是可以接受的。

更新

从目前的回复来看,看来我确实必须处理所有这些特殊情况。这是这样做的第一次尝试。我敢肯定这并不完全正确,因此感谢您的审查:

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

2 回答 2

2

我刚刚找到了一个可能更可取的替代解决方案。您可以使用org.eclipse.jdt.core.dom.rewrite.ImportRewrite,它管理编译单元的导入语句。使用 Type addImport(ITypeBinding,AST),您可以创建一个新的 Type 节点,将现有导入考虑在内,并在必要时添加新的。

于 2013-09-24T08:33:50.343 回答
0

我不确定您想对“类型”对象做什么或为什么需要它。

  • 如果您需要说明 TypeBinding 的声明节点,即现有的 Type 节点 - 您可以使用http://wiki.eclipse.org/JDT/FAQ#From_an_IBinding_to_its_declaring_ASTNode

  • 但是,如果您需要一个新的 ASTNode 用于通过 ASTRewrite 修改源代码,那么您必须自己手工制作并处理所有情况。请注意,您不需要在所有情况下都处理“Type”的所有子类型,例如 UnionType (Java 7) 仅与 catch 块相关。

于 2012-06-19T01:29:54.173 回答