2017-12-07 2 views
0

IntelliJ IDEA에 대한 사용자 정의 코드 검사 규칙을 생성하려고합니다. 이 규칙은 메소드 호출의 특수 주석 인자 유형이 메소드 서명의 매개 변수 유형과 동일한 지 여부를 확인해야합니다.메소드 서명에 대한 코드 검사

예 :

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

가 어떻게 메서드의 매개 변수 형식의 주석 인수 형식의 주석을 비교할 수 있습니다 내가 뭘하려

public void method(@MyAnnotation String input){ 
} 

public void method2(){ 
    String invalid = ""; 
    method(invalid); // error 

    @MyAnnotation String valid = (@MyAnnotation String) ""; 
    method(valid); // no error 
} 

?

감사합니다.

답변

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

감사합니다! 이것은 메소드의 매개 변수에 적용됩니다. 메소드 호출의 인수에 대해서는'expression.getArgumentList()'를 먼저 수행합니다. 특수 효과를 어디서 얻을 수 있습니까? – Stefan

+0

메소드 인수의 주석을 가져 오기 위해 예제로 내 대답을 확장했습니다. –

관련 문제