From 63d841247c9abeafb2601cd9a5ade5ed2dc2650a Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 8 Oct 2021 16:36:27 +0300 Subject: [PATCH] [FIR2IR] Properly setup IrClass.sealedSubclasses --- .../jetbrains/kotlin/fir/backend/ConversionUtils.kt | 8 ++++++++ .../org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt | 8 ++++---- .../org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt | 10 ++++++---- .../testData/codegen/box/smartCasts/kt44814.fir.txt | 9 +++++++++ .../testData/ir/irText/firProblems/ArrayMap.fir.txt | 4 ++++ .../testData/ir/irText/regressions/kt45236.fir.txt | 2 ++ 6 files changed, 33 insertions(+), 8 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt index fb698aa8215..a5b5e74d4c9 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt @@ -561,3 +561,11 @@ fun Fir2IrComponents.computeInlineClassRepresentation(klass: FirRegularClass): I underlyingType as? IrSimpleType ?: error("Inline class underlying type is not a simple type: ${klass.render()}") ) } + +fun FirRegularClass.getIrSymbolsForSealedSubclasses(components: Fir2IrComponents): List { + val session = components.session + val symbolProvider = session.symbolProvider + return getSealedClassInheritors(session).mapNotNull { + symbolProvider.getClassLikeSymbolByClassId(it)?.toSymbol(session, components.classifierStorage) + }.filterIsInstance() +} diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index 7eb84bed451..13a07daea73 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -15,10 +15,7 @@ import org.jetbrains.kotlin.fir.backend.generators.OperatorExpressionGenerator import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.buildProperty import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl -import org.jetbrains.kotlin.fir.declarations.utils.expandedConeType -import org.jetbrains.kotlin.fir.declarations.utils.isSynthetic -import org.jetbrains.kotlin.fir.declarations.utils.primaryConstructor -import org.jetbrains.kotlin.fir.declarations.utils.visibility +import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.expressions.builder.buildBlock import org.jetbrains.kotlin.fir.expressions.impl.FirElseIfTrueCondition @@ -156,6 +153,9 @@ class Fir2IrVisitor( converter.processLocalClassAndNestedClasses(regularClass, irParent) } val irClass = classifierStorage.getCachedIrClass(regularClass)!! + if (regularClass.isSealed) { + irClass.sealedSubclasses = regularClass.getIrSymbolsForSealedSubclasses(components) + } return conversionScope.withParent(irClass) { conversionScope.withContainingFirClass(regularClass) { memberGenerator.convertClassContent(irClass, regularClass) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt index c110f236377..970a14f6d05 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt @@ -6,10 +6,8 @@ package org.jetbrains.kotlin.fir.lazy import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.fir.backend.Fir2IrComponents -import org.jetbrains.kotlin.fir.backend.computeInlineClassRepresentation +import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.declareThisReceiverParameter -import org.jetbrains.kotlin.fir.backend.toIrType import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull @@ -104,7 +102,11 @@ class Fir2IrLazyClass( } override var sealedSubclasses: List by lazyVar(lock) { - TODO() + if (fir.isSealed) { + fir.getIrSymbolsForSealedSubclasses(components) + } else { + emptyList() + } } override var thisReceiver: IrValueParameter? by lazyVar(lock) { diff --git a/compiler/testData/codegen/box/smartCasts/kt44814.fir.txt b/compiler/testData/codegen/box/smartCasts/kt44814.fir.txt index 4f3ce24831c..1eceb47c10f 100644 --- a/compiler/testData/codegen/box/smartCasts/kt44814.fir.txt +++ b/compiler/testData/codegen/box/smartCasts/kt44814.fir.txt @@ -19,6 +19,9 @@ FILE fqName: fileName:/kt44814.kt public open fun toString (): kotlin.String declared in kotlin.Any $this: VALUE_PARAMETER name: type:kotlin.Any CLASS CLASS name:FirSourceElement modality:SEALED visibility:public superTypes:[kotlin.Any] + sealedSubclasses: + CLASS CLASS name:FirPsiSourceElement modality:FINAL visibility:public superTypes:[.FirSourceElement] + CLASS CLASS name:FirLightSourceElement modality:FINAL visibility:public superTypes:[.FirSourceElement] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.FirSourceElement CONSTRUCTOR visibility:protected <> () returnType:.FirSourceElement [primary] BLOCK_BODY @@ -368,6 +371,9 @@ FILE fqName: fileName:/kt44814.kt public open fun toString (): kotlin.String [fake_override] declared in .PsiElement $this: VALUE_PARAMETER name: type:kotlin.Any CLASS CLASS name:FirModifier modality:SEALED visibility:internal superTypes:[kotlin.Any] + sealedSubclasses: + CLASS CLASS name:FirPsiModifier modality:FINAL visibility:public superTypes:[.FirModifier<.ASTNode>] + CLASS CLASS name:FirLightModifier modality:FINAL visibility:public superTypes:[.FirModifier<.LighterASTNode>] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.FirModifier.FirModifier> TYPE_PARAMETER name:Node index:0 variance: superTypes:[kotlin.Any] CONSTRUCTOR visibility:protected <> (node:Node of .FirModifier, token:.KtModifierKeywordToken) returnType:.FirModifier.FirModifier> [primary] @@ -504,6 +510,9 @@ FILE fqName: fileName:/kt44814.kt public open fun toString (): kotlin.String declared in kotlin.Any $this: VALUE_PARAMETER name: type:kotlin.Any CLASS CLASS name:FirModifierList modality:SEALED visibility:internal superTypes:[kotlin.Any] + sealedSubclasses: + CLASS CLASS name:FirPsiModifierList modality:FINAL visibility:public superTypes:[.FirModifierList] + CLASS CLASS name:FirLightModifierList modality:FINAL visibility:public superTypes:[.FirModifierList] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.FirModifierList CONSTRUCTOR visibility:protected <> () returnType:.FirModifierList [primary] BLOCK_BODY diff --git a/compiler/testData/ir/irText/firProblems/ArrayMap.fir.txt b/compiler/testData/ir/irText/firProblems/ArrayMap.fir.txt index 789bdb2b04f..9d9a221563e 100644 --- a/compiler/testData/ir/irText/firProblems/ArrayMap.fir.txt +++ b/compiler/testData/ir/irText/firProblems/ArrayMap.fir.txt @@ -1,5 +1,9 @@ FILE fqName: fileName:/ArrayMap.kt CLASS CLASS name:ArrayMap modality:SEALED visibility:public superTypes:[kotlin.collections.Iterable.ArrayMap>] + sealedSubclasses: + CLASS OBJECT name:EmptyArrayMap modality:FINAL visibility:internal superTypes:[.ArrayMap] + CLASS CLASS name:OneElementArrayMap modality:FINAL visibility:internal superTypes:[.ArrayMap.OneElementArrayMap>] + CLASS CLASS name:ArrayMapImpl modality:FINAL visibility:internal superTypes:[.ArrayMap.ArrayMapImpl>] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.ArrayMap.ArrayMap> TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any] CONSTRUCTOR visibility:protected <> () returnType:.ArrayMap.ArrayMap> [primary] diff --git a/compiler/testData/ir/irText/regressions/kt45236.fir.txt b/compiler/testData/ir/irText/regressions/kt45236.fir.txt index adf04b906a6..f645a61dbe5 100644 --- a/compiler/testData/ir/irText/regressions/kt45236.fir.txt +++ b/compiler/testData/ir/irText/regressions/kt45236.fir.txt @@ -1,5 +1,7 @@ FILE fqName: fileName:/kt45236.kt CLASS CLASS name:NetRequestStatus modality:SEALED visibility:public superTypes:[kotlin.Any] + sealedSubclasses: + CLASS CLASS name:Error modality:FINAL visibility:public [data] superTypes:[.NetRequestStatus.NetRequestStatus.Error>] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.NetRequestStatus.NetRequestStatus> TYPE_PARAMETER name:T index:0 variance:out superTypes:[kotlin.Any] CONSTRUCTOR visibility:protected <> () returnType:.NetRequestStatus.NetRequestStatus> [primary]