diff --git a/.idea/encodings.xml b/.idea/encodings.xml index d6b98908c96..2139b8ff041 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -4,21 +4,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/utils/compilerPluginConfiguration.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/utils/compilerPluginConfiguration.kt index 635ef8e2e5a..046cc4fcc61 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/utils/compilerPluginConfiguration.kt +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/utils/compilerPluginConfiguration.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.fir.utils import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.config.AnalysisFlag import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.LanguageVersion @@ -58,9 +59,20 @@ private class EnabledByDirectiveConfiguratorDecorator( languageVersion: LanguageVersion ): Map, Any?> = original.provideAdditionalAnalysisFlags(directives, languageVersion) - override fun registerCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) { + override fun legacyRegisterCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) { if (directive !in module.directives) return - original.registerCompilerExtensions(project, module, configuration) + original.legacyRegisterCompilerExtensions(project, module, configuration) + } + + override fun CompilerPluginRegistrar.ExtensionStorage.registerCompilerExtensions( + module: TestModule, + configuration: CompilerConfiguration + ) { + if (directive !in module.directives) return + + with(original) { + this@registerCompilerExtensions.registerCompilerExtensions(module, configuration) + } } } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/compilerPluginConfiguration.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/compilerPluginConfiguration.kt index 11f919df665..6d2a86f2761 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/compilerPluginConfiguration.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/compilerPluginConfiguration.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.test.base import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.config.AnalysisFlag import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.LanguageVersion @@ -58,9 +59,20 @@ private class EnabledByDirectiveConfiguratorDecorator( languageVersion: LanguageVersion ): Map, Any?> = original.provideAdditionalAnalysisFlags(directives, languageVersion) - override fun registerCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) { + override fun legacyRegisterCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) { if (directive !in module.directives) return - original.registerCompilerExtensions(project, module, configuration) + original.legacyRegisterCompilerExtensions(project, module, configuration) } -} \ No newline at end of file + + override fun CompilerPluginRegistrar.ExtensionStorage.registerCompilerExtensions( + module: TestModule, + configuration: CompilerConfiguration + ) { + if (directive !in module.directives) return + + with(original) { + this@registerCompilerExtensions.registerCompilerExtensions(module, configuration) + } + } +} diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt index aa43873521b..5dc7487dbb2 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.codegen.ClassBuilderFactories import org.jetbrains.kotlin.codegen.CodegenFactory import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory import org.jetbrains.kotlin.diagnostics.impl.BaseDiagnosticsCollector @@ -87,21 +88,21 @@ object FirKotlinToJvmBytecodeCompiler { "ATTENTION!\n This build uses experimental K2 compiler: \n -Xuse-k2" ) - projectConfiguration.get(ComponentRegistrar.PLUGIN_COMPONENT_REGISTRARS)?.let { pluginComponentRegistrars -> - val notSupportedPlugins = pluginComponentRegistrars.filter { - !it.supportsK2 && it::class.java.canonicalName != CLICompiler.SCRIPT_PLUGIN_REGISTRAR_NAME - } - if (notSupportedPlugins.isNotEmpty()) { - messageCollector.report( - CompilerMessageSeverity.ERROR, - """ - |There are some plugins incompatible with K2 compiler: - |${notSupportedPlugins.joinToString(separator = "\n|") { " ${it::class.qualifiedName}" }} - |Please remove -Xuse-k2 - """.trimMargin() - ) - return false - } + val notSupportedPlugins = mutableListOf().apply { + projectConfiguration.get(ComponentRegistrar.PLUGIN_COMPONENT_REGISTRARS).collectIncompatiblePluginNamesTo(this, ComponentRegistrar::supportsK2) + projectConfiguration.get(CompilerPluginRegistrar.COMPILER_PLUGIN_REGISTRARS).collectIncompatiblePluginNamesTo(this, CompilerPluginRegistrar::supportsK2) + } + + if (notSupportedPlugins.isNotEmpty()) { + messageCollector.report( + CompilerMessageSeverity.ERROR, + """ + |There are some plugins incompatible with K2 compiler: + |${notSupportedPlugins.joinToString(separator = "\n|") { " $it" }} + |Please remove -Xuse-k2 + """.trimMargin() + ) + return false } if (projectConfiguration.languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects)) { messageCollector.report( @@ -153,6 +154,14 @@ object FirKotlinToJvmBytecodeCompiler { ) } + private fun List?.collectIncompatiblePluginNamesTo( + destination: MutableList, + supportsK2: T.() -> Boolean + ) { + this?.filter { !it.supportsK2() && it::class.java.canonicalName != CLICompiler.SCRIPT_PLUGIN_REGISTRAR_NAME } + ?.mapTo(destination) { it::class.qualifiedName } + } + private fun CompilationContext.compileModule(): Pair? { performanceManager?.notifyAnalysisStarted() ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() 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 4f13d455ad2..a61ee2766ce 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 @@ -62,6 +62,8 @@ import org.jetbrains.kotlin.codegen.extensions.ClassBuilderInterceptorExtension import org.jetbrains.kotlin.codegen.extensions.ClassFileFactoryFinalizerExtension import org.jetbrains.kotlin.codegen.extensions.ExpressionCodegenExtension import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar +import org.jetbrains.kotlin.compiler.plugin.registerInProject import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.extensions.* import org.jetbrains.kotlin.extensions.internal.CandidateInterceptor @@ -637,12 +639,17 @@ class KotlinCoreEnvironment private constructor( } internal fun registerExtensionsFromPlugins(project: MockProject, configuration: CompilerConfiguration) { + fun createErrorMessage(extension: Any): String { + return "The provided plugin ${extension.javaClass.name} is not compatible with this version of compiler" + } + val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) + for (registrar in configuration.getList(ComponentRegistrar.PLUGIN_COMPONENT_REGISTRARS)) { try { registrar.registerProjectComponents(project, configuration) } catch (e: AbstractMethodError) { - val message = "The provided plugin ${registrar.javaClass.name} is not compatible with this version of compiler" + val message = createErrorMessage(registrar) // Since the scripting plugin is often discovered in the compiler environment, it is often taken from the incompatible // location, and in many cases this is not a fatal error, therefore strong warning is generated instead of exception if (registrar.javaClass.simpleName == "ScriptingCompilerConfigurationComponentRegistrar") { @@ -652,8 +659,13 @@ class KotlinCoreEnvironment private constructor( } } } - } + val extensionStorage = CompilerPluginRegistrar.ExtensionStorage() + for (registrar in configuration.getList(CompilerPluginRegistrar.COMPILER_PLUGIN_REGISTRARS)) { + with(registrar) { extensionStorage.registerExtensions(configuration) } + } + extensionStorage.registerInProject(project) { createErrorMessage(it) } + } private fun registerApplicationServicesForCLI(applicationEnvironment: KotlinCoreApplicationEnvironment) { // ability to get text from annotations xml files diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/plugins/PluginCliParser.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/plugins/PluginCliParser.kt index 296a0968da4..a20df52b430 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/plugins/PluginCliParser.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/plugins/PluginCliParser.kt @@ -69,6 +69,9 @@ object PluginCliParser { val componentRegistrars = ServiceLoaderLite.loadImplementations(ComponentRegistrar::class.java, classLoader) configuration.addAll(ComponentRegistrar.PLUGIN_COMPONENT_REGISTRARS, componentRegistrars) + val compilerPluginRegistrars = ServiceLoaderLite.loadImplementations(CompilerPluginRegistrar::class.java, classLoader) + configuration.addAll(CompilerPluginRegistrar.COMPILER_PLUGIN_REGISTRARS, compilerPluginRegistrars) + processPluginOptions(pluginOptions, configuration, classLoader) } diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt index 6f16d1d91e7..c7a2044340a 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/KotlinRemoteReplService.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.cli.jvm.config.configureJdkClasspathRoots import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots import org.jetbrains.kotlin.cli.jvm.plugins.ServiceLoaderLite import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.daemon.common.CompileService import org.jetbrains.kotlin.daemon.common.CompilerId @@ -207,13 +208,12 @@ inline fun getValidId(counter: AtomicInteger, check: (Int) -> Boolean): Int { fun CompilerConfiguration.configureScripting(compilerId: CompilerId) { val error = try { - val componentRegistrars = - (this::class.java.classLoader as? URLClassLoader)?.let { - ServiceLoaderLite.loadImplementations(ComponentRegistrar::class.java, it) - } ?: ServiceLoaderLite.loadImplementations( - ComponentRegistrar::class.java, compilerId.compilerClasspath.map(::File), this::class.java.classLoader - ) + val componentRegistrars = loadRegistrars(compilerId) addAll(ComponentRegistrar.PLUGIN_COMPONENT_REGISTRARS, componentRegistrars) + + val compilerPluginRegistrars = loadRegistrars(compilerId) + addAll(CompilerPluginRegistrar.COMPILER_PLUGIN_REGISTRARS, compilerPluginRegistrars) + null } catch (e: NoClassDefFoundError) { e @@ -227,3 +227,11 @@ fun CompilerConfiguration.configureScripting(compilerId: CompilerId) { ) } } + +private inline fun CompilerConfiguration.loadRegistrars(compilerId: CompilerId): List { + return (this::class.java.classLoader as? URLClassLoader)?.let { + ServiceLoaderLite.loadImplementations(T::class.java, it) + } ?: ServiceLoaderLite.loadImplementations( + T::class.java, compilerId.compilerClasspath.map(::File), this::class.java.classLoader + ) +} diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/extensions/FirExtensionRegistrar.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/extensions/FirExtensionRegistrar.kt index df6f5e0ab23..2115c3b79ed 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/extensions/FirExtensionRegistrar.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/extensions/FirExtensionRegistrar.kt @@ -20,10 +20,6 @@ abstract class FirExtensionRegistrar : FirExtensionRegistrarAdapter() { return FirExtensionRegistrarAdapter.getInstances(project) as List } - fun registerExtension(project: Project, extension: FirExtensionRegistrar) { - FirExtensionRegistrarAdapter.registerExtension(project, extension) - } - internal val AVAILABLE_EXTENSIONS = listOf( FirStatusTransformerExtension::class, FirDeclarationGenerationExtension::class, diff --git a/compiler/plugin-api/src/org/jetbrains/kotlin/compiler/plugin/CompilerPluginRegistrar.kt b/compiler/plugin-api/src/org/jetbrains/kotlin/compiler/plugin/CompilerPluginRegistrar.kt new file mode 100644 index 00000000000..727a1da7420 --- /dev/null +++ b/compiler/plugin-api/src/org/jetbrains/kotlin/compiler/plugin/CompilerPluginRegistrar.kt @@ -0,0 +1,65 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.compiler.plugin + +import com.intellij.openapi.project.Project +import org.jetbrains.annotations.TestOnly +import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.CompilerConfigurationKey +import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor + +abstract class CompilerPluginRegistrar { + companion object { + val COMPILER_PLUGIN_REGISTRARS: CompilerConfigurationKey> = + CompilerConfigurationKey.create("Compiler plugin registrars") + } + + abstract fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) + + class ExtensionStorage { + private val _registeredExtensions = mutableMapOf, MutableList>() + val registeredExtensions: Map, List> + get() = _registeredExtensions + + fun ProjectExtensionDescriptor.registerExtension(extension: T) { + _registeredExtensions.getOrPut(this, ::mutableListOf).add(extension) + } + } + + abstract val supportsK2: Boolean +} + +fun CompilerPluginRegistrar.ExtensionStorage.registerInProject( + project: Project, + errorMessage: (Any) -> String = { "Error while registering ${it.javaClass.name} "} +) { + for ((extensionPoint, extensions) in registeredExtensions) { + for (extension in extensions) { + @Suppress("UNCHECKED_CAST") + try { + (extensionPoint as ProjectExtensionDescriptor).registerExtensionUnsafe(project, extension) + } catch (e: AbstractMethodError) { + throw IllegalStateException(errorMessage(extension), e) + } + } + } +} + +private fun ProjectExtensionDescriptor.registerExtensionUnsafe(project: Project, extension: Any) { + this.registerExtension(project, extension) +} + +@TestOnly +fun registerExtensionsForTest( + project: Project, + configuration: CompilerConfiguration, + register: CompilerPluginRegistrar.ExtensionStorage.(CompilerConfiguration) -> Unit +) { + val extensionStorage = CompilerPluginRegistrar.ExtensionStorage().apply { + register(configuration) + } + extensionStorage.registerInProject(project) +} diff --git a/compiler/plugin-api/src/org/jetbrains/kotlin/compiler/plugin/ComponentRegistrar.kt b/compiler/plugin-api/src/org/jetbrains/kotlin/compiler/plugin/ComponentRegistrar.kt index 75a4c23344f..4f926f8394e 100644 --- a/compiler/plugin-api/src/org/jetbrains/kotlin/compiler/plugin/ComponentRegistrar.kt +++ b/compiler/plugin-api/src/org/jetbrains/kotlin/compiler/plugin/ComponentRegistrar.kt @@ -17,8 +17,8 @@ package org.jetbrains.kotlin.compiler.plugin import com.intellij.mock.MockProject -import org.jetbrains.kotlin.config.CompilerConfigurationKey import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.CompilerConfigurationKey interface ComponentRegistrar { companion object { diff --git a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/AbstractEnvironmentConfigurator.kt b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/AbstractEnvironmentConfigurator.kt index 066f8683e53..55bb8e4ac13 100644 --- a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/AbstractEnvironmentConfigurator.kt +++ b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/AbstractEnvironmentConfigurator.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.test.services import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar.ExtensionStorage import org.jetbrains.kotlin.config.AnalysisFlag import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfigurationKey @@ -22,7 +23,8 @@ abstract class AbstractEnvironmentConfigurator : ServicesAndDirectivesContainer abstract fun provideAdditionalAnalysisFlags(directives: RegisteredDirectives, languageVersion: LanguageVersion): Map, Any?> - abstract fun registerCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) + abstract fun legacyRegisterCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) + abstract fun ExtensionStorage.registerCompilerExtensions( module: TestModule, configuration: CompilerConfiguration) } class EnvironmentConfiguratorsProvider(internal val environmentConfigurators: List) : TestService @@ -56,7 +58,9 @@ abstract class EnvironmentConfigurator(protected val testServices: TestServices) return emptyMap() } - override fun registerCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) {} + override fun legacyRegisterCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) {} + + override fun ExtensionStorage.registerCompilerExtensions(module: TestModule, configuration: CompilerConfiguration) {} } class DirectiveToConfigurationKeyExtractor { diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt index bf0c00b29a6..8469ed5b3bf 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt @@ -15,6 +15,8 @@ import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.JvmPackagePartProvider import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar +import org.jetbrains.kotlin.compiler.plugin.registerInProject import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfigurationKey @@ -44,7 +46,14 @@ abstract class CompilerConfigurationProvider(val testServices: TestServices) : T } fun registerCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) { - configurators.forEach { it.registerCompilerExtensions(project, module, configuration) } + val extensionStorage = CompilerPluginRegistrar.ExtensionStorage() + for (configurator in configurators) { + configurator.legacyRegisterCompilerExtensions(project, module, configuration) + with(configurator) { + extensionStorage.registerCompilerExtensions(module, configuration) + } + } + extensionStorage.registerInProject(project) } open fun getPackagePartProviderFactory(module: TestModule): (GlobalSearchScope) -> JvmPackagePartProvider { diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-plugins/test-extension/src/main/kotlin/org/jetbrains/kotlin/test/TestKotlinPluginRegistrar.kt b/libraries/tools/kotlin-maven-plugin-test/src/it/test-plugins/test-extension/src/main/kotlin/org/jetbrains/kotlin/test/TestKotlinPluginRegistrar.kt index ff9e14fa601..dd57cd9cc46 100644 --- a/libraries/tools/kotlin-maven-plugin-test/src/it/test-plugins/test-extension/src/main/kotlin/org/jetbrains/kotlin/test/TestKotlinPluginRegistrar.kt +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-plugins/test-extension/src/main/kotlin/org/jetbrains/kotlin/test/TestKotlinPluginRegistrar.kt @@ -30,12 +30,15 @@ class TestCommandLineProcessor : CommandLineProcessor { } } -class TestKotlinPluginRegistrar : ComponentRegistrar { - override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) { +class TestKotlinPluginRegistrar : CompilerPluginRegistrar() { + override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) { val collector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY)!! val option = configuration.get(TestPluginKeys.TestOption)!! collector.report(CompilerMessageSeverity.INFO, "Plugin applied") collector.report(CompilerMessageSeverity.INFO, "Option value: $option") } + + override val supportsK2: Boolean + get() = true } diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-plugins/test-extension/src/main/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar b/libraries/tools/kotlin-maven-plugin-test/src/it/test-plugins/test-extension/src/main/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar similarity index 100% rename from libraries/tools/kotlin-maven-plugin-test/src/it/test-plugins/test-extension/src/main/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar rename to libraries/tools/kotlin-maven-plugin-test/src/it/test-plugins/test-extension/src/main/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar diff --git a/plugins/allopen/allopen.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar b/plugins/allopen/allopen.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar similarity index 100% rename from plugins/allopen/allopen.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar rename to plugins/allopen/allopen.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar diff --git a/plugins/allopen/allopen.cli/src/org/jetbrains/kotlin/allopen/AllOpenPlugin.kt b/plugins/allopen/allopen.cli/src/org/jetbrains/kotlin/allopen/AllOpenPlugin.kt index e35189a4426..c421008d9f6 100644 --- a/plugins/allopen/allopen.cli/src/org/jetbrains/kotlin/allopen/AllOpenPlugin.kt +++ b/plugins/allopen/allopen.cli/src/org/jetbrains/kotlin/allopen/AllOpenPlugin.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.allopen -import com.intellij.mock.MockProject import org.jetbrains.kotlin.allopen.AllOpenConfigurationKeys.ANNOTATION import org.jetbrains.kotlin.allopen.AllOpenConfigurationKeys.PRESET import org.jetbrains.kotlin.allopen.AllOpenPluginNames.ANNOTATION_OPTION_NAME @@ -15,7 +14,7 @@ import org.jetbrains.kotlin.compiler.plugin.* import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfigurationKey import org.jetbrains.kotlin.extensions.DeclarationAttributeAltererExtension -import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar +import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter object AllOpenConfigurationKeys { val ANNOTATION: CompilerConfigurationKey> = CompilerConfigurationKey.create("annotation qualified name") @@ -45,16 +44,16 @@ class AllOpenCommandLineProcessor : CommandLineProcessor { } } -class AllOpenComponentRegistrar : ComponentRegistrar { - override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) { +class AllOpenComponentRegistrar : CompilerPluginRegistrar() { + override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) { val annotations = configuration.get(ANNOTATION)?.toMutableList() ?: mutableListOf() configuration.get(PRESET)?.forEach { preset -> SUPPORTED_PRESETS[preset]?.let { annotations += it } } if (annotations.isEmpty()) return - DeclarationAttributeAltererExtension.registerExtension(project, CliAllOpenDeclarationAttributeAltererExtension(annotations)) - FirExtensionRegistrar.registerExtension(project, FirAllOpenExtensionRegistrar(annotations)) + DeclarationAttributeAltererExtension.registerExtension(CliAllOpenDeclarationAttributeAltererExtension(annotations)) + FirExtensionRegistrarAdapter.registerExtension(FirAllOpenExtensionRegistrar(annotations)) } override val supportsK2: Boolean diff --git a/plugins/allopen/test/org/jetbrains/kotlin/allopen/AllOpenEnvironmentConfigurator.kt b/plugins/allopen/test/org/jetbrains/kotlin/allopen/AllOpenEnvironmentConfigurator.kt index ed901dbe5b5..c9f981c25b8 100644 --- a/plugins/allopen/test/org/jetbrains/kotlin/allopen/AllOpenEnvironmentConfigurator.kt +++ b/plugins/allopen/test/org/jetbrains/kotlin/allopen/AllOpenEnvironmentConfigurator.kt @@ -5,25 +5,24 @@ package org.jetbrains.kotlin.allopen -import com.intellij.openapi.project.Project import org.jetbrains.kotlin.allopen.fir.FirAllOpenExtensionRegistrar +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar.ExtensionStorage import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.extensions.DeclarationAttributeAltererExtension -import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar +import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.services.EnvironmentConfigurator import org.jetbrains.kotlin.test.services.TestServices class AllOpenEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfigurator(testServices) { - override fun registerCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) { + override fun ExtensionStorage.registerCompilerExtensions( + module: TestModule, + configuration: CompilerConfiguration + ) { val annotations = AbstractAllOpenDeclarationAttributeAltererExtension.ANNOTATIONS_FOR_TESTS + AllOpenPluginNames.SUPPORTED_PRESETS.flatMap { it.value } - DeclarationAttributeAltererExtension.registerExtension( - project, - CliAllOpenDeclarationAttributeAltererExtension(annotations) - ) - - FirExtensionRegistrar.registerExtension(project, FirAllOpenExtensionRegistrar(annotations)) + DeclarationAttributeAltererExtension.registerExtension(CliAllOpenDeclarationAttributeAltererExtension(annotations)) + FirExtensionRegistrarAdapter.registerExtension(FirAllOpenExtensionRegistrar(annotations)) } } diff --git a/plugins/atomicfu/atomicfu-compiler/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar b/plugins/atomicfu/atomicfu-compiler/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar similarity index 100% rename from plugins/atomicfu/atomicfu-compiler/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar rename to plugins/atomicfu/atomicfu-compiler/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar diff --git a/plugins/atomicfu/atomicfu-compiler/src/org/jetbrains/kotlinx/atomicfu/compiler/extensions/AtomicfuComponentRegistrar.kt b/plugins/atomicfu/atomicfu-compiler/src/org/jetbrains/kotlinx/atomicfu/compiler/extensions/AtomicfuComponentRegistrar.kt index 2f4ec331cc7..355b601caf1 100644 --- a/plugins/atomicfu/atomicfu-compiler/src/org/jetbrains/kotlinx/atomicfu/compiler/extensions/AtomicfuComponentRegistrar.kt +++ b/plugins/atomicfu/atomicfu-compiler/src/org/jetbrains/kotlinx/atomicfu/compiler/extensions/AtomicfuComponentRegistrar.kt @@ -16,22 +16,21 @@ package org.jetbrains.kotlinx.atomicfu.compiler.extensions -import com.intellij.mock.MockProject -import com.intellij.openapi.project.Project import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension -import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.config.CompilerConfiguration -class AtomicfuComponentRegistrar : ComponentRegistrar { - override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) { - registerExtensions(project) +class AtomicfuComponentRegistrar : CompilerPluginRegistrar() { + override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) { + Companion.registerExtensions(this) } override val supportsK2: Boolean get() = true companion object { - fun registerExtensions(project: Project) { - IrGenerationExtension.registerExtension(project, AtomicfuLoweringExtension()) } + fun registerExtensions(extensionStorage: ExtensionStorage) = with(extensionStorage) { + IrGenerationExtension.registerExtension(AtomicfuLoweringExtension()) + } } } diff --git a/plugins/atomicfu/atomicfu-compiler/test/org/jetbrains/kotlinx/atomicfu/AbstractAtomicfuJsIrTest.kt b/plugins/atomicfu/atomicfu-compiler/test/org/jetbrains/kotlinx/atomicfu/AbstractAtomicfuJsIrTest.kt index 413958f6a2d..d8da0a35ebb 100644 --- a/plugins/atomicfu/atomicfu-compiler/test/org/jetbrains/kotlinx/atomicfu/AbstractAtomicfuJsIrTest.kt +++ b/plugins/atomicfu/atomicfu-compiler/test/org/jetbrains/kotlinx/atomicfu/AbstractAtomicfuJsIrTest.kt @@ -34,7 +34,7 @@ open class AbstractAtomicfuJsIrTest : AbstractJsIrTest( } class AtomicfuEnvironmentConfigurator(testServices: TestServices) : EnvironmentConfigurator(testServices) { - override fun registerCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) { + override fun legacyRegisterCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) { IrGenerationExtension.registerExtension(project, AtomicfuLoweringExtension()) } } diff --git a/plugins/atomicfu/atomicfu-compiler/test/org/jetbrains/kotlinx/atomicfu/AbstractAtomicfuJvmIrTest.kt b/plugins/atomicfu/atomicfu-compiler/test/org/jetbrains/kotlinx/atomicfu/AbstractAtomicfuJvmIrTest.kt index a5f4e1f1700..96b1ccfd40c 100644 --- a/plugins/atomicfu/atomicfu-compiler/test/org/jetbrains/kotlinx/atomicfu/AbstractAtomicfuJvmIrTest.kt +++ b/plugins/atomicfu/atomicfu-compiler/test/org/jetbrains/kotlinx/atomicfu/AbstractAtomicfuJvmIrTest.kt @@ -11,6 +11,8 @@ import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots import org.jetbrains.kotlin.codegen.AbstractAsmLikeInstructionListingTest +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar.ExtensionStorage import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.test.TargetBackend import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder @@ -53,8 +55,8 @@ private fun TestConfigurationBuilder.configureForKotlinxAtomicfu(librariesPaths: configuration.addJvmClasspathRoots(librariesPaths) } - override fun registerCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) { - AtomicfuComponentRegistrar.registerExtensions(project) + override fun ExtensionStorage.registerCompilerExtensions(module: TestModule, configuration: CompilerConfiguration) { + AtomicfuComponentRegistrar.registerExtensions(this) } } }) diff --git a/plugins/fir-plugin-prototype/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar b/plugins/fir-plugin-prototype/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar similarity index 100% rename from plugins/fir-plugin-prototype/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar rename to plugins/fir-plugin-prototype/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar diff --git a/plugins/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/FirPluginPrototypeExtensionRegistrar.kt b/plugins/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/FirPluginPrototypeExtensionRegistrar.kt index 0846c999070..0c08a41ad5b 100644 --- a/plugins/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/FirPluginPrototypeExtensionRegistrar.kt +++ b/plugins/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/FirPluginPrototypeExtensionRegistrar.kt @@ -5,13 +5,13 @@ package org.jetbrains.kotlin.fir.plugin -import com.intellij.mock.MockProject import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar +import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar +import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter import org.jetbrains.kotlin.fir.plugin.generators.* import org.jetbrains.kotlin.fir.plugin.types.FirNumberSignAttributeExtension -import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar -import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.ir.plugin.GeneratedDeclarationsIrBodyFiller class FirPluginPrototypeExtensionRegistrar : FirExtensionRegistrar() { @@ -32,9 +32,12 @@ class FirPluginPrototypeExtensionRegistrar : FirExtensionRegistrar() { } } -class FirPluginPrototypeComponentRegistrar : ComponentRegistrar { - override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) { - FirExtensionRegistrar.registerExtension(project, FirPluginPrototypeExtensionRegistrar()) - IrGenerationExtension.registerExtension(project, GeneratedDeclarationsIrBodyFiller()) +class FirPluginPrototypeComponentRegistrar : CompilerPluginRegistrar() { + override val supportsK2: Boolean + get() = true + + override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) { + FirExtensionRegistrarAdapter.registerExtension(FirPluginPrototypeExtensionRegistrar()) + IrGenerationExtension.registerExtension(GeneratedDeclarationsIrBodyFiller()) } } diff --git a/plugins/fir-plugin-prototype/tests/org/jetbrains/kotlin/fir/plugin/services/ExtensionRegistrarConfigurator.kt b/plugins/fir-plugin-prototype/tests/org/jetbrains/kotlin/fir/plugin/services/ExtensionRegistrarConfigurator.kt index a45a90d48fa..71725a1c3d7 100644 --- a/plugins/fir-plugin-prototype/tests/org/jetbrains/kotlin/fir/plugin/services/ExtensionRegistrarConfigurator.kt +++ b/plugins/fir-plugin-prototype/tests/org/jetbrains/kotlin/fir/plugin/services/ExtensionRegistrarConfigurator.kt @@ -5,10 +5,10 @@ package org.jetbrains.kotlin.fir.plugin.services -import com.intellij.openapi.project.Project import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar.ExtensionStorage import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar +import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter import org.jetbrains.kotlin.fir.plugin.FirPluginPrototypeExtensionRegistrar import org.jetbrains.kotlin.ir.plugin.GeneratedDeclarationsIrBodyFiller import org.jetbrains.kotlin.test.model.TestModule @@ -16,8 +16,8 @@ import org.jetbrains.kotlin.test.services.EnvironmentConfigurator import org.jetbrains.kotlin.test.services.TestServices class ExtensionRegistrarConfigurator(testServices: TestServices) : EnvironmentConfigurator(testServices) { - override fun registerCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) { - FirExtensionRegistrar.registerExtension(project, FirPluginPrototypeExtensionRegistrar()) - IrGenerationExtension.registerExtension(project, GeneratedDeclarationsIrBodyFiller()) + override fun ExtensionStorage.registerCompilerExtensions(module: TestModule, configuration: CompilerConfiguration) { + FirExtensionRegistrarAdapter.registerExtension(FirPluginPrototypeExtensionRegistrar()) + IrGenerationExtension.registerExtension(GeneratedDeclarationsIrBodyFiller()) } } diff --git a/plugins/imports-dumper/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar b/plugins/imports-dumper/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar similarity index 100% rename from plugins/imports-dumper/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar rename to plugins/imports-dumper/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar diff --git a/plugins/imports-dumper/src/org/jetbrains/kotlin/importsDumper/ImportsDumperComponentRegistrar.kt b/plugins/imports-dumper/src/org/jetbrains/kotlin/importsDumper/ImportsDumperComponentRegistrar.kt index 957e36396a5..38135d6ef2c 100644 --- a/plugins/imports-dumper/src/org/jetbrains/kotlin/importsDumper/ImportsDumperComponentRegistrar.kt +++ b/plugins/imports-dumper/src/org/jetbrains/kotlin/importsDumper/ImportsDumperComponentRegistrar.kt @@ -5,14 +5,16 @@ package org.jetbrains.kotlin.importsDumper -import com.intellij.mock.MockProject -import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension -class ImportsDumperComponentRegistrar : ComponentRegistrar { - override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) { +class ImportsDumperComponentRegistrar : CompilerPluginRegistrar() { + override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) { val destinationPath = configuration[ImportsDumperConfigurationKeys.DESTINATION] ?: return - AnalysisHandlerExtension.registerExtension(project, ImportsDumperExtension(destinationPath)) + AnalysisHandlerExtension.registerExtension(ImportsDumperExtension(destinationPath)) } -} \ No newline at end of file + + override val supportsK2: Boolean + get() = false +} diff --git a/plugins/jvm-abi-gen/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar b/plugins/jvm-abi-gen/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar similarity index 100% rename from plugins/jvm-abi-gen/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar rename to plugins/jvm-abi-gen/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar diff --git a/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/JvmAbiComponentRegistrar.kt b/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/JvmAbiComponentRegistrar.kt index 3750274b4f6..eedf59454c5 100644 --- a/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/JvmAbiComponentRegistrar.kt +++ b/plugins/jvm-abi-gen/src/org/jetbrains/kotlin/jvm/abi/JvmAbiComponentRegistrar.kt @@ -5,21 +5,20 @@ package org.jetbrains.kotlin.jvm.abi -import com.intellij.mock.MockProject import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.codegen.extensions.ClassBuilderInterceptorExtension import org.jetbrains.kotlin.codegen.extensions.ClassFileFactoryFinalizerExtension -import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.JVMConfigurationKeys import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension import java.io.File -class JvmAbiComponentRegistrar : ComponentRegistrar { - override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) { +class JvmAbiComponentRegistrar : CompilerPluginRegistrar() { + override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) { val outputPath = configuration.getNotNull(JvmAbiConfigurationKeys.OUTPUT_PATH) val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE) if (configuration.get(JvmAbiConfigurationKeys.LEGACY_ABI_GEN, false)) { @@ -33,14 +32,14 @@ class JvmAbiComponentRegistrar : ComponentRegistrar { val extension = JvmAbiAnalysisHandlerExtension(configuration.copy().apply { put(JVMConfigurationKeys.OUTPUT_DIRECTORY, File(outputPath)) }) - AnalysisHandlerExtension.registerExtension(project, extension) + AnalysisHandlerExtension.registerExtension(extension) } else { // Use the single-pass implementation, using the new ABI flag in the metadata. configuration.put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, true) val builderExtension = JvmAbiClassBuilderInterceptor() val outputExtension = JvmAbiOutputExtension(File(outputPath), builderExtension.abiClassInfo, messageCollector) - ClassBuilderInterceptorExtension.registerExtension(project, builderExtension) - ClassFileFactoryFinalizerExtension.registerExtension(project, outputExtension) + ClassBuilderInterceptorExtension.registerExtension( builderExtension) + ClassFileFactoryFinalizerExtension.registerExtension( outputExtension) } } diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar b/plugins/kotlin-serialization/kotlin-serialization-compiler/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar similarity index 100% rename from plugins/kotlin-serialization/kotlin-serialization-compiler/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar rename to plugins/kotlin-serialization/kotlin-serialization-compiler/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationComponentRegistrar.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationComponentRegistrar.kt index 76b4f75e2e8..8fe1a63e820 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationComponentRegistrar.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationComponentRegistrar.kt @@ -5,11 +5,9 @@ package org.jetbrains.kotlinx.serialization.compiler.extensions -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.ComponentRegistrar +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.useInstance @@ -24,28 +22,31 @@ import org.jetbrains.kotlin.serialization.DescriptorSerializerPlugin import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol import org.jetbrains.kotlinx.serialization.compiler.diagnostic.SerializationPluginDeclarationChecker -class SerializationComponentRegistrar : ComponentRegistrar { - override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) { - registerExtensions(project) +class SerializationComponentRegistrar : CompilerPluginRegistrar() { + override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) { + Companion.registerExtensions(this) } + override val supportsK2: Boolean + get() = false + companion object { - fun registerExtensions(project: Project) { + fun registerExtensions(extensionStorage: ExtensionStorage) = with(extensionStorage) { // This method is never called in the IDE, therefore this extension is not available there. // Since IDE does not perform any serialization of descriptors, metadata written to the 'serializationDescriptorSerializer' // is never deleted, effectively causing memory leaks. // So we create SerializationDescriptorSerializerPlugin only outside of IDE. val serializationDescriptorSerializer = SerializationDescriptorSerializerPlugin() - DescriptorSerializerPlugin.registerExtension(project, serializationDescriptorSerializer) + DescriptorSerializerPlugin.registerExtension(serializationDescriptorSerializer) registerProtoExtensions() - SyntheticResolveExtension.registerExtension(project, SerializationResolveExtension(serializationDescriptorSerializer)) + SyntheticResolveExtension.registerExtension(SerializationResolveExtension(serializationDescriptorSerializer)) - ExpressionCodegenExtension.registerExtension(project, SerializationCodegenExtension(serializationDescriptorSerializer)) - JsSyntheticTranslateExtension.registerExtension(project, SerializationJsExtension(serializationDescriptorSerializer)) - IrGenerationExtension.registerExtension(project, SerializationLoweringExtension(serializationDescriptorSerializer)) + ExpressionCodegenExtension.registerExtension(SerializationCodegenExtension(serializationDescriptorSerializer)) + JsSyntheticTranslateExtension.registerExtension(SerializationJsExtension(serializationDescriptorSerializer)) + IrGenerationExtension.registerExtension(SerializationLoweringExtension(serializationDescriptorSerializer)) - StorageComponentContainerContributor.registerExtension(project, SerializationPluginComponentContainerContributor()) + StorageComponentContainerContributor.registerExtension(SerializationPluginComponentContainerContributor()) } private fun registerProtoExtensions() { diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/AbstractSerializationIrBytecodeListingTest.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/AbstractSerializationIrBytecodeListingTest.kt index 919a7a387eb..2dddd4d0141 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/AbstractSerializationIrBytecodeListingTest.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/AbstractSerializationIrBytecodeListingTest.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.ObsoleteTestInfrastructure import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot import org.jetbrains.kotlin.codegen.AbstractAsmLikeInstructionListingTest +import org.jetbrains.kotlin.compiler.plugin.registerExtensionsForTest import org.jetbrains.kotlin.test.TargetBackend import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationComponentRegistrar import java.io.File @@ -24,7 +25,9 @@ abstract class AbstractSerializationIrBytecodeListingTest : AbstractAsmLikeInstr override val backend = TargetBackend.JVM_IR override fun setupEnvironment(environment: KotlinCoreEnvironment) { - SerializationComponentRegistrar.registerExtensions(environment.project) + registerExtensionsForTest(environment.project, environment.configuration) { + SerializationComponentRegistrar.registerExtensions(this) + } environment.updateClasspath(listOf(JvmClasspathRoot(coreLibraryPath!!))) } } diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/AbstractSerializationPluginBytecodeListingTest.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/AbstractSerializationPluginBytecodeListingTest.kt index c206f733696..67ec4a8faf9 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/AbstractSerializationPluginBytecodeListingTest.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/AbstractSerializationPluginBytecodeListingTest.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.ObsoleteTestInfrastructure import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot import org.jetbrains.kotlin.codegen.AbstractAsmLikeInstructionListingTest +import org.jetbrains.kotlin.compiler.plugin.registerExtensionsForTest import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationComponentRegistrar @OptIn(ObsoleteTestInfrastructure::class) @@ -16,7 +17,9 @@ abstract class AbstractSerializationPluginBytecodeListingTest : AbstractAsmLikeI private val coreLibraryPath = getSerializationCoreLibraryJar() override fun setupEnvironment(environment: KotlinCoreEnvironment) { - SerializationComponentRegistrar.registerExtensions(environment.project) + registerExtensionsForTest(environment.project, environment.configuration) { + SerializationComponentRegistrar.registerExtensions(this) + } environment.updateClasspath(listOf(JvmClasspathRoot(coreLibraryPath!!))) } } diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/AbstractSerializationPluginDiagnosticTest.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/AbstractSerializationPluginDiagnosticTest.kt index 3961143efb0..eac3fa64027 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/AbstractSerializationPluginDiagnosticTest.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/AbstractSerializationPluginDiagnosticTest.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.ObsoleteTestInfrastructure import org.jetbrains.kotlin.checkers.AbstractDiagnosticsTest import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot +import org.jetbrains.kotlin.compiler.plugin.registerExtensionsForTest import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationComponentRegistrar @OptIn(ObsoleteTestInfrastructure::class) @@ -16,7 +17,9 @@ abstract class AbstractSerializationPluginDiagnosticTest : AbstractDiagnosticsTe private val coreLibraryPath = getSerializationCoreLibraryJar() override fun setupEnvironment(environment: KotlinCoreEnvironment) { - SerializationComponentRegistrar.registerExtensions(environment.project) + registerExtensionsForTest(environment.project, environment.configuration) { + SerializationComponentRegistrar.registerExtensions(this) + } environment.updateClasspath(listOf(JvmClasspathRoot(coreLibraryPath!!))) } } diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/RuntimeSearch.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/RuntimeSearch.kt index c3998665a8a..eed6849104a 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/RuntimeSearch.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/RuntimeSearch.kt @@ -5,9 +5,9 @@ package org.jetbrains.kotlinx.serialization -import com.intellij.openapi.project.Project import junit.framework.TestCase import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar.ExtensionStorage import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.model.TestModule @@ -58,8 +58,8 @@ internal fun TestConfigurationBuilder.configureForKotlinxSerialization(libraries configuration.addJvmClasspathRoots(librariesPaths) } - override fun registerCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) { - SerializationComponentRegistrar.registerExtensions(project) + override fun ExtensionStorage.registerCompilerExtensions(module: TestModule, configuration: CompilerConfiguration) { + SerializationComponentRegistrar.registerExtensions(this) } } }) diff --git a/plugins/lombok/lombok.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar b/plugins/lombok/lombok.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar similarity index 100% rename from plugins/lombok/lombok.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar rename to plugins/lombok/lombok.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar diff --git a/plugins/lombok/lombok.cli/src/org/jetbrains/kotlin/lombok/LombokPlugin.kt b/plugins/lombok/lombok.cli/src/org/jetbrains/kotlin/lombok/LombokPlugin.kt index c83b1021e63..2cc8892b161 100644 --- a/plugins/lombok/lombok.cli/src/org/jetbrains/kotlin/lombok/LombokPlugin.kt +++ b/plugins/lombok/lombok.cli/src/org/jetbrains/kotlin/lombok/LombokPlugin.kt @@ -5,17 +5,15 @@ package org.jetbrains.kotlin.lombok -import com.intellij.mock.MockProject -import com.intellij.openapi.project.Project import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.compiler.plugin.AbstractCliOption import org.jetbrains.kotlin.compiler.plugin.CliOption import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor -import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfigurationKey -import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar +import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter import org.jetbrains.kotlin.lombok.LombokConfigurationKeys.CONFIG_FILE import org.jetbrains.kotlin.lombok.LombokPluginNames.CONFIG_OPTION_NAME import org.jetbrains.kotlin.lombok.LombokPluginNames.PLUGIN_ID @@ -23,26 +21,28 @@ import org.jetbrains.kotlin.lombok.k2.FirLombokRegistrar import org.jetbrains.kotlin.resolve.jvm.extensions.SyntheticJavaResolveExtension import java.io.File -class LombokComponentRegistrar : ComponentRegistrar { - +class LombokComponentRegistrar : CompilerPluginRegistrar() { companion object { - fun registerComponents(project: Project, compilerConfiguration: CompilerConfiguration) { + fun registerComponents(extensionStorage: ExtensionStorage, compilerConfiguration: CompilerConfiguration) = with(extensionStorage) { val configFile = compilerConfiguration[CONFIG_FILE] val config = LombokPluginConfig(configFile) - SyntheticJavaResolveExtension.registerExtension(project, LombokResolveExtension(config)) - FirExtensionRegistrar.registerExtension(project, FirLombokRegistrar(configFile)) + SyntheticJavaResolveExtension.registerExtension(LombokResolveExtension(config)) + FirExtensionRegistrarAdapter.registerExtension(FirLombokRegistrar(configFile)) } } - override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) { + override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) { configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) ?.report( CompilerMessageSeverity.WARNING, "Lombok Kotlin compiler plugin is an experimental feature." + " See: https://kotlinlang.org/docs/components-stability.html." ) - registerComponents(project, configuration) + registerComponents(this, configuration) } + + override val supportsK2: Boolean + get() = true } object LombokConfigurationKeys { diff --git a/plugins/lombok/tests/org/jetbrains/kotlin/lombok/LombokTests.kt b/plugins/lombok/tests/org/jetbrains/kotlin/lombok/LombokTests.kt index 3bf78ecb460..01940403686 100644 --- a/plugins/lombok/tests/org/jetbrains/kotlin/lombok/LombokTests.kt +++ b/plugins/lombok/tests/org/jetbrains/kotlin/lombok/LombokTests.kt @@ -5,9 +5,9 @@ package org.jetbrains.kotlin.lombok -import com.intellij.openapi.project.Project import lombok.Getter import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoot +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar.ExtensionStorage import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives @@ -19,7 +19,10 @@ import org.jetbrains.kotlin.test.runners.codegen.AbstractBlackBoxCodegenTest import org.jetbrains.kotlin.test.runners.codegen.AbstractFirBlackBoxCodegenTest import org.jetbrains.kotlin.test.runners.codegen.AbstractIrBlackBoxCodegenTest import org.jetbrains.kotlin.test.runners.configurationForClassicAndFirTestsAlongside -import org.jetbrains.kotlin.test.services.* +import org.jetbrains.kotlin.test.services.AdditionalSourceProvider +import org.jetbrains.kotlin.test.services.EnvironmentConfigurator +import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.test.services.sourceFileProvider import org.jetbrains.kotlin.utils.PathUtil import java.io.File @@ -99,7 +102,7 @@ class LombokEnvironmentConfigurator(testServices: TestServices) : EnvironmentCon } } - override fun registerCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) { - LombokComponentRegistrar.registerComponents(project, configuration) + override fun ExtensionStorage.registerCompilerExtensions(module: TestModule, configuration: CompilerConfiguration) { + LombokComponentRegistrar.registerComponents(this, configuration) } } diff --git a/plugins/noarg/noarg.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar b/plugins/noarg/noarg.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar similarity index 100% rename from plugins/noarg/noarg.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar rename to plugins/noarg/noarg.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar diff --git a/plugins/noarg/noarg.cli/src/org/jetbrains/kotlin/noarg/NoArgPlugin.kt b/plugins/noarg/noarg.cli/src/org/jetbrains/kotlin/noarg/NoArgPlugin.kt index 5d4f041c58c..10d0a365e1f 100644 --- a/plugins/noarg/noarg.cli/src/org/jetbrains/kotlin/noarg/NoArgPlugin.kt +++ b/plugins/noarg/noarg.cli/src/org/jetbrains/kotlin/noarg/NoArgPlugin.kt @@ -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, 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, + 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)) } } } diff --git a/plugins/noarg/test/org/jetbrains/kotlin/noarg/NoArgTests.kt b/plugins/noarg/test/org/jetbrains/kotlin/noarg/NoArgTests.kt index 3a147836047..0c64dca0eb6 100644 --- a/plugins/noarg/test/org/jetbrains/kotlin/noarg/NoArgTests.kt +++ b/plugins/noarg/test/org/jetbrains/kotlin/noarg/NoArgTests.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.noarg -import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.directives.model.DirectivesContainer @@ -94,9 +94,12 @@ class NoArgEnvironmentConfigurator(testServices: TestServices) : EnvironmentConf override val directiveContainers: List = listOf(NoArgDirectives) - override fun registerCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) { + override fun CompilerPluginRegistrar.ExtensionStorage.registerCompilerExtensions( + module: TestModule, + configuration: CompilerConfiguration + ) { NoArgComponentRegistrar.registerNoArgComponents( - project, + this, NOARG_ANNOTATIONS, useIr = module.targetBackend?.isIR == true, invokeInitializers = NoArgDirectives.INVOKE_INITIALIZERS in module.directives diff --git a/plugins/parcelize/parcelize-compiler/build.gradle.kts b/plugins/parcelize/parcelize-compiler/build.gradle.kts index aeb53d10419..671c52ddfe4 100644 --- a/plugins/parcelize/parcelize-compiler/build.gradle.kts +++ b/plugins/parcelize/parcelize-compiler/build.gradle.kts @@ -37,6 +37,7 @@ dependencies { testApi(projectTests(":compiler:test-infrastructure-utils")) // FIR dependencies + testApi(project(":compiler:fir:entrypoint")) testApi(project(":compiler:fir:checkers")) testApi(project(":compiler:fir:checkers:checkers.jvm")) testApi(project(":compiler:fir:checkers:checkers.js")) diff --git a/plugins/parcelize/parcelize-compiler/parcelize.cli/build.gradle.kts b/plugins/parcelize/parcelize-compiler/parcelize.cli/build.gradle.kts index d1e5c4ca1dd..096c307b9a2 100644 --- a/plugins/parcelize/parcelize-compiler/parcelize.cli/build.gradle.kts +++ b/plugins/parcelize/parcelize-compiler/parcelize.cli/build.gradle.kts @@ -12,6 +12,7 @@ dependencies { api(project(":plugins:parcelize:parcelize-compiler:parcelize.backend")) compileOnly(project(":compiler:plugin-api")) + compileOnly(project(":compiler:fir:entrypoint")) compileOnly(project(":compiler:backend")) compileOnly(project(":compiler:ir.backend.common")) compileOnly(intellijCore()) diff --git a/plugins/parcelize/parcelize-compiler/parcelize.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar b/plugins/parcelize/parcelize-compiler/parcelize.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar similarity index 100% rename from plugins/parcelize/parcelize-compiler/parcelize.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar rename to plugins/parcelize/parcelize-compiler/parcelize.cli/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar diff --git a/plugins/parcelize/parcelize-compiler/parcelize.cli/src/org/jetbrains/kotlin/parcelize/ParcelizeComponentRegistrar.kt b/plugins/parcelize/parcelize-compiler/parcelize.cli/src/org/jetbrains/kotlin/parcelize/ParcelizeComponentRegistrar.kt index 240e991e3ea..eb48399ee43 100644 --- a/plugins/parcelize/parcelize-compiler/parcelize.cli/src/org/jetbrains/kotlin/parcelize/ParcelizeComponentRegistrar.kt +++ b/plugins/parcelize/parcelize-compiler/parcelize.cli/src/org/jetbrains/kotlin/parcelize/ParcelizeComponentRegistrar.kt @@ -5,34 +5,35 @@ package org.jetbrains.kotlin.parcelize -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.ClassBuilderInterceptorExtension import org.jetbrains.kotlin.codegen.extensions.ExpressionCodegenExtension -import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.config.CompilerConfiguration 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.FirExtensionRegistrarAdapter +import org.jetbrains.kotlin.parcelize.fir.FirParcelizeExtensionRegistrar import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension -class ParcelizeComponentRegistrar : ComponentRegistrar { +class ParcelizeComponentRegistrar : CompilerPluginRegistrar() { companion object { - fun registerParcelizeComponents(project: Project) { - ExpressionCodegenExtension.registerExtension(project, ParcelizeCodegenExtension()) - IrGenerationExtension.registerExtension(project, ParcelizeIrGeneratorExtension()) - SyntheticResolveExtension.registerExtension(project, ParcelizeResolveExtension()) - ClassBuilderInterceptorExtension.registerExtension(project, ParcelizeClinitClassBuilderInterceptorExtension()) - StorageComponentContainerContributor.registerExtension(project, ParcelizeDeclarationCheckerComponentContainerContributor()) + fun registerParcelizeComponents(extensionStorage: ExtensionStorage) = with(extensionStorage) { + ExpressionCodegenExtension.registerExtension(ParcelizeCodegenExtension()) + IrGenerationExtension.registerExtension(ParcelizeIrGeneratorExtension()) + SyntheticResolveExtension.registerExtension(ParcelizeResolveExtension()) + ClassBuilderInterceptorExtension.registerExtension(ParcelizeClinitClassBuilderInterceptorExtension()) + StorageComponentContainerContributor.registerExtension(ParcelizeDeclarationCheckerComponentContainerContributor()) + FirExtensionRegistrarAdapter.registerExtension(FirParcelizeExtensionRegistrar()) } } - override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) { - registerParcelizeComponents(project) + override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) { + registerParcelizeComponents(this) } override val supportsK2: Boolean diff --git a/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/runners/AbstractFirParcelizeDiagnosticTest.kt b/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/runners/AbstractFirParcelizeDiagnosticTest.kt index d131e2d6d02..4bef76dff35 100644 --- a/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/runners/AbstractFirParcelizeDiagnosticTest.kt +++ b/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/runners/AbstractFirParcelizeDiagnosticTest.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.parcelize.test.runners import org.jetbrains.kotlin.parcelize.test.services.ParcelizeEnvironmentConfigurator -import org.jetbrains.kotlin.test.bind import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives import org.jetbrains.kotlin.test.frontend.fir.FirFailingTestSuppressor @@ -23,7 +22,7 @@ abstract class AbstractFirParcelizeDiagnosticTest : AbstractKotlinCompilerTest() +FirDiagnosticsDirectives.ENABLE_PLUGIN_PHASES } - useConfigurators(::ParcelizeEnvironmentConfigurator.bind(true)) + useConfigurators(::ParcelizeEnvironmentConfigurator) useAfterAnalysisCheckers( ::FirIdenticalChecker, diff --git a/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/runners/AbstractParcelizeBoxTest.kt b/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/runners/AbstractParcelizeBoxTest.kt index 9cf16103ce2..6224d7f82dc 100644 --- a/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/runners/AbstractParcelizeBoxTest.kt +++ b/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/runners/AbstractParcelizeBoxTest.kt @@ -5,7 +5,10 @@ package org.jetbrains.kotlin.parcelize.test.runners -import org.jetbrains.kotlin.parcelize.test.services.* +import org.jetbrains.kotlin.parcelize.test.services.ParcelizeEnvironmentConfigurator +import org.jetbrains.kotlin.parcelize.test.services.ParcelizeMainClassProvider +import org.jetbrains.kotlin.parcelize.test.services.ParcelizeRuntimeClasspathProvider +import org.jetbrains.kotlin.parcelize.test.services.ParcelizeUtilSourcesProvider import org.jetbrains.kotlin.test.Constructor import org.jetbrains.kotlin.test.TargetBackend import org.jetbrains.kotlin.test.backend.BlackBoxCodegenSuppressor @@ -14,8 +17,10 @@ import org.jetbrains.kotlin.test.backend.classic.ClassicJvmBackendFacade import org.jetbrains.kotlin.test.backend.handlers.IrTextDumpHandler import org.jetbrains.kotlin.test.backend.ir.IrBackendInput import org.jetbrains.kotlin.test.backend.ir.JvmIrBackendFacade -import org.jetbrains.kotlin.test.bind -import org.jetbrains.kotlin.test.builders.* +import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder +import org.jetbrains.kotlin.test.builders.configureClassicFrontendHandlersStep +import org.jetbrains.kotlin.test.builders.configureFirHandlersStep +import org.jetbrains.kotlin.test.builders.configureIrHandlersStep import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.REQUIRES_SEPARATE_PROCESS import org.jetbrains.kotlin.test.directives.DiagnosticsDirectives.REPORT_ONLY_EXPLICITLY_DEFINED_DEBUG_INFO import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives.ENABLE_PLUGIN_PHASES @@ -71,7 +76,7 @@ abstract class AbstractParcelizeBoxTestBase SUPPORTED_PRESETS[preset]?.let { annotations += it } } if (annotations.isEmpty()) return - StorageComponentContainerContributor.registerExtension(project, CliSamWithReceiverComponentContributor(annotations)) - FirExtensionRegistrarAdapter.registerExtension(project, FirSamWithReceiverExtensionRegistrar(annotations)) + StorageComponentContainerContributor.registerExtension(CliSamWithReceiverComponentContributor(annotations)) + FirExtensionRegistrarAdapter.registerExtension(FirSamWithReceiverExtensionRegistrar(annotations)) } + + override val supportsK2: Boolean + get() = true } class CliSamWithReceiverComponentContributor(val annotations: List) : StorageComponentContainerContributor { diff --git a/plugins/sam-with-receiver/test/org/jetbrains/kotlin/samWithReceiver/AbstractSamWithReceiverScriptNewDefTest.kt b/plugins/sam-with-receiver/test/org/jetbrains/kotlin/samWithReceiver/AbstractSamWithReceiverScriptNewDefTest.kt index 03ffe20d3f1..50cc742d2ba 100644 --- a/plugins/sam-with-receiver/test/org/jetbrains/kotlin/samWithReceiver/AbstractSamWithReceiverScriptNewDefTest.kt +++ b/plugins/sam-with-receiver/test/org/jetbrains/kotlin/samWithReceiver/AbstractSamWithReceiverScriptNewDefTest.kt @@ -5,11 +5,11 @@ package org.jetbrains.kotlin.samWithReceiver -import com.intellij.mock.MockProject import org.jetbrains.kotlin.ObsoleteTestInfrastructure import org.jetbrains.kotlin.TestsCompilerError import org.jetbrains.kotlin.checkers.AbstractDiagnosticsTest import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.compiler.plugin.registerExtensionsForTest import org.jetbrains.kotlin.scripting.compiler.plugin.impl.ScriptJvmCompilerFromEnvironment import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition @@ -38,7 +38,9 @@ abstract class AbstractSamWithReceiverScriptNewDefTest : AbstractDiagnosticsTest val scriptCompiler = ScriptJvmCompilerFromEnvironment(environment) val res = scriptCompiler.compile("42".toScriptSource("\$init"), ScriptForSamWithReceiversNewDefCompilationConfiguration) Assert.assertTrue(res is ResultWithDiagnostics.Success<*>) - SamWithReceiverComponentRegistrar().registerProjectComponents(environment.project as MockProject, environment.configuration) + registerExtensionsForTest(environment.project, environment.configuration) { + with(SamWithReceiverComponentRegistrar()) { registerExtensions(it) } + } } override fun analyzeAndCheck(testDataFile: File, files: List) { diff --git a/plugins/sam-with-receiver/test/org/jetbrains/kotlin/samWithReceiver/SamWithReceiverTests.kt b/plugins/sam-with-receiver/test/org/jetbrains/kotlin/samWithReceiver/SamWithReceiverTests.kt index 6b269f72b75..5c0f021bb13 100644 --- a/plugins/sam-with-receiver/test/org/jetbrains/kotlin/samWithReceiver/SamWithReceiverTests.kt +++ b/plugins/sam-with-receiver/test/org/jetbrains/kotlin/samWithReceiver/SamWithReceiverTests.kt @@ -5,7 +5,7 @@ package org.jetbrains.kotlin.samWithReceiver -import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar.ExtensionStorage import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter @@ -60,12 +60,11 @@ class SamWithReceiverEnvironmentConfigurator(testServices: TestServices) : Envir private val TEST_ANNOTATIONS = listOf("SamWithReceiver") } - override fun registerCompilerExtensions(project: Project, module: TestModule, configuration: CompilerConfiguration) { - StorageComponentContainerContributor.registerExtension( - project, - CliSamWithReceiverComponentContributor(TEST_ANNOTATIONS) - ) - - FirExtensionRegistrarAdapter.registerExtension(project, FirSamWithReceiverExtensionRegistrar(TEST_ANNOTATIONS)) + override fun ExtensionStorage.registerCompilerExtensions( + module: TestModule, + configuration: CompilerConfiguration + ) { + StorageComponentContainerContributor.registerExtension(CliSamWithReceiverComponentContributor(TEST_ANNOTATIONS)) + FirExtensionRegistrarAdapter.registerExtension(FirSamWithReceiverExtensionRegistrar(TEST_ANNOTATIONS)) } } diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/loadCompilerPlugins.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/loadCompilerPlugins.kt index 9fa0c44c8b7..e66df6410fb 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/loadCompilerPlugins.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/impl/loadCompilerPlugins.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.jvm.plugins.processCompilerPluginsOptions import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar +import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCommandLineProcessor import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar @@ -32,6 +33,10 @@ internal fun CompilerConfiguration.loadPlugins() { val registrars = classLoader.loadServices(scriptCompilationDisabledPlugins, SCRIPT_COMPILATION_DISABLE_PLUGINS_PROPERTY) addAll(ComponentRegistrar.PLUGIN_COMPONENT_REGISTRARS, registrars) + val k2Registrars = + classLoader.loadServices(scriptCompilationDisabledPlugins, SCRIPT_COMPILATION_DISABLE_PLUGINS_PROPERTY) + addAll(CompilerPluginRegistrar.COMPILER_PLUGIN_REGISTRARS, k2Registrars) + } internal fun CompilerConfiguration.processPluginsCommandLine(arguments: K2JVMCompilerArguments) {