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.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)
@@ -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
)
}
}
// 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.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)) {