FE: slowly refactor extractQualifiersFromAnnotations 3

This commit is contained in:
pyos
2021-08-10 23:24:42 +02:00
committed by teamcityserver
parent 5c8d3180f7
commit b31925e6c9
2 changed files with 14 additions and 29 deletions
@@ -14,9 +14,7 @@ data class JavaDefaultQualifiers(
val qualifierApplicabilityTypes: Collection<AnnotationQualifierApplicabilityType>,
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")
@@ -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<T extends @NotNull V>, C<X!> becomes C<X!!> 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(