2017-12-07 5 views
0

Ich möchte eine benutzerdefinierte Codeüberprüfungsregel für IntelliJ IDEA erstellen. Die Regel sollte prüfen, ob ein spezieller annotierter Argumenttyp eines Methodenaufrufs dem Parametertyp der Methodensignatur entspricht.Codeüberprüfung für Methodensignaturen

Beispiel:

public void method(@MyAnnotation String input){ 
} 

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

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

Was ich versucht:

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

Wie kann ich die Anmerkung des Arguments Typ mit der Anmerkung des Parameters Art des Verfahrens zu vergleichen?

Danke!

Antwort

0

method.getModifierList() gibt die Modifikatorliste der Methode zurück, die Methode ist jedoch nicht mit Anmerkungen versehen. Sie möchten die Annotation des Parameters. So müssen Sie so etwas wie dies tun:

method.getParameterList().getParameters()[indexOfParameter].getModifierList() 

Um die Anmerkungen eines Arguments von einem Methodenaufruf zu erhalten, tun Sie etwas wie folgt aus:

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

Thank you! Dies funktioniert für die Parameter der Methode. Für die Argumente des Methodenaufrufs würde ich zuerst 'expression.getArgumentList()' eingeben. Woher bekomme ich die Anmerkungen? – Stefan

+0

Ich habe meine Antwort mit einem Beispiel erweitert, um die Anmerkungen eines Methodenarguments zu erhalten. –

Verwandte Themen