From 65e240679e32d0c41c8880047548a8310dcdf929 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 21 Jun 2022 14:31:03 +0300 Subject: [PATCH] [FE] Move utility of parsing plugin options to :compiler:frontend.common This is needed to be able to use this utility inside FIR part of IDE plugin --- build.gradle.kts | 1 + compiler/cli/cli-common/build.gradle.kts | 3 +- .../cli/plugins/PluginsOptionsParser.kt | 55 +++++++++++++++++++ .../kotlin/cli/common/CLICompiler.kt | 2 +- .../kotlin/cli/jvm/plugins/PluginCliParser.kt | 47 +--------------- .../plugin/impl/loadCompilerPlugins.kt | 2 +- 6 files changed, 61 insertions(+), 49 deletions(-) create mode 100644 compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/plugins/PluginsOptionsParser.kt diff --git a/build.gradle.kts b/build.gradle.kts index 65537deb519..1bff9881c30 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -146,6 +146,7 @@ val commonCompilerModules = arrayOf( ":compiler:frontend.common", ":compiler:util", ":compiler:config.jvm", + ":compiler:cli-common", ":compiler:resolution.common", ":compiler:resolution.common.jvm", ":core:metadata", diff --git a/compiler/cli/cli-common/build.gradle.kts b/compiler/cli/cli-common/build.gradle.kts index d4288fd82ca..8f4f39d7fbe 100644 --- a/compiler/cli/cli-common/build.gradle.kts +++ b/compiler/cli/cli-common/build.gradle.kts @@ -9,6 +9,7 @@ dependencies { api(project(":compiler:config.jvm")) api(project(":js:js.config")) api(project(":native:kotlin-native-utils")) + api(project(":compiler:plugin-api")) compileOnly(project(":kotlin-reflect-api")) compileOnly(intellijCore()) compileOnly(commonDependency("com.google.guava:guava")) @@ -23,4 +24,4 @@ sourceSets { tasks.getByName("jar") { //excludes unused bunch files exclude("META-INF/extensions/*.xml.**") -} \ No newline at end of file +} diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/plugins/PluginsOptionsParser.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/plugins/PluginsOptionsParser.kt new file mode 100644 index 00000000000..3582b221723 --- /dev/null +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/plugins/PluginsOptionsParser.kt @@ -0,0 +1,55 @@ +/* + * 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.cli.plugins + +import com.intellij.util.containers.MultiMap +import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments +import org.jetbrains.kotlin.compiler.plugin.* +import org.jetbrains.kotlin.config.CompilerConfiguration + +fun processCompilerPluginsOptions( + configuration: CompilerConfiguration, + pluginOptions: Iterable?, + commandLineProcessors: List +) { + val optionValuesByPlugin = pluginOptions?.map(::parsePluginOption)?.groupBy { + if (it == null) throw CliOptionProcessingException("Wrong plugin option format: $it, should be ${CommonCompilerArguments.PLUGIN_OPTION_FORMAT}") + it.pluginId + } ?: mapOf() + + for (processor in commandLineProcessors) { + val declaredOptions = processor.pluginOptions.associateBy { it.optionName } + val optionsToValues = MultiMap() + + for (optionValue in optionValuesByPlugin[processor.pluginId].orEmpty()) { + val option = declaredOptions[optionValue!!.optionName] + ?: throw CliOptionProcessingException("Unsupported plugin option: $optionValue") + optionsToValues.putValue(option, optionValue) + } + + for (option in processor.pluginOptions) { + val values = optionsToValues[option] + if (option.required && values.isEmpty()) { + throw PluginCliOptionProcessingException( + processor.pluginId, + processor.pluginOptions, + "Required plugin option not present: ${processor.pluginId}:${option.optionName}" + ) + } + if (!option.allowMultipleOccurrences && values.size > 1) { + throw PluginCliOptionProcessingException( + processor.pluginId, + processor.pluginOptions, + "Multiple values are not allowed for plugin option ${processor.pluginId}:${option.optionName}" + ) + } + + for (value in values) { + processor.processOption(option, value.value, configuration) + } + } + } +} diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLICompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLICompiler.kt index a5d85c1c220..3c19cb9f2c2 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLICompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLICompiler.kt @@ -30,7 +30,7 @@ import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.ERROR import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.INFO import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.LOGGING import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser -import org.jetbrains.kotlin.cli.jvm.plugins.processCompilerPluginsOptions +import org.jetbrains.kotlin.cli.plugins.processCompilerPluginsOptions import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar import org.jetbrains.kotlin.config.CompilerConfiguration 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 b3d997fb3b3..cc3cb65b567 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 @@ -16,12 +16,11 @@ package org.jetbrains.kotlin.cli.jvm.plugins -import com.intellij.util.containers.MultiMap import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.ExitCode -import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.cli.common.messages.MessageCollectorUtil +import org.jetbrains.kotlin.cli.plugins.processCompilerPluginsOptions import org.jetbrains.kotlin.compiler.plugin.* import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.util.ServiceLoaderLite @@ -88,47 +87,3 @@ object PluginCliParser { processCompilerPluginsOptions(configuration, pluginOptions, commandLineProcessors) } } - -fun processCompilerPluginsOptions( - configuration: CompilerConfiguration, - pluginOptions: Iterable?, - commandLineProcessors: List -) { - val optionValuesByPlugin = pluginOptions?.map(::parsePluginOption)?.groupBy { - if (it == null) throw CliOptionProcessingException("Wrong plugin option format: $it, should be ${CommonCompilerArguments.PLUGIN_OPTION_FORMAT}") - it.pluginId - } ?: mapOf() - - for (processor in commandLineProcessors) { - val declaredOptions = processor.pluginOptions.associateBy { it.optionName } - val optionsToValues = MultiMap() - - for (optionValue in optionValuesByPlugin[processor.pluginId].orEmpty()) { - val option = declaredOptions[optionValue!!.optionName] - ?: throw CliOptionProcessingException("Unsupported plugin option: $optionValue") - optionsToValues.putValue(option, optionValue) - } - - for (option in processor.pluginOptions) { - val values = optionsToValues[option] - if (option.required && values.isEmpty()) { - throw PluginCliOptionProcessingException( - processor.pluginId, - processor.pluginOptions, - "Required plugin option not present: ${processor.pluginId}:${option.optionName}" - ) - } - if (!option.allowMultipleOccurrences && values.size > 1) { - throw PluginCliOptionProcessingException( - processor.pluginId, - processor.pluginOptions, - "Multiple values are not allowed for plugin option ${processor.pluginId}:${option.optionName}" - ) - } - - for (value in values) { - processor.processOption(option, value.value, configuration) - } - } - } -} 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 72455a6f720..21b70cf4c89 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 @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.scripting.compiler.plugin.impl import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments -import org.jetbrains.kotlin.cli.jvm.plugins.processCompilerPluginsOptions +import org.jetbrains.kotlin.cli.plugins.processCompilerPluginsOptions import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar