[java-inspections] IDEA-379303 Nullable incompatibilities in constructor calls

GitOrigin-RevId: 927bd8ab332fe6f7c6c122d7670592c7ca141b5a
This commit is contained in:
Mikhail Pyltsin
2026-02-10 16:25:48 +00:00
committed by intellij-monorepo-bot
parent e0fe1c88cf
commit 31b5a6a950
4 changed files with 60 additions and 10 deletions
@@ -233,6 +233,7 @@ public class NullableStuffInspectionBase extends AbstractBaseJavaLocalInspection
@Override
public void visitNewExpression(@NotNull PsiNewExpression expression) {
if (expression.isArrayCreation()) return;
if (checkArguments(expression)) return;
PsiJavaCodeReferenceElement ref = expression.getClassOrAnonymousClassReference();
if (ref == null) return;
if (!(ref.resolve() instanceof PsiClass cls)) return;
@@ -242,8 +243,10 @@ public class NullableStuffInspectionBase extends AbstractBaseJavaLocalInspection
if (list == null) return;
if (!(expression.getType() instanceof PsiClassType type) || type.getParameterCount() != 1) return;
PsiType typeParameter = type.getParameters()[0];
if (!(typeParameter instanceof PsiClassType classType) ||
DfaPsiUtil.getTypeNullability(typeParameter) != Nullability.NOT_NULL) return;
if (!(typeParameter instanceof PsiClassType classType) ||
DfaPsiUtil.getTypeNullability(typeParameter) != Nullability.NOT_NULL) {
return;
}
boolean matched = switch (qualifiedName) {
case "java.util.concurrent.atomic.AtomicReference" -> list.getExpressionCount() == 0;
case "java.util.concurrent.atomic.AtomicReferenceArray" ->
@@ -252,7 +255,7 @@ public class NullableStuffInspectionBase extends AbstractBaseJavaLocalInspection
default -> false;
};
if (!matched) return;
AddTypeAnnotationFix fix = null;
if (classType.getPsiContext() instanceof PsiJavaCodeReferenceElement typeRef &&
typeRef.getParent() instanceof PsiTypeElement typeElement && typeElement.getType().equals(classType) &&
@@ -613,23 +616,29 @@ public class NullableStuffInspectionBase extends AbstractBaseJavaLocalInspection
@Override
public void visitCallExpression(@NotNull PsiCallExpression callExpression) {
checkArguments(callExpression);
}
private boolean checkArguments(@NotNull PsiCallExpression callExpression) {
PsiExpressionList argList = callExpression.getArgumentList();
JavaResolveResult result = callExpression.resolveMethodGenerics();
PsiMethod method = (PsiMethod)result.getElement();
if (method == null || argList == null) return;
if (method == null || argList == null) return false;
PsiSubstitutor substitutor = result.getSubstitutor();
PsiParameter[] parameters = method.getParameterList().getParameters();
PsiExpression[] arguments = argList.getExpressions();
boolean found = false;
for (int i = 0; i < arguments.length; i++) {
PsiExpression argument = arguments[i];
if (i < parameters.length &&
(i < parameters.length - 1 || !MethodCallInstruction.isVarArgCall(method, substitutor, arguments, parameters))) {
PsiType expectedType = substitutor.substitute(parameters[i].getType());
checkNestedGenericClasses(holder, argument, expectedType, argument.getType(),
ConflictNestedTypeProblem.ASSIGNMENT_NESTED_TYPE_PROBLEM);
found |= checkNestedGenericClasses(holder, argument, expectedType, argument.getType(),
ConflictNestedTypeProblem.ASSIGNMENT_NESTED_TYPE_PROBLEM);
}
}
return found;
}
};
}