Don't enhance previously erased value parameters for jspecify strict mode

^KT-48261 Fixed
This commit is contained in:
Victor Petukhov
2021-10-06 14:15:25 +03:00
parent e77f72071d
commit d015d3bc0e
19 changed files with 348 additions and 21 deletions
@@ -161,7 +161,9 @@ abstract class AbstractSignatureParts<TAnnotation : Any> {
}
fun KotlinTypeMarker.computeIndexedQualifiers(
overrides: Iterable<KotlinTypeMarker>, predefined: TypeEnhancementInfo?
overrides: Iterable<KotlinTypeMarker>,
predefined: TypeEnhancementInfo?,
ignoreDeclarationNullabilityAnnotations: Boolean = false
): IndexedJavaTypeQualifiers {
val indexedThisType = toIndexed()
val indexedFromSupertypes = overrides.map { it.toIndexed() }
@@ -178,7 +180,12 @@ abstract class AbstractSignatureParts<TAnnotation : Any> {
val computedResult = Array(treeSize) { index ->
val qualifiers = indexedThisType[index].extractQualifiersFromAnnotations()
val superQualifiers = indexedFromSupertypes.mapNotNull { it.getOrNull(index)?.type?.extractQualifiers() }
qualifiers.computeQualifiersForOverride(superQualifiers, index == 0 && isCovariant, index == 0 && containerIsVarargParameter)
qualifiers.computeQualifiersForOverride(
superQualifiers,
index == 0 && isCovariant,
index == 0 && containerIsVarargParameter,
ignoreDeclarationNullabilityAnnotations
)
}
return { index -> predefined?.map?.get(index) ?: computedResult.getOrElse(index) { JavaTypeQualifiers.NONE } }
}
@@ -35,7 +35,8 @@ private val JavaTypeQualifiers.nullabilityForErrors: NullabilityQualifier?
fun JavaTypeQualifiers.computeQualifiersForOverride(
superQualifiers: Collection<JavaTypeQualifiers>,
isCovariant: Boolean,
isForVarargParameter: Boolean
isForVarargParameter: Boolean,
ignoreDeclarationNullabilityAnnotations: Boolean
): JavaTypeQualifiers {
val newNullabilityForErrors = superQualifiers.mapNotNull { it.nullabilityForErrors }.toSet()
.select(nullabilityForErrors, isCovariant)
@@ -45,7 +46,9 @@ fun JavaTypeQualifiers.computeQualifiersForOverride(
.select(MutabilityQualifier.MUTABLE, MutabilityQualifier.READ_ONLY, mutability, isCovariant)
// Vararg value parameters effectively have non-nullable type in Kotlin
// and having nullable types in Java may lead to impossibility of overriding them in Kotlin
val realNullability = newNullability?.takeUnless { isForVarargParameter && it == NullabilityQualifier.NULLABLE }
val realNullability = newNullability?.takeUnless {
ignoreDeclarationNullabilityAnnotations || (isForVarargParameter && it == NullabilityQualifier.NULLABLE)
}
return JavaTypeQualifiers(
realNullability, newMutability,
realNullability == NullabilityQualifier.NOT_NULL && (definitelyNotNull || superQualifiers.any { it.definitelyNotNull }),