From 4c701cf44c16bb42df2a1f83fc0f46d19eda5587 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Mon, 1 Feb 2021 13:48:56 +0300 Subject: [PATCH] IR: make extractedLocalClasses a JS-only field --- .../kotlin/backend/common/BackendContext.kt | 1 - .../common/lower/LocalClassPopupLowering.kt | 24 +++----------- .../common/lower/inline/LocalClasses.kt | 5 ++- .../ir/backend/js/JsIrBackendContext.kt | 2 +- .../kotlin/ir/backend/js/JsLoweringPhases.kt | 5 +-- .../inline/JsRecordExtractedLocalClasses.kt | 32 +++++++++++++++++++ .../kotlin/backend/jvm/JvmBackendContext.kt | 2 -- .../kotlin/backend/wasm/WasmBackendContext.kt | 1 - 8 files changed, 45 insertions(+), 27 deletions(-) create mode 100644 compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/JsRecordExtractedLocalClasses.kt diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/BackendContext.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/BackendContext.kt index d73998a3b67..f9a77c53e0b 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/BackendContext.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/BackendContext.kt @@ -30,6 +30,5 @@ interface BackendContext { val irBuiltIns: IrBuiltIns val sharedVariablesManager: SharedVariablesManager val internalPackageFqn: FqName - val extractedLocalClasses: MutableSet val irFactory: IrFactory } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalClassPopupLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalClassPopupLowering.kt index 39452721e20..48ee707d20e 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalClassPopupLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalClassPopupLowering.kt @@ -8,18 +8,17 @@ package org.jetbrains.kotlin.backend.common.lower import org.jetbrains.kotlin.backend.common.* import org.jetbrains.kotlin.backend.common.ir.addChild import org.jetbrains.kotlin.backend.common.ir.setDeclarationsParent -import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrBody import org.jetbrains.kotlin.ir.expressions.IrStatementContainer import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl -import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid -import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid -import org.jetbrains.kotlin.ir.visitors.acceptVoid //This lower takes part of old LocalDeclarationLowering job to pop up local classes from functions -open class LocalClassPopupLowering(val context: BackendContext) : BodyLoweringPass { +open class LocalClassPopupLowering( + val context: BackendContext, + val recordExtractedLocalClasses: BackendContext.(IrClass) -> Unit = {}, +) : BodyLoweringPass { override fun lower(irFile: IrFile) { runOnFilePostfix(irFile, withLocalDeclarations = true, allowDeclarationModification = true) } @@ -78,20 +77,7 @@ open class LocalClassPopupLowering(val context: BackendContext) : BodyLoweringPa } else -> error("Inexpected container type $newContainer") } - - local.acceptVoid(object : IrElementVisitorVoid { - override fun visitElement(element: IrElement) { - element.acceptChildrenVoid(this) - } - - override fun visitBody(body: IrBody) { - } - - override fun visitClass(declaration: IrClass) { - super.visitClass(declaration) - context.extractedLocalClasses += declaration - } - }) + context.recordExtractedLocalClasses(local) } } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/LocalClasses.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/LocalClasses.kt index 938c9a2a823..925b8e7011f 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/LocalClasses.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/LocalClasses.kt @@ -125,7 +125,10 @@ class LocalClassesInInlineFunctionsLowering(val context: CommonBackendContext) : } } -class LocalClassesExtractionFromInlineFunctionsLowering(context: CommonBackendContext) : LocalClassPopupLowering(context) { +class LocalClassesExtractionFromInlineFunctionsLowering( + context: CommonBackendContext, + recordExtractedLocalClasses: BackendContext.(IrClass) -> Unit = {}, +) : LocalClassPopupLowering(context, recordExtractedLocalClasses) { private val classesToExtract = mutableSetOf() override fun lower(irBody: IrBody, container: IrDeclaration) { diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt index 799cfe84db2..d0fd5431ce2 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsIrBackendContext.kt @@ -50,7 +50,7 @@ class JsIrBackendContext( val fileToInitializationFuns: MutableMap = mutableMapOf() val fileToInitializerPureness: MutableMap = mutableMapOf() - override val extractedLocalClasses: MutableSet = hashSetOf() + val extractedLocalClasses: MutableSet = hashSetOf() override val builtIns = module.builtIns diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt index f4852f3c3e5..3e0854fa1ba 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.ir.backend.js.lower.calls.CallsLowering import org.jetbrains.kotlin.ir.backend.js.lower.cleanup.CleanupLowering import org.jetbrains.kotlin.ir.backend.js.lower.coroutines.JsSuspendFunctionsLowering import org.jetbrains.kotlin.ir.backend.js.lower.inline.CopyInlineFunctionBodyLowering +import org.jetbrains.kotlin.ir.backend.js.lower.inline.jsRecordExtractedLocalClasses import org.jetbrains.kotlin.ir.backend.js.lower.inline.RemoveInlineDeclarationsWithReifiedTypeParametersLowering import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrModuleFragment @@ -217,7 +218,7 @@ private val localClassesInInlineFunctionsPhase = makeBodyLoweringPhase( ) private val localClassesExtractionFromInlineFunctionsPhase = makeBodyLoweringPhase( - ::LocalClassesExtractionFromInlineFunctionsLowering, + { context -> LocalClassesExtractionFromInlineFunctionsLowering(context, BackendContext::jsRecordExtractedLocalClasses) }, name = "localClassesExtractionFromInlineFunctionsPhase", description = "Move local classes from inline functions into nearest declaration container", prerequisite = setOf(localClassesInInlineFunctionsPhase) @@ -404,7 +405,7 @@ private val localDeclarationsLoweringPhase = makeBodyLoweringPhase( ) private val localClassExtractionPhase = makeBodyLoweringPhase( - ::LocalClassPopupLowering, + { context -> LocalClassPopupLowering(context, BackendContext::jsRecordExtractedLocalClasses) }, name = "LocalClassExtractionPhase", description = "Move local declarations into nearest declaration container", prerequisite = setOf(localDeclarationsLoweringPhase) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/JsRecordExtractedLocalClasses.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/JsRecordExtractedLocalClasses.kt new file mode 100644 index 00000000000..8c66f3158d2 --- /dev/null +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/inline/JsRecordExtractedLocalClasses.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.ir.backend.js.lower.inline + +import org.jetbrains.kotlin.backend.common.BackendContext +import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext +import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.expressions.IrBody +import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid +import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid +import org.jetbrains.kotlin.ir.visitors.acceptVoid + +fun BackendContext.jsRecordExtractedLocalClasses(irClass: IrClass) { + val context = this as JsIrBackendContext + irClass.acceptVoid(object : IrElementVisitorVoid { + override fun visitElement(element: IrElement) { + element.acceptChildrenVoid(this) + } + + override fun visitBody(body: IrBody) { + } + + override fun visitClass(declaration: IrClass) { + super.visitClass(declaration) + context.extractedLocalClasses += declaration + } + }) +} diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt index a6fc57809b4..c70bc9cacad 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt @@ -56,8 +56,6 @@ class JvmBackendContext( val classNameOverride: MutableMap get() = generatorExtensions.classNameOverride - override val extractedLocalClasses: MutableSet = ConcurrentHashMap.newKeySet() - override val irFactory: IrFactory = IrFactoryImpl override val scriptMode: Boolean = false diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt index a73569d759b..437571d3524 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmBackendContext.kt @@ -42,7 +42,6 @@ class WasmBackendContext( override val builtIns = module.builtIns override var inVerbosePhase: Boolean = false override val scriptMode = false - override val extractedLocalClasses: MutableSet = hashSetOf() override val irFactory: IrFactory = IrFactoryImpl // Place to store declarations excluded from code generation