2016-08-03 7 views
0

申し訳ありませんが、私が取り組んでいるプラグインでは、注釈に渡されるパラメータの値を取得する必要があります。 PsiAnnotationMemberValueをPsiLiteralにキャストし、getValue()を呼び出す必要があるという#idea-users freenodeチャネルの解決策を得ました。これはプリミティブやStringsのようなものでは機能しましたが、現在はカスタムのenum値を取得しようとしています。私はそれを行うことを試みたときに、私のコードは次のエラーメッセージでClassCastExceptionが投げた:PsiAnnotationMemberValueから実際のオブジェクトを取得するIntelliJプラグイン開発

java.lang.ClassCastException: com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl cannot be cast to com.intellij.psi.PsiLiteral 

コード:

@Override 
public boolean eventIgnoresCancelled(PsiMethod method) { 

    PsiLiteral literal = null; 

    for (PsiAnnotation annotation : method.getModifierList().getAnnotations()) { 
     if(annotation.getQualifiedName().contains("IsCancelled")) { 
      literal = ((PsiLiteral) annotation.findAttributeValue("value")); 
     } 
    } 

    if(literal == null || literal.getValue() == null) { 
     return false; 
    } 
    Object tristateValue = literal.getValue(); 
    try { 
     String name = (String) tristateValue.getClass().getMethod("name").invoke(tristateValue); 
     return name.equalsIgnoreCase("TRUE") || name.equalsIgnoreCase("UNDEFINED"); 
    } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { 
     e.printStackTrace(); 
    } 
    return false; 
} 
+0

コードを投稿してください。 – Shriram

答えて

1

あなたのコードは、すべての注釈値がリテラルが、彼らは可能であると仮定してはいけません.classの式、配列、その他のアノテーションなども参照してください。 IDEAのPSIはあなたの列挙型について何も知らないが、PsiReferenceExpressionアノテーション値を与えられれば、その名前(getReferenceName())を調べたり、resolve()したり、getName()メソッドを持つ実際のenum定数にアクセスすることもできます。そして、例外から分かるように、PsiReferenceExpressionオブジェクトを既に持っているので、PsiLiteralに加えてこのケースを処理してください。

関連する問題