diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt index 3331ae7610e..d77c7180318 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt @@ -57,6 +57,7 @@ import org.jetbrains.kotlin.asJava.LightClassGenerationSupport import org.jetbrains.kotlin.asJava.classes.FacadeCache import org.jetbrains.kotlin.asJava.finder.JavaElementFinder import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension +import org.jetbrains.kotlin.backend.common.extensions.PureIrGenerationExtension import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.CliModuleVisibilityManagerImpl import org.jetbrains.kotlin.cli.common.KOTLIN_COMPILER_ENVIRONMENT_KEEPALIVE_PROPERTY @@ -556,6 +557,7 @@ class KotlinCoreEnvironment private constructor( CollectAdditionalSourcesExtension.registerExtensionPoint(project) ExtraImportsProviderExtension.registerExtensionPoint(project) IrGenerationExtension.registerExtensionPoint(project) + PureIrGenerationExtension.registerExtensionPoint(project) ScriptEvaluationExtension.registerExtensionPoint(project) ShellExtension.registerExtensionPoint(project) TypeResolutionInterceptor.registerExtensionPoint(project) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/extensions/IrGenerationExtension.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/extensions/IrGenerationExtension.kt index 8f38a853305..39e37dd5726 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/extensions/IrGenerationExtension.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/extensions/IrGenerationExtension.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.backend.common.extensions +import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.ir.BuiltinSymbolsBase import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.ModuleDescriptor @@ -37,4 +38,15 @@ interface IrGenerationExtension : IrExtensionGenerator { moduleFragment: IrModuleFragment, pluginContext: IrPluginContext ) -} \ No newline at end of file +} + +// Extension point for plugins which run before any lowerings, but after the Ir has been constructed. +interface PureIrGenerationExtension { + companion object : + ProjectExtensionDescriptor("org.jetbrains.kotlin.pureIrGenerationExtension", PureIrGenerationExtension::class.java) + + fun generate( + moduleFragment: IrModuleFragment, + context: CommonBackendContext + ) +} diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt index 9da3f024873..ec1b6ab6f63 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.jvm import org.jetbrains.kotlin.backend.common.CodegenUtil import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext +import org.jetbrains.kotlin.backend.common.extensions.PureIrGenerationExtension import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig import org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen import org.jetbrains.kotlin.backend.jvm.lower.MultifileFacadeFileEntry @@ -105,6 +106,10 @@ object JvmBackendFacade { context.typeMapper.mapType(context.referenceClass(descriptor).defaultType) } + for (extension in PureIrGenerationExtension.getInstances(state.project)) { + extension.generate(irModuleFragment, context) + } + JvmLower(context).lower(irModuleFragment) for (generateMultifileFacade in listOf(true, false)) {