From 70fc891260afe7178ce8deb1d28facde1c63ba4b Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 9 Jan 2023 15:39:06 +0100 Subject: [PATCH] K2: move -Xuse-k2 VS language version checks to CommonCompilerArguments --- .../arguments/CommonCompilerArguments.kt | 36 ++++++++++++++++--- .../kotlin/cli/common/CLICompiler.kt | 30 ---------------- .../fir/session/FirSessionFactoryHelper.kt | 2 -- .../CompilerTestLanguageVersionSettings.kt | 4 --- .../kotlin/config/LanguageVersionSettings.kt | 5 --- 5 files changed, 32 insertions(+), 45 deletions(-) diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt index f363422b2b2..0bdd5b39efa 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt @@ -602,10 +602,7 @@ abstract class CommonCompilerArguments : CommonToolArguments() { collector: MessageCollector, additionalAnalysisFlags: Map, Any> ): LanguageVersionSettings { - // If only "-api-version" is specified, language version is assumed to be the latest stable - val languageVersion = parseVersion(collector, languageVersion, "language") - ?: defaultLanguageVersion(collector) - + val languageVersion = parseOrConfigureLanguageVersion(collector) // If only "-language-version" is specified, API version is assumed to be equal to the language version // (API version cannot be greater than the language version) val apiVersion = ApiVersion.createByLanguageVersion(parseVersion(collector, apiVersion, "API") ?: languageVersion) @@ -709,6 +706,37 @@ abstract class CommonCompilerArguments : CommonToolArguments() { LANGUAGE("Language"), API("API") } + private fun parseOrConfigureLanguageVersion(collector: MessageCollector): LanguageVersion { + // If only "-api-version" is specified, language version is assumed to be the latest stable (or 2.0 with -Xuse-k2) + val explicitVersion = parseVersion(collector, languageVersion, "language") + val explicitOrDefaultVersion = explicitVersion ?: defaultLanguageVersion(collector) + if (useK2) { + when { + explicitVersion?.usesK2 == true -> { + collector.report( + CompilerMessageSeverity.STRONG_WARNING, + "Compiler flag -Xuse-k2 is redundant, the \"-language-version 2.0\" is used instead" + ) + } + explicitVersion != null -> { + collector.report( + CompilerMessageSeverity.STRONG_WARNING, + "With -Xuse-k2 compiler flag \"-language-version $explicitVersion\" has no effect," + + " please remove -Xuse-k2 flag and use \"-language-version 2.0\" instead" + ) + } + else -> { + collector.report( + CompilerMessageSeverity.STRONG_WARNING, + "Compiler flag -Xuse-k2 is deprecated, please use \"-language-version 2.0\" instead" + ) + } + } + } + return if (useK2 && !explicitOrDefaultVersion.usesK2) LanguageVersion.KOTLIN_2_0 + else explicitOrDefaultVersion + } + private fun parseVersion(collector: MessageCollector, value: String?, versionOf: String): LanguageVersion? = if (value == null) null else LanguageVersion.fromVersionString(value) 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 88da94786ca..6f4cc43c823 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLICompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLICompiler.kt @@ -97,36 +97,6 @@ abstract class CLICompiler : CLITool() { try { setIdeaIoUseFallback() - val useK2FromFlag = arguments.useK2 - val languageVersion = configuration.languageVersionSettings.languageVersion - if (useK2FromFlag) { - when { - arguments.languageVersion == null -> { - messageCollector.report( - STRONG_WARNING, - "Compiler flag -Xuse-k2 is deprecated, please use \"-language-version 2.0\" instead" - ) - } - languageVersion.usesK2 -> { - messageCollector.report( - STRONG_WARNING, - "Compiler flag -Xuse-k2 is redundant, the \"-language-version 2.0\" is used instead" - ) - } - else -> { - messageCollector.report( - STRONG_WARNING, - "With -Xuse-k2 compiler flag \"-language-version $languageVersion\" has no effect, please remove -Xuse-k2 flag and use \"-language-version 2.0\" instead" - ) - } - } - if (!languageVersion.usesK2) { - val languageVersionSettings = configuration.languageVersionSettings - configuration.languageVersionSettings = languageVersionSettings.copy(LanguageVersion.KOTLIN_2_0) - arguments.checkLanguageVersionIsStable(LanguageVersion.KOTLIN_2_0, messageCollector) - } - } - val code = doExecute(arguments, configuration, rootDisposable, paths) performanceManager.notifyCompilationFinished() diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactoryHelper.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactoryHelper.kt index 359c103165f..801ecd2b4e1 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactoryHelper.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirSessionFactoryHelper.kt @@ -108,8 +108,6 @@ object FirSessionFactoryHelper { override fun getFlag(flag: AnalysisFlag): T = stub() - override fun copy(languageVersion: LanguageVersion): LanguageVersionSettings = this - override val apiVersion: ApiVersion get() = stub() override val languageVersion: LanguageVersion diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/CompilerTestLanguageVersionSettings.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/CompilerTestLanguageVersionSettings.kt index add33ac01e7..7e0d8fc655f 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/CompilerTestLanguageVersionSettings.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/checkers/CompilerTestLanguageVersionSettings.kt @@ -39,10 +39,6 @@ data class CompilerTestLanguageVersionSettings( override fun isPreRelease(): Boolean = false - override fun copy(languageVersion: LanguageVersion): LanguageVersionSettings { - return CompilerTestLanguageVersionSettings(initialLanguageFeatures, apiVersion, languageVersion, analysisFlags) - } - @Suppress("UNCHECKED_CAST") override fun getFlag(flag: AnalysisFlag): T = analysisFlags[flag] as T? ?: flag.defaultValue } diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index e4b4a4649ef..2d067010c0d 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -507,8 +507,6 @@ interface LanguageVersionSettings { // Please do not use this to enable/disable specific features/checks. Instead add a new LanguageFeature entry and call supportsFeature val languageVersion: LanguageVersion - fun copy(languageVersion: LanguageVersion): LanguageVersionSettings = this - companion object { const val RESOURCE_NAME_TO_ALLOW_READING_FROM_ENVIRONMENT = "META-INF/allow-configuring-from-environment" } @@ -557,9 +555,6 @@ class LanguageVersionSettingsImpl @JvmOverloads constructor( state == LanguageFeature.State.ENABLED && feature.forcesPreReleaseBinariesIfEnabled() } - override fun copy(languageVersion: LanguageVersion): LanguageVersionSettings = - LanguageVersionSettingsImpl(languageVersion, apiVersion, analysisFlags, specificFeatures) - companion object { @JvmField val DEFAULT = LanguageVersionSettingsImpl(LanguageVersion.LATEST_STABLE, ApiVersion.LATEST_STABLE)