[FE, Java resolve] Support inheritors of sealed Java type without permits clause

This fixes a false negative NO_ELSE_IN_WHEN in K2 and incidentally
also fixes a false positive NO_ELSE_IN_WHEN in K1 since the fix is in
the common code.

#KT-62491 Fixed
This commit is contained in:
Kirill Rakhman
2023-10-24 10:00:18 +02:00
committed by Space Team
parent 15d3bf5e25
commit ac203591e5
22 changed files with 291 additions and 21 deletions
@@ -102,7 +102,7 @@ interface JavaClass : JavaClassifier, JavaTypeParameterListOwner, JavaModifierLi
val isEnum: Boolean
val isRecord: Boolean
val isSealed: Boolean
val permittedTypes: Collection<JavaClassifierType>
val permittedTypes: Sequence<JavaClassifierType>
val lightClassOriginKind: LightClassOriginKind?
val methods: Collection<JavaMethod>
@@ -197,7 +197,7 @@ class LazyJavaClassDescriptor(
override fun getSealedSubclasses(): Collection<ClassDescriptor> = if (modality == Modality.SEALED) {
val attributes = TypeUsage.COMMON.toAttributes()
jClass.permittedTypes.mapNotNull {
jClass.permittedTypes.mapNotNullTo(mutableListOf()) {
c.typeResolver.transformJavaType(it, attributes).constructor.declarationDescriptor as? ClassDescriptor
}.sortedBy { it.fqNameSafe.asString() }
} else {
@@ -193,8 +193,8 @@ class SyntheticJavaClassDescriptor(
get() = this@SyntheticJavaClassDescriptor.isRecord
override val isSealed: Boolean
get() = modality == Modality.SEALED
override val permittedTypes: Collection<JavaClassifierType>
get() = emptyList()
override val permittedTypes: Sequence<JavaClassifierType>
get() = emptySequence()
override val lightClassOriginKind: LightClassOriginKind?
get() = null
override val methods: Collection<JavaMethod>
@@ -133,10 +133,11 @@ class ReflectJavaClass(
override val isSealed: Boolean
get() = Java16SealedRecordLoader.loadIsSealed(klass) ?: false
override val permittedTypes: Collection<JavaClassifierType>
override val permittedTypes: Sequence<JavaClassifierType>
get() = Java16SealedRecordLoader.loadGetPermittedSubclasses(klass)
?.map(::ReflectJavaClassifierType)
?: emptyList()
?.asSequence()
?: emptySequence()
override fun equals(other: Any?) = other is ReflectJavaClass && klass == other.klass