mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[java-inspections] IDEA-257106 @NotNull Parameters overriding non-annotated reports false positives for generic methods
GitOrigin-RevId: fe24523eaaccfef34a3b394ad29337d065f1d786
This commit is contained in:
committed by
intellij-monorepo-bot
parent
bd79ee1b72
commit
dc9c7b84fd
+18
-1
@@ -30,6 +30,8 @@ import com.intellij.psi.search.searches.OverridingMethodsSearch;
|
||||
import com.intellij.psi.util.*;
|
||||
import com.intellij.util.ArrayUtilRt;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.siyeh.ig.psiutils.ClassUtils;
|
||||
import com.siyeh.ig.psiutils.TypeUtils;
|
||||
import org.jdom.Element;
|
||||
import org.jetbrains.annotations.Contract;
|
||||
import org.jetbrains.annotations.Nls;
|
||||
@@ -854,7 +856,22 @@ public class NullableStuffInspectionBase extends AbstractBaseJavaLocalInspection
|
||||
if (!REPORT_NOTNULL_PARAMETERS_OVERRIDES_NOT_ANNOTATED) return false;
|
||||
NullabilityAnnotationInfo info = nullableManager.findOwnNullabilityInfo(parameter);
|
||||
return info != null && info.getNullability() == Nullability.NOT_NULL && !info.isInferred() &&
|
||||
ContainerUtil.exists(superParameters, sp -> !hasNullability(nullableManager, sp));
|
||||
ContainerUtil.exists(superParameters, sp -> isSuperNotAnnotated(nullableManager, parameter, sp));
|
||||
}
|
||||
|
||||
private static boolean isSuperNotAnnotated(NullableNotNullManager nullableManager, PsiParameter parameter, PsiParameter superParameter) {
|
||||
if (hasNullability(nullableManager, superParameter)) return false;
|
||||
PsiType type = superParameter.getType();
|
||||
if (TypeUtils.isTypeParameter(type)) {
|
||||
PsiClass childClass = ClassUtils.getContainingClass(parameter);
|
||||
PsiClass superClass = ClassUtils.getContainingClass(superParameter);
|
||||
if (superClass != null && childClass != null) {
|
||||
PsiType substituted =
|
||||
TypeConversionUtil.getSuperClassSubstitutor(superClass, childClass, PsiSubstitutor.EMPTY).substitute(type);
|
||||
return DfaPsiUtil.getTypeNullability(substituted) == Nullability.UNKNOWN;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void checkNullLiteralArgumentOfNotNullParameterUsages(PsiMethod method,
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
import typeUse.*;
|
||||
|
||||
class X {
|
||||
static abstract class Base<T> {
|
||||
abstract void consume(T item);
|
||||
}
|
||||
|
||||
static class Child extends Base<@NotNull String> {
|
||||
@Override
|
||||
void consume(@NotNull String item) {
|
||||
System.out.println(item);
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
Base<@NotNull String> child = new Child();
|
||||
child.consume("this can't be null");
|
||||
child.consume(null);
|
||||
}
|
||||
}
|
||||
+6
@@ -273,6 +273,12 @@ public class NullableStuffInspectionTest extends LightJavaCodeInsightFixtureTest
|
||||
DataFlowInspection8Test.setupTypeUseAnnotations("typeUse", myFixture);
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testOverrideGenericMethod() {
|
||||
myInspection.REPORT_NOTNULL_PARAMETERS_OVERRIDES_NOT_ANNOTATED = true;
|
||||
DataFlowInspection8Test.setupTypeUseAnnotations("typeUse", myFixture);
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testTypeUseNotNullOverriding() {
|
||||
myInspection.REPORT_NOTNULL_PARAMETERS_OVERRIDES_NOT_ANNOTATED = true;
|
||||
|
||||
Reference in New Issue
Block a user