gpt4 book ai didi

java - IntelliJ 插件开发从 PsiAnnotationMemberValue 获取实际对象

转载 作者:行者123 更新时间:2023-12-01 09:37:31 26 4
gpt4 key购买 nike

好吧,所以在我正在开发的插件中,我需要获取传递给注释的参数值。 #idea-users freenode channel 上给了我一个解决方案,即我应该将 PsiAnnotationMemberValue 转换为 PsiLiteral,并调用 getValue()。虽然这适用于基元和字符串之类的东西,但现在我正在尝试获取自定义枚举值。当我尝试这样做时,我的代码抛出了 ClassCastException 并显示以下错误消息:

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

最佳答案

您的代码不应假定所有注释值都是文字,它们也可以是 .class 表达式、数组、其他注释等和引用。 IDEA 的 PSI 对您的枚举一无所知,但给定 PsiReferenceExpression 注释值,您可以检查其名称 (getReferenceName()),甚至可以执行resolve() 并获取也具有 getName() 方法的实际枚举常量。并且,从异常中可以看出,您已经有了 PsiReferenceExpression 对象,因此除了 PsiLiteral 之外,请只处理这种情况。

关于java - IntelliJ 插件开发从 PsiAnnotationMemberValue 获取实际对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38734995/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com