From 3c982740063bd34931ea160e8b2b0fc05d326a4f Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 4 Dec 2017 18:11:51 +0100 Subject: [PATCH] Move -Xjsr-305 argument parsing out of K2JVMCompilerArguments To simplify K2JVMCompilerArguments, which is mostly a data holder --- .../cli/common/arguments/Jsr305Parser.kt | 98 +++++++++++++++++++ .../arguments/K2JVMCompilerArguments.kt | 76 +------------- .../compiler/IDELanguageSettingsProvider.kt | 9 +- 3 files changed, 105 insertions(+), 78 deletions(-) create mode 100644 compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/Jsr305Parser.kt diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/Jsr305Parser.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/Jsr305Parser.kt new file mode 100644 index 00000000000..b21136a7779 --- /dev/null +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/Jsr305Parser.kt @@ -0,0 +1,98 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.cli.common.arguments + +import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity +import org.jetbrains.kotlin.cli.common.messages.MessageCollector +import org.jetbrains.kotlin.utils.Jsr305State +import org.jetbrains.kotlin.utils.ReportLevel + +class Jsr305Parser(private val collector: MessageCollector) { + fun parse(value: Array?): Jsr305State { + var global: ReportLevel? = null + var migration: ReportLevel? = null + val userDefined = mutableMapOf() + + fun parseJsr305UnderMigration(item: String): ReportLevel? { + val rawState = item.split(":").takeIf { it.size == 2 }?.get(1) + return ReportLevel.findByDescription(rawState) ?: reportUnrecognizedJsr305(item).let { null } + } + + value?.forEach { item -> + when { + item.startsWith("@") -> { + val (name, state) = parseJsr305UserDefined(item) ?: return@forEach + val current = userDefined[name] + if (current != null) { + reportDuplicateJsr305("@$name:${current.description}", item) + return@forEach + } + userDefined[name] = state + } + item.startsWith("under-migration") -> { + if (migration != null) { + reportDuplicateJsr305("under-migration:${migration?.description}", item) + return@forEach + } + + migration = parseJsr305UnderMigration(item) + } + item == "enable" -> { + collector.report( + CompilerMessageSeverity.STRONG_WARNING, + "Option 'enable' for -Xjsr305 flag is deprecated. Please use 'strict' instead" + ) + if (global != null) return@forEach + + global = ReportLevel.STRICT + } + else -> { + if (global != null) { + reportDuplicateJsr305(global!!.description, item) + return@forEach + } + global = ReportLevel.findByDescription(item) + } + } + } + + val state = Jsr305State(global ?: ReportLevel.WARN, migration, userDefined) + return if (state == Jsr305State.DISABLED) Jsr305State.DISABLED else state + } + + private fun reportUnrecognizedJsr305(item: String) { + collector.report(CompilerMessageSeverity.ERROR, "Unrecognized -Xjsr305 value: $item") + } + + private fun reportDuplicateJsr305(first: String, second: String) { + collector.report(CompilerMessageSeverity.ERROR, "Conflict duplicating -Xjsr305 value: $first, $second") + } + + private fun parseJsr305UserDefined(item: String): Pair? { + val (name, rawState) = item.substring(1).split(":").takeIf { it.size == 2 } ?: run { + reportUnrecognizedJsr305(item) + return null + } + + val state = ReportLevel.findByDescription(rawState) ?: run { + reportUnrecognizedJsr305(item) + return null + } + + return name to state + } +} diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt index 98ee325153f..450d27fa2c2 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt @@ -202,81 +202,7 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { override fun configureAnalysisFlags(collector: MessageCollector): MutableMap, Any> { val result = super.configureAnalysisFlags(collector) - result[AnalysisFlag.jsr305] = parseJsr305(collector) + result[AnalysisFlag.jsr305] = Jsr305Parser(collector).parse(jsr305) return result } - - fun parseJsr305(collector: MessageCollector): Jsr305State { - var global: ReportLevel? = null - var migration: ReportLevel? = null - val userDefined = mutableMapOf() - - fun parseJsr305UnderMigration(collector: MessageCollector, item: String): ReportLevel? { - val rawState = item.split(":").takeIf { it.size == 2 }?.get(1) - return ReportLevel.findByDescription(rawState) ?: reportUnrecognizedJsr305(collector, item).let { null } - } - - jsr305?.forEach { item -> - when { - item.startsWith("@") -> { - val (name, state) = parseJsr305UserDefined(collector, item) ?: return@forEach - val current = userDefined[name] - if (current != null) { - reportDuplicateJsr305(collector, "@$name:${current.description}", item) - return@forEach - } - userDefined[name] = state - } - item.startsWith("under-migration") -> { - if (migration != null) { - reportDuplicateJsr305(collector, "under-migration:${migration?.description}", item) - return@forEach - } - - migration = parseJsr305UnderMigration(collector, item) - } - item == "enable" -> { - collector.report( - CompilerMessageSeverity.STRONG_WARNING, - "Option 'enable' for -Xjsr305 flag is deprecated. Please use 'strict' instead" - ) - if (global != null) return@forEach - - global = ReportLevel.STRICT - } - else -> { - if (global != null) { - reportDuplicateJsr305(collector, global!!.description, item) - return@forEach - } - global = ReportLevel.findByDescription(item) - } - } - } - - val state = Jsr305State(global ?: ReportLevel.WARN, migration, userDefined) - return if (state == Jsr305State.DISABLED) Jsr305State.DISABLED else state - } - - private fun reportUnrecognizedJsr305(collector: MessageCollector, item: String) { - collector.report(CompilerMessageSeverity.ERROR, "Unrecognized -Xjsr305 value: $item") - } - - private fun reportDuplicateJsr305(collector: MessageCollector, first: String, second: String) { - collector.report(CompilerMessageSeverity.ERROR, "Conflict duplicating -Xjsr305 value: $first, $second") - } - - private fun parseJsr305UserDefined(collector: MessageCollector, item: String): Pair? { - val (name, rawState) = item.substring(1).split(":").takeIf { it.size == 2 } ?: run { - reportUnrecognizedJsr305(collector, item) - return null - } - - val state = ReportLevel.findByDescription(rawState) ?: run { - reportUnrecognizedJsr305(collector, item) - return null - } - - return name to state - } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt index 8706ba0493a..619dc8769e5 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IDELanguageSettingsProvider.kt @@ -20,15 +20,18 @@ import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.project.Project import org.jetbrains.kotlin.analyzer.LanguageSettingsProvider import org.jetbrains.kotlin.analyzer.ModuleInfo +import org.jetbrains.kotlin.cli.common.arguments.Jsr305Parser import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.common.messages.MessageCollector -import org.jetbrains.kotlin.config.* +import org.jetbrains.kotlin.config.AnalysisFlag +import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider +import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.config.TargetPlatformVersion import org.jetbrains.kotlin.idea.caches.resolve.LibraryInfo import org.jetbrains.kotlin.idea.caches.resolve.ModuleSourceInfo import org.jetbrains.kotlin.idea.project.getLanguageVersionSettings import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.project.targetPlatform -import org.jetbrains.kotlin.utils.Jsr305State object IDELanguageSettingsProvider : LanguageSettingsProvider { override fun getLanguageVersionSettings(moduleInfo: ModuleInfo, project: Project): LanguageVersionSettings = @@ -44,7 +47,7 @@ object IDELanguageSettingsProvider : LanguageSettingsProvider { val settings = KotlinFacetSettingsProvider.getInstance(project).getSettings(module) ?: continue val compilerArguments = settings.mergedCompilerArguments as? K2JVMCompilerArguments ?: continue - val jsr305State = compilerArguments.parseJsr305(MessageCollector.NONE) + val jsr305State = Jsr305Parser(MessageCollector.NONE).parse(compilerArguments.jsr305) map.put(AnalysisFlag.jsr305, jsr305State) } return map