[Plugins] Introduce new API for registering compiler plugins

Original `ComponentRegistrar` exposes Project to its registration method,
  so plugins should manually register extensions to it. To prepare for
  possible unbound compiler from Project API in future new  `K2ComponentRegistrar`
  introduced which provides registration method without Project at all
This commit is contained in:
Dmitriy Novozhilov
2022-06-07 10:23:09 +03:00
committed by teamcity
parent bb996c1b27
commit 8b42638afa
56 changed files with 392 additions and 191 deletions
@@ -5,8 +5,6 @@
package org.jetbrains.kotlin.noarg
import com.intellij.mock.MockProject
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.codegen.extensions.ExpressionCodegenExtension
import org.jetbrains.kotlin.compiler.plugin.*
@@ -17,7 +15,7 @@ import org.jetbrains.kotlin.container.StorageComponentContainer
import org.jetbrains.kotlin.container.useInstance
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter
import org.jetbrains.kotlin.noarg.NoArgConfigurationKeys.ANNOTATION
import org.jetbrains.kotlin.noarg.NoArgConfigurationKeys.INVOKE_INITIALIZERS
import org.jetbrains.kotlin.noarg.NoArgConfigurationKeys.PRESET
@@ -71,28 +69,36 @@ class NoArgCommandLineProcessor : CommandLineProcessor {
}
}
class NoArgComponentRegistrar : ComponentRegistrar {
class NoArgComponentRegistrar : CompilerPluginRegistrar() {
override val supportsK2: Boolean
get() = true
override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) {
override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) {
val annotations = configuration.get(ANNOTATION).orEmpty().toMutableList()
configuration.get(PRESET)?.forEach { preset ->
SUPPORTED_PRESETS[preset]?.let { annotations += it }
}
if (annotations.isNotEmpty()) {
registerNoArgComponents(
project, annotations, configuration.getBoolean(JVMConfigurationKeys.IR), configuration.getBoolean(INVOKE_INITIALIZERS),
this,
annotations,
configuration.getBoolean(JVMConfigurationKeys.IR),
configuration.getBoolean(INVOKE_INITIALIZERS),
)
}
}
companion object {
fun registerNoArgComponents(project: Project, annotations: List<String>, useIr: Boolean, invokeInitializers: Boolean) {
StorageComponentContainerContributor.registerExtension(project, CliNoArgComponentContainerContributor(annotations, useIr))
FirExtensionRegistrar.registerExtension(project, FirNoArgExtensionRegistrar(annotations))
ExpressionCodegenExtension.registerExtension(project, CliNoArgExpressionCodegenExtension(annotations, invokeInitializers))
IrGenerationExtension.registerExtension(project, NoArgIrGenerationExtension(annotations, invokeInitializers))
fun registerNoArgComponents(
extensionStorage: ExtensionStorage,
annotations: List<String>,
useIr: Boolean,
invokeInitializers: Boolean
) = with(extensionStorage) {
StorageComponentContainerContributor.registerExtension(CliNoArgComponentContainerContributor(annotations, useIr))
FirExtensionRegistrarAdapter.registerExtension(FirNoArgExtensionRegistrar(annotations))
ExpressionCodegenExtension.registerExtension(CliNoArgExpressionCodegenExtension(annotations, invokeInitializers))
IrGenerationExtension.registerExtension(NoArgIrGenerationExtension(annotations, invokeInitializers))
}
}
}