NullableStuffInspection: check overriding params when method is annotated (IDEA-190774)

This commit is contained in:
peter
2018-04-24 13:46:58 +02:00
parent 2d2e21fd6e
commit cc551074c4
2 changed files with 28 additions and 17 deletions
@@ -853,24 +853,18 @@ public class NullableStuffInspectionBase extends AbstractBaseJavaLocalInspection
for (PsiMethod overriding : overridings) {
if (!manager.isInProject(overriding)) continue;
final boolean applicable = AnnotationUtil.isAnnotatingApplicable(overriding, defaultNotNull);
boolean ableToAddNotNullAnnotation = AddAnnotationPsiFix.isAvailable(overriding, defaultNotNull);
if (!methodQuickFixSuggested
&& annotated.isDeclaredNotNull
&& !isNotNullNotInferred(overriding, false, false)
&& (isNullableNotInferred(overriding, false) || !isNullableNotInferred(overriding, true))
&& ableToAddNotNullAnnotation) {
&& AddAnnotationPsiFix.isAvailable(overriding, defaultNotNull)) {
PsiIdentifier identifier = method.getNameIdentifier();//load tree
PsiAnnotation annotation = AnnotationUtil.findAnnotation(method, nullableManager.getNotNulls());
final String[] annotationsToRemove = ArrayUtil.toStringArray(nullableManager.getNullables());
final LocalQuickFix fix;
if (applicable) {
fix = new MyAnnotateMethodFix(defaultNotNull, annotationsToRemove);
}
else {
fix = superMethodApplicable ? null : createChangeDefaultNotNullFix(nullableManager, method);
}
LocalQuickFix fix = AnnotationUtil.isAnnotatingApplicable(overriding, defaultNotNull)
? new MyAnnotateMethodFix(defaultNotNull, annotationsToRemove)
: superMethodApplicable ? null : createChangeDefaultNotNullFix(nullableManager, method);
PsiElement psiElement = annotation;
if (!annotation.isPhysical()) {
@@ -882,12 +876,15 @@ public class NullableStuffInspectionBase extends AbstractBaseJavaLocalInspection
fix);
methodQuickFixSuggested = true;
}
if (hasAnnotatedParameter && ableToAddNotNullAnnotation) {
if (hasAnnotatedParameter) {
PsiParameter[] psiParameters = overriding.getParameterList().getParameters();
for (int i = 0; i < psiParameters.length; i++) {
if (parameterQuickFixSuggested[i]) continue;
PsiParameter parameter = psiParameters[i];
if (parameterAnnotated[i] && !isNotNullNotInferred(parameter, false, false) && !isNullableNotInferred(parameter, false)) {
if (parameterAnnotated[i] &&
!isNotNullNotInferred(parameter, false, false) &&
!isNullableNotInferred(parameter, false) &&
AddAnnotationPsiFix.isAvailable(parameter, defaultNotNull)) {
PsiIdentifier identifier = parameters[i].getNameIdentifier(); //be sure that corresponding tree element available
PsiAnnotation annotation = AnnotationUtil.findAnnotation(parameters[i], nullableManager.getNotNulls());
PsiElement psiElement = annotation;
@@ -895,13 +892,13 @@ public class NullableStuffInspectionBase extends AbstractBaseJavaLocalInspection
psiElement = identifier;
if (psiElement == null) continue;
}
LocalQuickFix fix = AnnotationUtil.isAnnotatingApplicable(parameter, defaultNotNull)
? new AnnotateOverriddenMethodParameterFix(defaultNotNull, nullableManager.getDefaultNullable())
: createChangeDefaultNotNullFix(nullableManager, parameters[i]);
holder.registerProblem(psiElement,
InspectionsBundle.message("nullable.stuff.problems.overridden.method.parameters.are.not.annotated"),
ProblemHighlightType.GENERIC_ERROR_OR_WARNING,
!applicable
? createChangeDefaultNotNullFix(nullableManager, parameters[i])
: new AnnotateOverriddenMethodParameterFix(defaultNotNull,
nullableManager.getDefaultNullable()));
fix);
parameterQuickFixSuggested[i] = true;
}
}
@@ -45,4 +45,18 @@ class A implements I1 {
}
class B extends A implements <warning descr="Non-annotated method 'foo' from 'A' implements non-null method from 'I2'">I2</warning> {
}
}
interface InheritorMethodOverriddenButParameterNot {
@NotNull
Integer get(<warning descr="Overridden method parameters are not annotated">@NotNull</warning> String param);
}
class InheritorMethodOverriddenButParameterNot_Impl implements InheritorMethodOverriddenButParameterNot {
@NotNull
@Override
public Integer get(String <warning descr="Not annotated parameter overrides @NotNull parameter">param</warning>) {
return 1;
}
}