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.
This commit is contained in:
Steven Schäfer
2020-03-10 14:21:48 +01:00
committed by Alexander Udalov
parent 6ae7d53a93
commit 7cad2be329
3 changed files with 20 additions and 1 deletions
@@ -57,6 +57,7 @@ import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
import org.jetbrains.kotlin.asJava.classes.FacadeCache import org.jetbrains.kotlin.asJava.classes.FacadeCache
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder import org.jetbrains.kotlin.asJava.finder.JavaElementFinder
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension 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.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.CliModuleVisibilityManagerImpl import org.jetbrains.kotlin.cli.common.CliModuleVisibilityManagerImpl
import org.jetbrains.kotlin.cli.common.KOTLIN_COMPILER_ENVIRONMENT_KEEPALIVE_PROPERTY import org.jetbrains.kotlin.cli.common.KOTLIN_COMPILER_ENVIRONMENT_KEEPALIVE_PROPERTY
@@ -556,6 +557,7 @@ class KotlinCoreEnvironment private constructor(
CollectAdditionalSourcesExtension.registerExtensionPoint(project) CollectAdditionalSourcesExtension.registerExtensionPoint(project)
ExtraImportsProviderExtension.registerExtensionPoint(project) ExtraImportsProviderExtension.registerExtensionPoint(project)
IrGenerationExtension.registerExtensionPoint(project) IrGenerationExtension.registerExtensionPoint(project)
PureIrGenerationExtension.registerExtensionPoint(project)
ScriptEvaluationExtension.registerExtensionPoint(project) ScriptEvaluationExtension.registerExtensionPoint(project)
ShellExtension.registerExtensionPoint(project) ShellExtension.registerExtensionPoint(project)
TypeResolutionInterceptor.registerExtensionPoint(project) TypeResolutionInterceptor.registerExtensionPoint(project)
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.backend.common.extensions 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.backend.common.ir.BuiltinSymbolsBase
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
@@ -37,4 +38,15 @@ interface IrGenerationExtension : IrExtensionGenerator {
moduleFragment: IrModuleFragment, moduleFragment: IrModuleFragment,
pluginContext: IrPluginContext pluginContext: IrPluginContext
) )
} }
// Extension point for plugins which run before any lowerings, but after the Ir has been constructed.
interface PureIrGenerationExtension {
companion object :
ProjectExtensionDescriptor<PureIrGenerationExtension>("org.jetbrains.kotlin.pureIrGenerationExtension", PureIrGenerationExtension::class.java)
fun generate(
moduleFragment: IrModuleFragment,
context: CommonBackendContext
)
}
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.jvm
import org.jetbrains.kotlin.backend.common.CodegenUtil import org.jetbrains.kotlin.backend.common.CodegenUtil
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext 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.common.phaser.PhaseConfig
import org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen import org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen
import org.jetbrains.kotlin.backend.jvm.lower.MultifileFacadeFileEntry import org.jetbrains.kotlin.backend.jvm.lower.MultifileFacadeFileEntry
@@ -105,6 +106,10 @@ object JvmBackendFacade {
context.typeMapper.mapType(context.referenceClass(descriptor).defaultType) context.typeMapper.mapType(context.referenceClass(descriptor).defaultType)
} }
for (extension in PureIrGenerationExtension.getInstances(state.project)) {
extension.generate(irModuleFragment, context)
}
JvmLower(context).lower(irModuleFragment) JvmLower(context).lower(irModuleFragment)
for (generateMultifileFacade in listOf(true, false)) { for (generateMultifileFacade in listOf(true, false)) {