方法签名的代码检查

时间:2017-12-07 16:10:27

标签: java intellij-idea intellij-plugin code-inspection

我想为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);
    }
[...]
}

如何将参数类型的注释与方法的参数类型的注释进行比较?

谢谢!

1 个答案:

答案 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
  }
}