K2: don't count use-sites of Java type parameter with nullable bounds as not null

This commit is contained in:
Mikhail Glukhikh
2024-03-08 13:41:25 +01:00
committed by Space Team
parent d353fd400d
commit c4bcdc42c1
14 changed files with 413 additions and 70 deletions
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.load.java.typeEnhancement
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
import org.jetbrains.kotlin.load.java.AbstractAnnotationTypeQualifierResolver
import org.jetbrains.kotlin.load.java.AnnotationQualifierApplicabilityType
import org.jetbrains.kotlin.load.java.JavaDefaultQualifiers
import org.jetbrains.kotlin.load.java.JavaTypeQualifiersByElementType
import org.jetbrains.kotlin.name.FqNameUnsafe
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
@@ -112,14 +113,14 @@ abstract class AbstractSignatureParts<TAnnotation : Any> {
// happens if T is bounded by @NotNull (technically !! is redundant) or context says unannotated
// type parameters are non-null;
// T - NOT_NULL, isNotNullTypeParameter = false
// happens if T is bounded by @Nullable (should it?) or context says unannotated types in general are non-null;
// happens if T is bounded by @Nullable (should it? see *) or context says unannotated types in general are non-null;
// T? - NULLABLE, isNotNullTypeParameter = false
// happens if context says unannotated types in general are nullable.
// (*) in this questionable case K1 counts parameter use-sites as not null, and K2 as flexible if has no other context
// see getDefaultNullability implementations
// For other types, this is more straightforward (just take nullability from the context).
// TODO: clean up the representation of those cases in JavaTypeQualifiers
val defaultNullability =
referencedParameterBoundsNullability?.copy(qualifier = NullabilityQualifier.NOT_NULL)
?: defaultTypeQualifier?.nullabilityQualifier
val defaultNullability = getDefaultNullability(referencedParameterBoundsNullability, defaultTypeQualifier)
val definitelyNotNull =
referencedParameterBoundsNullability?.qualifier == NullabilityQualifier.NOT_NULL ||
(typeParameterUse != null && defaultTypeQualifier?.definitelyNotNull == true)
@@ -132,6 +133,11 @@ abstract class AbstractSignatureParts<TAnnotation : Any> {
return JavaTypeQualifiers(result?.qualifier, annotationsMutability, definitelyNotNull, result?.isForWarningOnly == true)
}
protected abstract fun getDefaultNullability(
referencedParameterBoundsNullability: NullabilityQualifierWithMigrationStatus?,
defaultTypeQualifiers: JavaDefaultQualifiers?
): NullabilityQualifierWithMigrationStatus?
private fun mostSpecific(
a: NullabilityQualifierWithMigrationStatus?,
b: NullabilityQualifierWithMigrationStatus?
@@ -278,4 +278,12 @@ private class SignatureParts(
override val TypeParameterMarker.isFromJava: Boolean
get() = this is LazyJavaTypeParameterDescriptor
override fun getDefaultNullability(
referencedParameterBoundsNullability: NullabilityQualifierWithMigrationStatus?,
defaultTypeQualifiers: JavaDefaultQualifiers?
): NullabilityQualifierWithMigrationStatus? {
return referencedParameterBoundsNullability?.copy(qualifier = NullabilityQualifier.NOT_NULL)
?: defaultTypeQualifiers?.nullabilityQualifier
}
}