我想为IntelliJ IDEA创建自定义代码检查规则。如果方法调用的特殊注释参数类型等同于方法签名的参数类型,则规则应检查。
示例:
public void method(@MyAnnotation String input){
}
public void method2(){
String invalid = "";
method(invalid); // error
@MyAnnotation String valid = (@MyAnnotation String) "";
method(valid); // no error
}
我尝试了什么:
[...]
protected static class visitor extends JavaElementVisitor {
@Override
public void visitMethodCallExpression(PsiMethodCallExpression expression) {
PsiMethod method = expression.resolveMethod();
//returns no annotations
PsiAnnotation[] annotations = method.getModifierList().getAnnotations();
//returns also no annotations
MethodSignatureBackedByPsiMethod methodSignature = MethodSignatureBackedByPsiMethod.create(method, PsiSubstitutor.EMPTY);
PsiType[] types = methodSignature.getParameterTypes();
for (PsiType psiType : types){
TypeAnnotationProvider provider = psiType.getAnnotationProvider();
PsiAnnotation[] annotations = provider.getAnnotations();
}
super.visitMethodCallExpression(expression);
}
[...]
}
如何将参数类型的注释与方法的参数类型的注释进行比较?
谢谢!
答案 0 :(得分:0)
method.getModifierList()
返回方法的修饰符列表,但该方法未注释。您需要参数的注释。所以你需要做这样的事情:
method.getParameterList().getParameters()[indexOfParameter].getModifierList()
要获取方法调用的参数的注释,请执行以下操作:
PsiExpression argument = expression.getArgumentList().getExpressions()[indexOfArgument];
argument = PsiUtil.skipParenthesizedExprDown(argument);
if (argument instanceof PsiReferenceExpression) {
PsiElement target = ((PsiReferenceExpression)argument).resolve();
if (target instanceof PsiVariable) {
((PsiVariable)target).getModifierList();
// get annotations
}
}