【问题标题】:Code Inspection for method signatures方法签名的代码检查
【发布时间】:2017-12-07 16:10:26
【问题描述】:

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

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 谢谢!这适用于方法的参数。对于方法调用的参数,我会先做expression.getArgumentList()。我从哪里获得注释?
    • 我已经用一个例子扩展了我的答案,以获取方法参数的注释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    相关资源
    最近更新 更多