2012-06-18 7 views
5

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

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

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

は小さなバグがあります: _capType.setBound(typeFromBinding(AST、** wildCard.getBound()**)、wildCard.isUpperbound()); _ typeBindingは生コレクション、wildCard.getBoundをされた場合()はnullを返し、メソッドは有効な状況の型を生成できません。あなたはバインドをチェックし、コードを修正するためにそれを設定しないでください。 – taksan

答えて

2

これまでのところ、別の解決策が見つかっただけです。コンパイル単位のインポート文を管理するorg.eclipse.jdt.core.dom.rewrite.ImportRewriteを使用できます。 Type addImport(ITypeBinding、AST)を使用すると、既存のインポートを考慮して新しいタイプノードを作成し、必要に応じて新しいタイプノードを追加できます。

+0

私はこの影響を受けたため、ImportRewriteには「ASTをICompilationUnitから作成する必要があります。つまり、ASTを作成するときにASTParser.setSource(ICompilationUnit)が使用されました」という要件があります。 – sevenforce

0

私はあなたが「種類」オブジェクトか、なぜあなたがそれを必要と何をしたいのかわかりません。

  • あなたはすなわち、既存の型ノードTypeBindingのための宣言ノードを言う必要がある場合 - あなたは、あなたをASTRewriteを介してソースを変更するために使用される新しいASTノードが必要な場合は、しかしhttp://wiki.eclipse.org/JDT/FAQ#From_an_IBinding_to_its_declaring_ASTNode

  • を使用することができますそれを手作りしてすべてのケースを処理しなければなりません。すべての状況で 'タイプ'のすべてのサブタイプを処理する必要はありません。 UnionType(Java 7)はcatchブロックにのみ関係します。

+0

'ASTRewrite'では、式の型を変更することなく、式の結果をインラインで代入して新しい変数に取り込む必要があります。 –

+0

ケースを処理する潜在的なコードで質問を更新しました。あなたは私が逃した事件を提案できますか? –

+0

クイックな一見から私は大丈夫です。 –

関連する問題