Support enhancement of type parameter's bound for all nullability annotations

This commit is contained in:
Victor Petukhov
2020-12-08 15:56:39 +03:00
parent c91301d04c
commit 276498793f
2 changed files with 11 additions and 23 deletions
@@ -173,10 +173,7 @@ private fun LazyJavaResolverContext.extractDefaultNullabilityQualifier(
}
val nullabilityQualifier =
components
.signatureEnhancement
.extractNullability(typeQualifier, onlyForJspecify = false)
?.copy(isForWarningOnly = jsr305State.isWarning)
components.signatureEnhancement.extractNullability(typeQualifier)?.copy(isForWarningOnly = jsr305State.isWarning)
?: return null
return JavaDefaultQualifiers(nullabilityQualifier, applicability)
@@ -65,11 +65,8 @@ class SignatureEnhancement(
}
}
fun extractNullability(
annotationDescriptor: AnnotationDescriptor,
onlyForJspecify: Boolean
): NullabilityQualifierWithMigrationStatus? {
extractNullabilityFromKnownAnnotations(annotationDescriptor, onlyForJspecify)?.let { return it }
fun extractNullability(annotationDescriptor: AnnotationDescriptor): NullabilityQualifierWithMigrationStatus? {
extractNullabilityFromKnownAnnotations(annotationDescriptor)?.let { return it }
val typeQualifierAnnotation =
annotationTypeQualifierResolver.resolveTypeQualifierAnnotation(annotationDescriptor)
@@ -78,28 +75,25 @@ class SignatureEnhancement(
val jsr305State = annotationTypeQualifierResolver.resolveJsr305AnnotationState(annotationDescriptor)
if (jsr305State.isIgnore) return null
return extractNullabilityFromKnownAnnotations(
typeQualifierAnnotation, onlyForJspecify
)?.copy(isForWarningOnly = jsr305State.isWarning)
return extractNullabilityFromKnownAnnotations(typeQualifierAnnotation)?.copy(isForWarningOnly = jsr305State.isWarning)
}
private fun extractNullabilityFromKnownAnnotations(
annotationDescriptor: AnnotationDescriptor,
onlyForJspecify: Boolean
annotationDescriptor: AnnotationDescriptor
): NullabilityQualifierWithMigrationStatus? {
val annotationFqName = annotationDescriptor.fqName ?: return null
val migrationStatus =
jspecifyMigrationStatus(annotationFqName)
?: (if (!onlyForJspecify) commonMigrationStatus(annotationFqName, annotationDescriptor) else null)
?: commonMigrationStatus(annotationFqName, annotationDescriptor)
?: return null
return if (!migrationStatus.isForWarningOnly
&& annotationDescriptor is PossiblyExternalAnnotationDescriptor
&& annotationDescriptor.isIdeExternalAnnotation
)
) {
migrationStatus.copy(isForWarningOnly = true)
else migrationStatus
} else migrationStatus
}
private fun jspecifyMigrationStatus(
@@ -251,15 +245,12 @@ class SignatureEnhancement(
}
}
private fun ValueParameterDescriptor.hasDefaultValueInAnnotation(type: KotlinType): Boolean {
val defaultValue = getDefaultValueFromAnnotation()
return when (defaultValue) {
private fun ValueParameterDescriptor.hasDefaultValueInAnnotation(type: KotlinType) =
when (val defaultValue = getDefaultValueFromAnnotation()) {
is StringDefaultValue -> type.lexicalCastFrom(defaultValue.value) != null
NullDefaultValue -> TypeUtils.acceptsNullable(type)
null -> declaresDefaultValue()
} && overriddenDescriptors.isEmpty()
}
private inner class SignatureParts(
private val typeContainer: Annotated?,
@@ -438,7 +429,7 @@ class SignatureEnhancement(
}
private fun Annotations.extractNullability(): NullabilityQualifierWithMigrationStatus? =
this.firstNotNullResult { extractNullability(it, onlyForJspecify = typeParameterBounds) }
this.firstNotNullResult { extractNullability(it) }
private fun computeIndexedQualifiersForOverride(): (Int) -> JavaTypeQualifiers {