From 32057f6d10030668b3ce10fb95b3288ad1958041 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Thu, 21 Sep 2023 11:47:41 +0200 Subject: [PATCH] [JVM_IR] Use `createSimpleNamedCompilerPhase` to create lowerings --- .../backend/common/phaser/PhaseBuilders.kt | 101 ++++++++---------- .../kotlin/backend/jvm/JvmLoweringPhases.kt | 11 +- .../jvm/lower/GenerateMultifileFacades.kt | 2 +- .../backend/jvm/lower/ScriptLowering.kt | 6 +- .../backend/jvm/lower/SerializeIrPhase.kt | 8 +- 5 files changed, 56 insertions(+), 72 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/PhaseBuilders.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/PhaseBuilders.kt index 30ae51308c1..a9470227d0e 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/PhaseBuilders.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/phaser/PhaseBuilders.kt @@ -94,76 +94,67 @@ fun createSimpleNamedCompilerPhase( op(context, input) } -fun makeCustomPhase( - op: (Context, Element) -> Unit, +private val defaultConditions = setOf(defaultDumper, validationAction) + +fun makeCustomPhase( + op: (Context, IrModuleFragment) -> Unit, name: String, description: String, prerequisite: Set> = emptySet(), - preconditions: Set> = emptySet(), - postconditions: Set> = emptySet(), - stickyPostconditions: Set> = emptySet(), - actions: Set> = setOf(defaultDumper, validationAction), - nlevels: Int = 1 -): SameTypeNamedCompilerPhase = - SameTypeNamedCompilerPhase( - name, description, prerequisite, CustomPhaseAdapter(op), preconditions, postconditions, stickyPostconditions, actions, nlevels, + preconditions: Set> = emptySet(), + postconditions: Set> = emptySet(), +): SimpleNamedCompilerPhase = + createSimpleNamedCompilerPhase( + name = name, + description = description, + preactions = defaultConditions + preconditions, + postactions = defaultConditions + postconditions, + prerequisite = prerequisite, + outputIfNotEnabled = { _, _, _, irModule -> irModule }, + op = { context, irModule -> + op(context, irModule) + irModule + }, ) -private class CustomPhaseAdapter( - private val op: (Context, Element) -> Unit -) : SameTypeCompilerPhase { - override fun invoke(phaseConfig: PhaseConfigurationService, phaserState: PhaserState, context: Context, input: Element): Element { - op(context, input) - return input - } -} - fun makeIrFilePhase( lowering: (Context) -> FileLoweringPass, name: String, description: String, prerequisite: Set> = emptySet(), - preconditions: Set> = emptySet(), - postconditions: Set> = emptySet(), - stickyPostconditions: Set> = emptySet(), - actions: Set> = setOf(defaultDumper, validationAction) -): SameTypeNamedCompilerPhase = - SameTypeNamedCompilerPhase( - name, description, prerequisite, FileLoweringPhaseAdapter(lowering), preconditions, postconditions, stickyPostconditions, actions, - nlevels = 0, + preconditions: Set> = emptySet(), + postconditions: Set> = emptySet(), +): SimpleNamedCompilerPhase = + createSimpleNamedCompilerPhase( + name = name, + description = description, + preactions = defaultConditions + preconditions, + postactions = defaultConditions + postconditions, + prerequisite = prerequisite, + outputIfNotEnabled = { _, _, _, irFile -> irFile }, + op = { context, irFile -> + lowering(context).lower(irFile) + irFile + }, ) -private class FileLoweringPhaseAdapter( - private val lowering: (Context) -> FileLoweringPass -) : SameTypeCompilerPhase { - override fun invoke(phaseConfig: PhaseConfigurationService, phaserState: PhaserState, context: Context, input: IrFile): IrFile { - lowering(context).lower(input) - return input - } -} - fun makeIrModulePhase( lowering: (Context) -> FileLoweringPass, name: String, description: String, prerequisite: Set> = emptySet(), - preconditions: Set> = emptySet(), - postconditions: Set> = emptySet(), - stickyPostconditions: Set> = emptySet(), - actions: Set> = setOf(defaultDumper, validationAction) -): SameTypeNamedCompilerPhase = - SameTypeNamedCompilerPhase( - name, description, prerequisite, ModuleLoweringPhaseAdapter(lowering), preconditions, postconditions, stickyPostconditions, actions, - nlevels = 0, + preconditions: Set> = emptySet(), + postconditions: Set> = emptySet(), +): SimpleNamedCompilerPhase = + createSimpleNamedCompilerPhase( + name = name, + description = description, + preactions = defaultConditions + preconditions, + postactions = defaultConditions + postconditions, + prerequisite = prerequisite, + outputIfNotEnabled = { _, _, _, irModule -> irModule }, + op = { context, irModule -> + lowering(context).lower(irModule) + irModule + }, ) - -private class ModuleLoweringPhaseAdapter( - private val lowering: (Context) -> FileLoweringPass -) : SameTypeCompilerPhase { - override fun invoke( - phaseConfig: PhaseConfigurationService, phaserState: PhaserState, context: Context, input: IrModuleFragment - ): IrModuleFragment { - lowering(context).lower(input) - return input - } -} diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLoweringPhases.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLoweringPhases.kt index 583ffd4c229..6b635633f6e 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLoweringPhases.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/JvmLoweringPhases.kt @@ -18,7 +18,6 @@ import org.jetbrains.kotlin.backend.jvm.ir.shouldContainSuspendMarkers import org.jetbrains.kotlin.backend.jvm.lower.* import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.DescriptorVisibility -import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrValueSymbol @@ -26,8 +25,6 @@ import org.jetbrains.kotlin.ir.util.PatchDeclarationParentsVisitor import org.jetbrains.kotlin.ir.util.isAnonymousObject import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.ir.util.resolveFakeOverride -import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid -import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities import org.jetbrains.kotlin.name.NameUtils @@ -35,7 +32,7 @@ import org.jetbrains.kotlin.name.NameUtils private var patchParentPhases = 0 @Suppress("unused") -private fun makePatchParentsPhase(): SameTypeNamedCompilerPhase { +private fun makePatchParentsPhase(): SimpleNamedCompilerPhase { val number = patchParentPhases++ return makeIrFilePhase( { PatchDeclarationParents() }, @@ -47,7 +44,7 @@ private fun makePatchParentsPhase(): SameTypeNamedCompilerPhase { +private fun makeCheckParentsPhase(): SimpleNamedCompilerPhase { val number = checkParentPhases++ return makeIrFilePhase( { CheckDeclarationParents() }, @@ -452,7 +449,7 @@ val jvmLoweringPhases = buildJvmLoweringPhases("IrLowering", listOf("PerformByIr private fun buildJvmLoweringPhases( name: String, - phases: List>>>, + phases: List>>>, ): SameTypeNamedCompilerPhase { return SameTypeNamedCompilerPhase( name = name, @@ -489,7 +486,7 @@ private fun buildJvmLoweringPhases( // Build a compiler phase from a list of lowering sequences: each subsequence is run // in parallel per file, and each parallel composition is run in sequence. private fun buildLoweringsPhase( - perModuleLowerings: List>>>, + perModuleLowerings: List>>>, ): CompilerPhase = perModuleLowerings.map { (name, lowerings) -> performByIrFile(name, lower = lowerings) } .reduce< diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt index e9a54044c2a..bec84946b6e 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/GenerateMultifileFacades.kt @@ -42,7 +42,7 @@ import org.jetbrains.kotlin.name.JvmStandardClassIds.JVM_SYNTHETIC_ANNOTATION_FQ import org.jetbrains.kotlin.resolve.inline.INLINE_ONLY_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmBackendErrors -internal val generateMultifileFacadesPhase = makeCustomPhase( +internal val generateMultifileFacadesPhase = makeCustomPhase( name = "GenerateMultifileFacades", description = "Generate JvmMultifileClass facades, based on the information provided by FileClassLowering", prerequisite = setOf(fileClassPhase), diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ScriptLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ScriptLowering.kt index ee4916ae0b8..cf56a2b6d1a 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ScriptLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ScriptLowering.kt @@ -47,12 +47,10 @@ import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import org.jetbrains.kotlin.utils.topologicalSort -internal val scriptsToClassesPhase = makeCustomPhase( +internal val scriptsToClassesPhase = makeCustomPhase( + op = { context, irModule -> ScriptsToClassesLowering(context, context.innerClassesSupport).lower(irModule) }, name = "ScriptsToClasses", description = "Put script declarations into classes", - op = { context, input -> - ScriptsToClassesLowering(context, context.innerClassesSupport).lower(input) - } ) diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SerializeIrPhase.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SerializeIrPhase.kt index 27ee84fb93e..ca10f72d81f 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SerializeIrPhase.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SerializeIrPhase.kt @@ -6,17 +6,15 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.FileLoweringPass -import org.jetbrains.kotlin.backend.common.lower -import org.jetbrains.kotlin.backend.common.phaser.makeCustomPhase +import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.expectDeclarationsRemovingPhase import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrFile -import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.MetadataSource -internal val serializeIrPhase = makeCustomPhase( - { context, irModule -> SerializeIrPhase(context).lower(irModule) }, +internal val serializeIrPhase = makeIrModulePhase( + lowering = ::SerializeIrPhase, name = "SerializeIr", description = "If specified by compiler options, save serialized IR in class annotations", prerequisite = setOf(expectDeclarationsRemovingPhase),