2016-08-03 1 views
0

Хорошо, поэтому в плагине, над которым я работаю, мне нужно получить значение параметров, переданных в аннотацию. Мне было предоставлено решение на канале # idea-users freenode, поскольку я должен был передать PsiAnnotationMemberValue в PsiLiteral и вызвать getValue(). И хотя это сработало для примитивов и для таких вещей, как Strings, теперь я пытаюсь получить пользовательское значение enum. И когда я попытался сделать это, мой код бросил ClassCastException со следующим сообщением об ошибке:Плагин разработки IntelliJ, получающий фактический объект от PsiAnnotationMemberValue

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 выражениями, массивами, другими аннотациями и т. д. И ссылками. IDSI PSI ничего не знает о ваших перечислениях, но с учетом значения аннотации PsiReferenceExpression вы можете проверить его имя (getReferenceName()) или даже разрешить() и перейти к фактической константе перечисления, которая также имеет метод getName(). И, как видно из исключения, у вас уже есть объект PsiReferenceExpression, поэтому, пожалуйста, просто обработайте этот случай в дополнение к PsiLiteral.

Смежные вопросы