From 7cad2be329b293df4def967d19125a28d12dd4ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Tue, 10 Mar 2020 14:21:48 +0100 Subject: [PATCH] IR: Add an extension point after IR construction The existing IrGenerationExtension is in the middle of IR construction and basically requires plugins to work with the (deprecated) descriptors. Since there are plans to change the IR extension point it makes sense to introduce a temporary work-around to allow pure IR plugins to be developed now, which could be ported to a more permanent API later. --- .../cli/jvm/compiler/KotlinCoreEnvironment.kt | 2 ++ .../common/extensions/IrGenerationExtension.kt | 14 +++++++++++++- .../kotlin/backend/jvm/JvmBackendFacade.kt | 5 +++++ 3 files changed, 20 insertions(+), 1 deletion(-) 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)) {