IR: make extractedLocalClasses a JS-only field

This commit is contained in:
Georgy Bronnikov
2021-02-01 13:48:56 +03:00
parent 445f6eac3d
commit 4c701cf44c
8 changed files with 45 additions and 27 deletions
@@ -30,6 +30,5 @@ interface BackendContext {
val irBuiltIns: IrBuiltIns
val sharedVariablesManager: SharedVariablesManager
val internalPackageFqn: FqName
val extractedLocalClasses: MutableSet<IrClass>
val irFactory: IrFactory
}
@@ -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)
}
}
@@ -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<IrClass>()
override fun lower(irBody: IrBody, container: IrDeclaration) {
@@ -50,7 +50,7 @@ class JsIrBackendContext(
val fileToInitializationFuns: MutableMap<IrFile, IrSimpleFunction?> = mutableMapOf()
val fileToInitializerPureness: MutableMap<IrFile, Boolean> = mutableMapOf()
override val extractedLocalClasses: MutableSet<IrClass> = hashSetOf()
val extractedLocalClasses: MutableSet<IrClass> = hashSetOf()
override val builtIns = module.builtIns
@@ -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)
@@ -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
}
})
}
@@ -56,8 +56,6 @@ class JvmBackendContext(
val classNameOverride: MutableMap<IrClass, JvmClassName>
get() = generatorExtensions.classNameOverride
override val extractedLocalClasses: MutableSet<IrClass> = ConcurrentHashMap.newKeySet()
override val irFactory: IrFactory = IrFactoryImpl
override val scriptMode: Boolean = false
@@ -42,7 +42,6 @@ class WasmBackendContext(
override val builtIns = module.builtIns
override var inVerbosePhase: Boolean = false
override val scriptMode = false
override val extractedLocalClasses: MutableSet<IrClass> = hashSetOf()
override val irFactory: IrFactory = IrFactoryImpl
// Place to store declarations excluded from code generation