[FIR] Fix Java sealed class inheritors
This fixes NO_ELSE_IN_WHEN diagnostics when using java sealed classes in an exhaustive when. #KT-58216 Fixed
This commit is contained in:
committed by
Space Team
parent
6405a174e2
commit
16ae83bde0
+5
-2
@@ -10,6 +10,8 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirMo
|
|||||||
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
import org.jetbrains.kotlin.analysis.project.structure.KtModule
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProvider
|
import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProvider
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProviderInternals
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.sealedInheritorsAttr
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.classId
|
import org.jetbrains.kotlin.fir.declarations.utils.classId
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
|
|
||||||
@@ -28,10 +30,11 @@ internal class LLFirSealedClassInheritorsProcessorFactoryForTests : FirSealedCla
|
|||||||
private class SealedClassInheritorsProviderForTests(
|
private class SealedClassInheritorsProviderForTests(
|
||||||
private val inheritorsByModule: Map<KtModule, Map<ClassId, List<ClassId>>>
|
private val inheritorsByModule: Map<KtModule, Map<ClassId, List<ClassId>>>
|
||||||
) : SealedClassInheritorsProvider() {
|
) : SealedClassInheritorsProvider() {
|
||||||
|
@OptIn(SealedClassInheritorsProviderInternals::class)
|
||||||
override fun getSealedClassInheritors(firClass: FirRegularClass): List<ClassId> {
|
override fun getSealedClassInheritors(firClass: FirRegularClass): List<ClassId> {
|
||||||
val ktModule = firClass.llFirModuleData.ktModule
|
val ktModule = firClass.llFirModuleData.ktModule
|
||||||
val inheritorsForModuleMap = inheritorsByModule.getValue(ktModule)
|
val inheritorsForModuleMap = inheritorsByModule.getValue(ktModule)
|
||||||
return inheritorsForModuleMap[firClass.classId].orEmpty()
|
return inheritorsForModuleMap[firClass.classId] ?: firClass.sealedInheritorsAttr?.value ?: emptyList()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -394,7 +394,7 @@ abstract class FirJavaFacade(
|
|||||||
setSealedClassInheritors {
|
setSealedClassInheritors {
|
||||||
permittedTypes.mapNotNull { classifierType ->
|
permittedTypes.mapNotNull { classifierType ->
|
||||||
val classifier = classifierType.classifier as? JavaClass
|
val classifier = classifierType.classifier as? JavaClass
|
||||||
classifier?.let { JavaToKotlinClassMap.mapJavaToKotlin(it.fqName!!) }
|
classifier?.let { JavaToKotlinClassMap.mapJavaToKotlin(it.fqName!!) ?: it.classId }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-44
@@ -1,44 +0,0 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
|
||||||
// ISSUE: KT-41215, KT-43551
|
|
||||||
|
|
||||||
// FILE: Base.java
|
|
||||||
public sealed class Base permits A, B {}
|
|
||||||
|
|
||||||
// FILE: A.java
|
|
||||||
public final class A extends Base {}
|
|
||||||
|
|
||||||
// FILE: B.java
|
|
||||||
public sealed class B extends Base permits B.C, B.D {
|
|
||||||
public static final class C implements B {}
|
|
||||||
|
|
||||||
public static non-sealed class D extends B {}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FILE: main.kt
|
|
||||||
fun test_ok_1(base: Base) {
|
|
||||||
val x = when (base) {
|
|
||||||
is A -> 1
|
|
||||||
is B -> 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun test_ok_2(base: Base) {
|
|
||||||
val x = when (base) {
|
|
||||||
is A -> 1
|
|
||||||
is B.C -> 2
|
|
||||||
is B.D -> 3
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun test_error_1(base: Base) {
|
|
||||||
val x = when (base) {
|
|
||||||
is A -> 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun test_error_2(base: Base) {
|
|
||||||
val x = when (base) {
|
|
||||||
is A -> 1
|
|
||||||
is B.C -> 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Vendored
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||||
// ISSUE: KT-41215, KT-43551
|
// ISSUE: KT-41215, KT-43551
|
||||||
|
|
||||||
|
|||||||
-64
@@ -1,64 +0,0 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
|
||||||
// ISSUE: KT-41215, KT-43551
|
|
||||||
|
|
||||||
// FILE: Base.java
|
|
||||||
public sealed interface Base permits A, B, E {}
|
|
||||||
|
|
||||||
// FILE: A.java
|
|
||||||
public non-sealed interface A extends Base {}
|
|
||||||
|
|
||||||
// FILE: B.java
|
|
||||||
public sealed interface B extends Base permits B.C, B.D {
|
|
||||||
public static final class C implements B {}
|
|
||||||
|
|
||||||
public static non-sealed interface D extends B {}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FILE: E.java
|
|
||||||
public enum E implements Base {
|
|
||||||
First, Second
|
|
||||||
}
|
|
||||||
|
|
||||||
// FILE: main.kt
|
|
||||||
fun test_ok_1(base: Base) {
|
|
||||||
val x = when (base) {
|
|
||||||
is A -> 1
|
|
||||||
is B -> 2
|
|
||||||
is E -> 3
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun test_ok_2(base: Base) {
|
|
||||||
val x = when (base) {
|
|
||||||
is A -> 1
|
|
||||||
is B.C -> 2
|
|
||||||
is B.D -> 3
|
|
||||||
E.First -> 4
|
|
||||||
E.Second -> 5
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun test_error_1(base: Base) {
|
|
||||||
val x = when (base) {
|
|
||||||
is A -> 1
|
|
||||||
is B -> 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun test_error_2(base: Base) {
|
|
||||||
val x = when (base) {
|
|
||||||
is A -> 1
|
|
||||||
is B.C -> 2
|
|
||||||
is B.D -> 3
|
|
||||||
E.Second -> 5
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun test_error_3(base: Base) {
|
|
||||||
val x = when (base) {
|
|
||||||
is A -> 1
|
|
||||||
is B.C -> 2
|
|
||||||
E.First -> 4
|
|
||||||
E.Second -> 5
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||||
// ISSUE: KT-41215, KT-43551
|
// ISSUE: KT-41215, KT-43551
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user