From b31925e6c9d4695704626fcfde3427734454affd Mon Sep 17 00:00:00 2001 From: pyos Date: Tue, 10 Aug 2021 23:24:42 +0200 Subject: [PATCH] FE: slowly refactor extractQualifiersFromAnnotations 3 --- .../load/java/AnnotationQualifiersFqNames.kt | 4 +- .../typeEnhancement/signatureEnhancement.kt | 39 +++++++------------ 2 files changed, 14 insertions(+), 29 deletions(-) diff --git a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/AnnotationQualifiersFqNames.kt b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/AnnotationQualifiersFqNames.kt index 3adf3d89f96..f7da8df1c39 100644 --- a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/AnnotationQualifiersFqNames.kt +++ b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/AnnotationQualifiersFqNames.kt @@ -14,9 +14,7 @@ data class JavaDefaultQualifiers( val qualifierApplicabilityTypes: Collection, val affectsTypeParameterBasedTypes: Boolean = nullabilityQualifier.qualifier == NullabilityQualifier.NOT_NULL, val affectsStarProjection: Boolean = affectsTypeParameterBasedTypes -) { - val makesTypeParameterNotNull get() = nullabilityQualifier.qualifier == NullabilityQualifier.NOT_NULL && affectsTypeParameterBasedTypes -} +) val TYPE_QUALIFIER_NICKNAME_FQNAME = FqName("javax.annotation.meta.TypeQualifierNickname") val TYPE_QUALIFIER_FQNAME = FqName("javax.annotation.meta.TypeQualifier") diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt index a9b94d1b6f0..c16c5e654f3 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/typeEnhancement/signatureEnhancement.kt @@ -318,34 +318,21 @@ private class SignatureParts( ?: defaultTypeQualifier?.nullabilityQualifier val isNotNullTypeParameter = referencedParameterBoundsNullability?.qualifier == NullabilityQualifier.NOT_NULL || - (typeOrBound.isTypeParameter() && defaultTypeQualifier?.makesTypeParameterNotNull == true) + (typeOrBound.isTypeParameter() && defaultTypeQualifier?.nullabilityQualifier?.qualifier == NullabilityQualifier.NOT_NULL) - val nullabilityInfo = computeNullabilityInfoInTheAbsenceOfExplicitAnnotation(defaultNullability, typeParameterForArgument) - - return JavaTypeQualifiers( - nullabilityInfo?.qualifier, annotationsMutability, - isNotNullTypeParameter, - nullabilityInfo?.isForWarningOnly == true - ) - } - - private fun computeNullabilityInfoInTheAbsenceOfExplicitAnnotation( - result: NullabilityQualifierWithMigrationStatus?, - typeParameterForArgument: TypeParameterDescriptor? - ): NullabilityQualifierWithMigrationStatus? { - - val boundsFromTypeParameterForArgument = typeParameterForArgument?.boundsNullability() ?: return result - - if (result == null && boundsFromTypeParameterForArgument.qualifier == NullabilityQualifier.NULLABLE) { - return NullabilityQualifierWithMigrationStatus( - NullabilityQualifier.FORCE_FLEXIBILITY, - boundsFromTypeParameterForArgument.isForWarningOnly - ) + // We should also enhance this type to satisfy the bound of the type parameter it is instantiating: + // for C, C becomes C regardless of the above. + val substitutedParameterBoundsNullability = typeParameterForArgument?.boundsNullability() + val result = when { + substitutedParameterBoundsNullability == null -> defaultNullability + defaultNullability == null -> + if (substitutedParameterBoundsNullability.qualifier == NullabilityQualifier.NULLABLE) + substitutedParameterBoundsNullability.copy(qualifier = NullabilityQualifier.FORCE_FLEXIBILITY) + else + substitutedParameterBoundsNullability + else -> mostSpecific(substitutedParameterBoundsNullability, defaultNullability) } - - if (result == null) return boundsFromTypeParameterForArgument - - return mostSpecific(boundsFromTypeParameterForArgument, result) + return JavaTypeQualifiers(result?.qualifier, annotationsMutability, isNotNullTypeParameter, result?.isForWarningOnly == true) } private fun mostSpecific(