From 4003ca069107c5da4fa5ec16c535e1168467300b Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 13 May 2022 16:43:14 +0300 Subject: [PATCH] [FE] Add ability to set compatibility of plugin with K2 in ComponentRegistrar --- .../jvm/compiler/FirKotlinToJvmBytecodeCompiler.kt | 12 ++++++++---- .../kotlin/compiler/plugin/ComponentRegistrar.kt | 3 +++ compiler/testData/cli/jvm/pluginWithK2Error.out | 5 +++-- .../scripting/compiler/plugin/pluginRegisrar.kt | 7 ++++++- 4 files changed, 20 insertions(+), 7 deletions(-) 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 8d6283034ff..590dbe1b782 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 @@ -87,13 +87,17 @@ object FirKotlinToJvmBytecodeCompiler { ) projectConfiguration.get(ComponentRegistrar.PLUGIN_COMPONENT_REGISTRARS)?.let { pluginComponentRegistrars -> - val nonScriptPlugins = pluginComponentRegistrars.filter { - it::class.java.canonicalName != CLICompiler.SCRIPT_PLUGIN_REGISTRAR_NAME + val notSupportedPlugins = pluginComponentRegistrars.filter { + !it.supportsK2 || it::class.java.canonicalName != CLICompiler.SCRIPT_PLUGIN_REGISTRAR_NAME } - if (nonScriptPlugins.isNotEmpty()) { + if (notSupportedPlugins.isNotEmpty()) { messageCollector.report( CompilerMessageSeverity.ERROR, - "Compiler plugins are enabled with K2 compiler.\n K2 does not support plugins yet, so please remove -Xuse-k2 flag" + """ + |There are some plugins incompatible with K2 compiler: + |${notSupportedPlugins.joinToString(separator = "\n|") { " ${it::class.qualifiedName}" }} + |Please remove -Xuse-k2 + """.trimMargin() ) return false } 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 bf8b28eba46..75a4c23344f 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 @@ -26,4 +26,7 @@ interface ComponentRegistrar { } fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) + + val supportsK2: Boolean + get() = false } diff --git a/compiler/testData/cli/jvm/pluginWithK2Error.out b/compiler/testData/cli/jvm/pluginWithK2Error.out index 0027adf8884..092c02de5fd 100644 --- a/compiler/testData/cli/jvm/pluginWithK2Error.out +++ b/compiler/testData/cli/jvm/pluginWithK2Error.out @@ -1,6 +1,7 @@ warning: ATTENTION! This build uses experimental K2 compiler: -Xuse-k2 -error: compiler plugins are enabled with K2 compiler. - K2 does not support plugins yet, so please remove -Xuse-k2 flag +error: there are some plugins incompatible with K2 compiler: + org.jetbrains.kotlin.android.synthetic.AndroidComponentRegistrar +Please remove -Xuse-k2 COMPILATION_ERROR diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/pluginRegisrar.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/pluginRegisrar.kt index c26cceac94e..288960a72ac 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/pluginRegisrar.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/pluginRegisrar.kt @@ -43,6 +43,11 @@ private fun ProjectExtensionDescriptor.registerExtensionIfRequired( } class ScriptingCompilerConfigurationComponentRegistrar : ComponentRegistrar { + // Actually this plugin don't support K2, but it automatically registered in some cases, + // so for now this flag is just a stub + override val supportsK2: Boolean + get() = true + override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) { val messageCollector = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) val hostConfiguration = ScriptingHostConfiguration(defaultJvmScriptingHostConfiguration) { @@ -84,4 +89,4 @@ private inline fun withClassloadingProblemsReporting(messageCollector: MessageCo System.err.println(msg) } } -} \ No newline at end of file +}