Move -Xjsr-305 argument parsing out of K2JVMCompilerArguments
To simplify K2JVMCompilerArguments, which is mostly a data holder
This commit is contained in:
@@ -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<String>?): Jsr305State {
|
||||||
|
var global: ReportLevel? = null
|
||||||
|
var migration: ReportLevel? = null
|
||||||
|
val userDefined = mutableMapOf<String, ReportLevel>()
|
||||||
|
|
||||||
|
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<String, ReportLevel>? {
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-75
@@ -202,81 +202,7 @@ class K2JVMCompilerArguments : CommonCompilerArguments() {
|
|||||||
|
|
||||||
override fun configureAnalysisFlags(collector: MessageCollector): MutableMap<AnalysisFlag<*>, Any> {
|
override fun configureAnalysisFlags(collector: MessageCollector): MutableMap<AnalysisFlag<*>, Any> {
|
||||||
val result = super.configureAnalysisFlags(collector)
|
val result = super.configureAnalysisFlags(collector)
|
||||||
result[AnalysisFlag.jsr305] = parseJsr305(collector)
|
result[AnalysisFlag.jsr305] = Jsr305Parser(collector).parse(jsr305)
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
fun parseJsr305(collector: MessageCollector): Jsr305State {
|
|
||||||
var global: ReportLevel? = null
|
|
||||||
var migration: ReportLevel? = null
|
|
||||||
val userDefined = mutableMapOf<String, ReportLevel>()
|
|
||||||
|
|
||||||
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<String, ReportLevel>? {
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-3
@@ -20,15 +20,18 @@ import com.intellij.openapi.module.ModuleManager
|
|||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import org.jetbrains.kotlin.analyzer.LanguageSettingsProvider
|
import org.jetbrains.kotlin.analyzer.LanguageSettingsProvider
|
||||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
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.arguments.K2JVMCompilerArguments
|
||||||
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
|
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.LibraryInfo
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.ModuleSourceInfo
|
import org.jetbrains.kotlin.idea.caches.resolve.ModuleSourceInfo
|
||||||
import org.jetbrains.kotlin.idea.project.getLanguageVersionSettings
|
import org.jetbrains.kotlin.idea.project.getLanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.idea.project.languageVersionSettings
|
import org.jetbrains.kotlin.idea.project.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.idea.project.targetPlatform
|
import org.jetbrains.kotlin.idea.project.targetPlatform
|
||||||
import org.jetbrains.kotlin.utils.Jsr305State
|
|
||||||
|
|
||||||
object IDELanguageSettingsProvider : LanguageSettingsProvider {
|
object IDELanguageSettingsProvider : LanguageSettingsProvider {
|
||||||
override fun getLanguageVersionSettings(moduleInfo: ModuleInfo, project: Project): LanguageVersionSettings =
|
override fun getLanguageVersionSettings(moduleInfo: ModuleInfo, project: Project): LanguageVersionSettings =
|
||||||
@@ -44,7 +47,7 @@ object IDELanguageSettingsProvider : LanguageSettingsProvider {
|
|||||||
val settings = KotlinFacetSettingsProvider.getInstance(project).getSettings(module) ?: continue
|
val settings = KotlinFacetSettingsProvider.getInstance(project).getSettings(module) ?: continue
|
||||||
val compilerArguments = settings.mergedCompilerArguments as? K2JVMCompilerArguments ?: 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)
|
map.put(AnalysisFlag.jsr305, jsr305State)
|
||||||
}
|
}
|
||||||
return map
|
return map
|
||||||
|
|||||||
Reference in New Issue
Block a user