FE: do not enhance ? into ? extends @NotNull Object in JSR-305

This is already done in jspecify and makes more sense anyway.
This commit is contained in:
pyos
2021-09-07 11:17:30 +02:00
committed by Victor Petukhov
parent 34ae5387b3
commit f793afbfea
8 changed files with 18 additions and 24 deletions
@@ -12,8 +12,7 @@ import org.jetbrains.kotlin.name.FqName
data class JavaDefaultQualifiers(
val nullabilityQualifier: NullabilityQualifierWithMigrationStatus,
val qualifierApplicabilityTypes: Collection<AnnotationQualifierApplicabilityType>,
val affectsTypeParameterBasedTypes: Boolean = nullabilityQualifier.qualifier == NullabilityQualifier.NOT_NULL,
val affectsStarProjection: Boolean = affectsTypeParameterBasedTypes
val affectsTypeParameterBasedTypes: Boolean = nullabilityQualifier.qualifier == NullabilityQualifier.NOT_NULL
)
val TYPE_QUALIFIER_NICKNAME_FQNAME = FqName("javax.annotation.meta.TypeQualifierNickname")
@@ -34,8 +33,7 @@ val JSPECIFY_DEFAULT_ANNOTATIONS = mapOf(
JSPECIFY_NULL_MARKED to JavaDefaultQualifiers(
NullabilityQualifierWithMigrationStatus(NullabilityQualifier.NOT_NULL),
DEFAULT_JSPECIFY_APPLICABILITY,
affectsTypeParameterBasedTypes = false,
affectsStarProjection = false
affectsTypeParameterBasedTypes = false
)
)
@@ -104,7 +104,7 @@ abstract class AbstractSignatureParts<TAnnotation : Any> {
else -> AnnotationQualifierApplicabilityType.TYPE_USE
}
val defaultTypeQualifier = defaultQualifiers?.get(applicabilityType)
?.takeIf { (it.affectsTypeParameterBasedTypes || typeParameterUse == null) && (it.affectsStarProjection || type != null) }
?.takeIf { (it.affectsTypeParameterBasedTypes || typeParameterUse == null) }
val referencedParameterBoundsNullability = typeParameterUse?.boundsNullability
// For type parameter uses, we have *three* options:
@@ -120,7 +120,7 @@ abstract class AbstractSignatureParts<TAnnotation : Any> {
val defaultNullability =
referencedParameterBoundsNullability?.copy(qualifier = NullabilityQualifier.NOT_NULL)
?: defaultTypeQualifier?.nullabilityQualifier
val isNotNullTypeParameter =
val definitelyNotNull =
referencedParameterBoundsNullability?.qualifier == NullabilityQualifier.NOT_NULL ||
(typeParameterUse != null && defaultTypeQualifier?.nullabilityQualifier?.qualifier == NullabilityQualifier.NOT_NULL)
@@ -134,10 +134,9 @@ abstract class AbstractSignatureParts<TAnnotation : Any> {
substitutedParameterBoundsNullability.copy(qualifier = NullabilityQualifier.FORCE_FLEXIBILITY)
else
substitutedParameterBoundsNullability
type == null -> substitutedParameterBoundsNullability
else -> mostSpecific(substitutedParameterBoundsNullability, defaultNullability)
}
return JavaTypeQualifiers(result?.qualifier, annotationsMutability, isNotNullTypeParameter, result?.isForWarningOnly == true)
return JavaTypeQualifiers(result?.qualifier, annotationsMutability, definitelyNotNull, result?.isForWarningOnly == true)
}
private fun mostSpecific(
@@ -31,11 +31,11 @@ class PredefinedFunctionEnhancementInfo(
)
/** Type is always nullable: `T?` */
private val NULLABLE = JavaTypeQualifiers(NullabilityQualifier.NULLABLE, null, isNotNullTypeParameter = false)
private val NULLABLE = JavaTypeQualifiers(NullabilityQualifier.NULLABLE, null, definitelyNotNull = false)
/** Nullability depends on substitution, but the type is not platform: `T` */
private val NOT_PLATFORM = JavaTypeQualifiers(NullabilityQualifier.NOT_NULL, null, isNotNullTypeParameter = false)
private val NOT_PLATFORM = JavaTypeQualifiers(NullabilityQualifier.NOT_NULL, null, definitelyNotNull = false)
/** Type is always non-nullable: `T & Any` */
private val NOT_NULLABLE = JavaTypeQualifiers(NullabilityQualifier.NOT_NULL, null, isNotNullTypeParameter = true)
private val NOT_NULLABLE = JavaTypeQualifiers(NullabilityQualifier.NOT_NULL, null, definitelyNotNull = true)
@Suppress("LocalVariableName")
val PREDEFINED_FUNCTION_ENHANCEMENT_INFO_BY_SIGNATURE = signatures {
@@ -48,8 +48,7 @@ fun JavaTypeQualifiers.computeQualifiersForOverride(
val realNullability = newNullability?.takeUnless { isForVarargParameter && it == NullabilityQualifier.NULLABLE }
return JavaTypeQualifiers(
realNullability, newMutability,
realNullability == NullabilityQualifier.NOT_NULL &&
(isNotNullTypeParameter || superQualifiers.any { it.isNotNullTypeParameter }),
realNullability == NullabilityQualifier.NOT_NULL && (definitelyNotNull || superQualifiers.any { it.definitelyNotNull }),
realNullability != null && newNullabilityForErrors != newNullability
)
}
@@ -16,10 +16,10 @@ enum class MutabilityQualifier {
MUTABLE
}
class JavaTypeQualifiers(
class JavaTypeQualifiers constructor(
val nullability: NullabilityQualifier?,
val mutability: MutabilityQualifier?,
val isNotNullTypeParameter: Boolean,
val definitelyNotNull: Boolean,
val isNullabilityQualifierForWarning: Boolean = false
) {
companion object {