方法签名的代码检查

Code Inspection for method signatures

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

如何比较参数类型的注释和方法的参数类型的注释?

谢谢!

method.getModifierList() returns 方法的修饰符列表,但是方法没有注解。您需要参数的注释。所以你需要做这样的事情:

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