mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
EA-37403 (NPE: ReflectionForUnavailableAnnotationInspection$ReflectionForUnavailableAnnotationVisitor.visitMethodCallExpression)
This commit is contained in:
+20
-33
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2006-2010 Dave Griffith, Bas Leijdekkers
|
||||
* Copyright 2006-2012 Dave Griffith, Bas Leijdekkers
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -23,21 +23,18 @@ import com.siyeh.ig.psiutils.TypeUtils;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class ReflectionForUnavailableAnnotationInspection
|
||||
extends BaseInspection {
|
||||
public class ReflectionForUnavailableAnnotationInspection extends BaseInspection {
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getDisplayName() {
|
||||
return InspectionGadgetsBundle.message(
|
||||
"reflection.for.unavailable.annotation.display.name");
|
||||
return InspectionGadgetsBundle.message("reflection.for.unavailable.annotation.display.name");
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String buildErrorString(Object... infos) {
|
||||
return InspectionGadgetsBundle.message(
|
||||
"reflection.for.unavailable.annotation.problem.descriptor");
|
||||
return InspectionGadgetsBundle.message("reflection.for.unavailable.annotation.problem.descriptor");
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -50,19 +47,14 @@ public class ReflectionForUnavailableAnnotationInspection
|
||||
return new ReflectionForUnavailableAnnotationVisitor();
|
||||
}
|
||||
|
||||
private static class ReflectionForUnavailableAnnotationVisitor
|
||||
extends BaseInspectionVisitor {
|
||||
private static class ReflectionForUnavailableAnnotationVisitor extends BaseInspectionVisitor {
|
||||
|
||||
@Override
|
||||
public void visitMethodCallExpression(
|
||||
@NotNull PsiMethodCallExpression expression) {
|
||||
public void visitMethodCallExpression(@NotNull PsiMethodCallExpression expression) {
|
||||
super.visitMethodCallExpression(expression);
|
||||
final PsiReferenceExpression methodExpression =
|
||||
expression.getMethodExpression();
|
||||
@NonNls final String methodName =
|
||||
methodExpression.getReferenceName();
|
||||
if (!"isAnnotationPresent".equals(methodName) &&
|
||||
!"getAnnotation".equals(methodName)) {
|
||||
final PsiReferenceExpression methodExpression = expression.getMethodExpression();
|
||||
@NonNls final String methodName = methodExpression.getReferenceName();
|
||||
if (!"isAnnotationPresent".equals(methodName) && !"getAnnotation".equals(methodName)) {
|
||||
return;
|
||||
}
|
||||
final PsiExpressionList argumentList = expression.getArgumentList();
|
||||
@@ -77,36 +69,28 @@ public class ReflectionForUnavailableAnnotationInspection
|
||||
if (!(arg instanceof PsiClassObjectAccessExpression)) {
|
||||
return;
|
||||
}
|
||||
final PsiExpression qualifier =
|
||||
methodExpression.getQualifierExpression();
|
||||
if (!TypeUtils.expressionHasTypeOrSubtype(qualifier,
|
||||
"java.lang.reflect.AnnotatedElement")) {
|
||||
final PsiExpression qualifier = methodExpression.getQualifierExpression();
|
||||
if (!TypeUtils.expressionHasTypeOrSubtype(qualifier, "java.lang.reflect.AnnotatedElement")) {
|
||||
return;
|
||||
}
|
||||
final PsiClassObjectAccessExpression classObjectAccessExpression =
|
||||
(PsiClassObjectAccessExpression)arg;
|
||||
final PsiTypeElement operand =
|
||||
classObjectAccessExpression.getOperand();
|
||||
final PsiClassObjectAccessExpression classObjectAccessExpression = (PsiClassObjectAccessExpression)arg;
|
||||
final PsiTypeElement operand = classObjectAccessExpression.getOperand();
|
||||
|
||||
final PsiClassType annotationClassType =
|
||||
(PsiClassType)operand.getType();
|
||||
final PsiClassType annotationClassType = (PsiClassType)operand.getType();
|
||||
final PsiClass annotationClass = annotationClassType.resolve();
|
||||
if (annotationClass == null) {
|
||||
return;
|
||||
}
|
||||
final PsiModifierList modifierList =
|
||||
annotationClass.getModifierList();
|
||||
final PsiModifierList modifierList = annotationClass.getModifierList();
|
||||
if (modifierList == null) {
|
||||
return;
|
||||
}
|
||||
final PsiAnnotation retentionAnnotation =
|
||||
modifierList.findAnnotation("java.lang.annotation.Retention");
|
||||
final PsiAnnotation retentionAnnotation = modifierList.findAnnotation("java.lang.annotation.Retention");
|
||||
if (retentionAnnotation == null) {
|
||||
registerError(arg);
|
||||
return;
|
||||
}
|
||||
final PsiAnnotationParameterList parameters =
|
||||
retentionAnnotation.getParameterList();
|
||||
final PsiAnnotationParameterList parameters = retentionAnnotation.getParameterList();
|
||||
final PsiNameValuePair[] attributes = parameters.getAttributes();
|
||||
for (PsiNameValuePair attribute : attributes) {
|
||||
@NonNls final String name = attribute.getName();
|
||||
@@ -114,6 +98,9 @@ public class ReflectionForUnavailableAnnotationInspection
|
||||
continue;
|
||||
}
|
||||
final PsiAnnotationMemberValue value = attribute.getValue();
|
||||
if (value == null) {
|
||||
continue;
|
||||
}
|
||||
@NonNls final String text = value.getText();
|
||||
if (!text.contains("RUNTIME")) {
|
||||
registerError(arg);
|
||||
|
||||
Reference in New Issue
Block a user