5

org.eclipse.jdt.core.dom.ITypeBindingインスタンスをインスタンスに変換する一般的な方法を探していorg.eclipse.jdt.core.dom.Typeます。これを行うにはAPI呼び出しが必要だと思いますが、見つけることができません。

特定のタイプに応じて、これを手動で行うさまざまな方法があるようです。

これらの特別なケースをすべて使わずに、ITypeBindingを取得する一般的な方法はありますか?Typeを取り、Stringを返すTypeことも許容されます。

アップデート

これまでの回答から、私はこれらすべての特殊なケースを処理する必要があるようです。これがそうする最初の試みです。これは完全には正しくないと確信しているので、精査することをお勧めします。

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

望ましい代替ソリューションを見つけました。コンパイル単位の import ステートメントを管理するorg.eclipse.jdt.core.dom.rewrite.ImportRewriteを使用できます。Type addImport(ITypeBinding,AST) を使用すると、既存のインポートを考慮して新しい Type ノードを作成し、必要に応じて新しいインポートを追加できます。

于 2013-09-24T08:33:50.343 に答える
0

「Type」オブジェクトで何をしたいのか、なぜそれが必要なのかわかりません。

  • TypeBinding の宣言ノード、つまり既存の Type ノードを言う必要がある場合は、http: //wiki.eclipse.org/JDT/FAQ#From_an_IBinding_to_its_declaring_ASTNode を使用できます。

  • ただし、ASTRewrite を介してソースを変更するために新しい ASTNode を使用する必要がある場合は、それを自分で作成し、すべてのケースを処理する必要があります。すべての状況で「Type」のすべてのサブタイプを処理する必要はないことに注意してください。たとえば、UnionType (Java 7) は catch ブロックでのみ関連します。

于 2012-06-19T01:29:54.173 に答える