IR: make extractedLocalClasses a JS-only field
This commit is contained in:
@@ -30,6 +30,5 @@ interface BackendContext {
|
|||||||
val irBuiltIns: IrBuiltIns
|
val irBuiltIns: IrBuiltIns
|
||||||
val sharedVariablesManager: SharedVariablesManager
|
val sharedVariablesManager: SharedVariablesManager
|
||||||
val internalPackageFqn: FqName
|
val internalPackageFqn: FqName
|
||||||
val extractedLocalClasses: MutableSet<IrClass>
|
|
||||||
val irFactory: IrFactory
|
val irFactory: IrFactory
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-19
@@ -8,18 +8,17 @@ package org.jetbrains.kotlin.backend.common.lower
|
|||||||
import org.jetbrains.kotlin.backend.common.*
|
import org.jetbrains.kotlin.backend.common.*
|
||||||
import org.jetbrains.kotlin.backend.common.ir.addChild
|
import org.jetbrains.kotlin.backend.common.ir.addChild
|
||||||
import org.jetbrains.kotlin.backend.common.ir.setDeclarationsParent
|
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.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrBody
|
import org.jetbrains.kotlin.ir.expressions.IrBody
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrStatementContainer
|
import org.jetbrains.kotlin.ir.expressions.IrStatementContainer
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl
|
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
|
//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) {
|
override fun lower(irFile: IrFile) {
|
||||||
runOnFilePostfix(irFile, withLocalDeclarations = true, allowDeclarationModification = true)
|
runOnFilePostfix(irFile, withLocalDeclarations = true, allowDeclarationModification = true)
|
||||||
}
|
}
|
||||||
@@ -78,20 +77,7 @@ open class LocalClassPopupLowering(val context: BackendContext) : BodyLoweringPa
|
|||||||
}
|
}
|
||||||
else -> error("Inexpected container type $newContainer")
|
else -> error("Inexpected container type $newContainer")
|
||||||
}
|
}
|
||||||
|
context.recordExtractedLocalClasses(local)
|
||||||
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
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-1
@@ -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>()
|
private val classesToExtract = mutableSetOf<IrClass>()
|
||||||
|
|
||||||
override fun lower(irBody: IrBody, container: IrDeclaration) {
|
override fun lower(irBody: IrBody, container: IrDeclaration) {
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ class JsIrBackendContext(
|
|||||||
val fileToInitializationFuns: MutableMap<IrFile, IrSimpleFunction?> = mutableMapOf()
|
val fileToInitializationFuns: MutableMap<IrFile, IrSimpleFunction?> = mutableMapOf()
|
||||||
val fileToInitializerPureness: MutableMap<IrFile, Boolean> = mutableMapOf()
|
val fileToInitializerPureness: MutableMap<IrFile, Boolean> = mutableMapOf()
|
||||||
|
|
||||||
override val extractedLocalClasses: MutableSet<IrClass> = hashSetOf()
|
val extractedLocalClasses: MutableSet<IrClass> = hashSetOf()
|
||||||
|
|
||||||
override val builtIns = module.builtIns
|
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.cleanup.CleanupLowering
|
||||||
import org.jetbrains.kotlin.ir.backend.js.lower.coroutines.JsSuspendFunctionsLowering
|
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.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.backend.js.lower.inline.RemoveInlineDeclarationsWithReifiedTypeParametersLowering
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||||
@@ -217,7 +218,7 @@ private val localClassesInInlineFunctionsPhase = makeBodyLoweringPhase(
|
|||||||
)
|
)
|
||||||
|
|
||||||
private val localClassesExtractionFromInlineFunctionsPhase = makeBodyLoweringPhase(
|
private val localClassesExtractionFromInlineFunctionsPhase = makeBodyLoweringPhase(
|
||||||
::LocalClassesExtractionFromInlineFunctionsLowering,
|
{ context -> LocalClassesExtractionFromInlineFunctionsLowering(context, BackendContext::jsRecordExtractedLocalClasses) },
|
||||||
name = "localClassesExtractionFromInlineFunctionsPhase",
|
name = "localClassesExtractionFromInlineFunctionsPhase",
|
||||||
description = "Move local classes from inline functions into nearest declaration container",
|
description = "Move local classes from inline functions into nearest declaration container",
|
||||||
prerequisite = setOf(localClassesInInlineFunctionsPhase)
|
prerequisite = setOf(localClassesInInlineFunctionsPhase)
|
||||||
@@ -404,7 +405,7 @@ private val localDeclarationsLoweringPhase = makeBodyLoweringPhase(
|
|||||||
)
|
)
|
||||||
|
|
||||||
private val localClassExtractionPhase = makeBodyLoweringPhase(
|
private val localClassExtractionPhase = makeBodyLoweringPhase(
|
||||||
::LocalClassPopupLowering,
|
{ context -> LocalClassPopupLowering(context, BackendContext::jsRecordExtractedLocalClasses) },
|
||||||
name = "LocalClassExtractionPhase",
|
name = "LocalClassExtractionPhase",
|
||||||
description = "Move local declarations into nearest declaration container",
|
description = "Move local declarations into nearest declaration container",
|
||||||
prerequisite = setOf(localDeclarationsLoweringPhase)
|
prerequisite = setOf(localDeclarationsLoweringPhase)
|
||||||
|
|||||||
+32
@@ -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>
|
val classNameOverride: MutableMap<IrClass, JvmClassName>
|
||||||
get() = generatorExtensions.classNameOverride
|
get() = generatorExtensions.classNameOverride
|
||||||
|
|
||||||
override val extractedLocalClasses: MutableSet<IrClass> = ConcurrentHashMap.newKeySet()
|
|
||||||
|
|
||||||
override val irFactory: IrFactory = IrFactoryImpl
|
override val irFactory: IrFactory = IrFactoryImpl
|
||||||
|
|
||||||
override val scriptMode: Boolean = false
|
override val scriptMode: Boolean = false
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ class WasmBackendContext(
|
|||||||
override val builtIns = module.builtIns
|
override val builtIns = module.builtIns
|
||||||
override var inVerbosePhase: Boolean = false
|
override var inVerbosePhase: Boolean = false
|
||||||
override val scriptMode = false
|
override val scriptMode = false
|
||||||
override val extractedLocalClasses: MutableSet<IrClass> = hashSetOf()
|
|
||||||
override val irFactory: IrFactory = IrFactoryImpl
|
override val irFactory: IrFactory = IrFactoryImpl
|
||||||
|
|
||||||
// Place to store declarations excluded from code generation
|
// Place to store declarations excluded from code generation
|
||||||
|
|||||||
Reference in New Issue
Block a user