[java-analysis] IDEA-375487 Nullability doesn't work for captured wildcard type

(cherry picked from commit ff31ea679c0497709d0141a3ecfbf988600872e3)

IJ-CR-168211

GitOrigin-RevId: c8c22fcb6a61fe816280f0dbe434f75199b3d850
This commit is contained in:
Tagir Valeev
2025-07-04 13:44:00 +02:00
committed by intellij-monorepo-bot
parent 46136163d4
commit eabc1a5902
3 changed files with 40 additions and 6 deletions

View File

@@ -14,6 +14,7 @@ public final class PsiCapturedWildcardType extends PsiType.Stub {
private final @NotNull PsiWildcardType myExistential;
private final @NotNull PsiElement myContext;
private final @Nullable PsiTypeParameter myParameter;
private @Nullable TypeNullability myNullability;
private PsiType myUpperBound;
@@ -24,17 +25,19 @@ public final class PsiCapturedWildcardType extends PsiType.Stub {
public static @NotNull PsiCapturedWildcardType create(@NotNull PsiWildcardType existential,
@NotNull PsiElement context,
@Nullable PsiTypeParameter parameter) {
return new PsiCapturedWildcardType(existential, context, parameter);
return new PsiCapturedWildcardType(existential, context, parameter, null);
}
private PsiCapturedWildcardType(@NotNull PsiWildcardType existential,
@NotNull PsiElement context,
@Nullable PsiTypeParameter parameter) {
@Nullable PsiTypeParameter parameter,
@Nullable TypeNullability nullability) {
super(TypeAnnotationProvider.EMPTY);
myExistential = existential;
myContext = context;
myParameter = parameter;
myUpperBound = getJavaLangObject(myContext.getManager(), getResolveScope());
myNullability = nullability;
}
private static final RecursionGuard<Object> guard = RecursionManager.createGuard("captureGuard");
@@ -88,13 +91,17 @@ public final class PsiCapturedWildcardType extends PsiType.Stub {
@Override
public @NotNull TypeNullability getNullability() {
return myExistential.getNullability();
if (myNullability == null) {
myNullability = myExistential.getNullability();
}
return myNullability;
}
@Override
public @NotNull PsiType withNullability(@NotNull TypeNullability nullability) {
PsiWildcardType newExistential = myExistential.withNullability(nullability);
return newExistential.equals(myExistential) ? this : new PsiCapturedWildcardType(newExistential, myContext, myParameter);
PsiCapturedWildcardType type = new PsiCapturedWildcardType(myExistential, myContext, myParameter, nullability);
type.setUpperBound(myUpperBound);
return type;
}
@Override