Add enable / disable feature in JPS

#KT-26775 Fixed
#KT-26774 Fixed
This commit is contained in:
Mikhail Glukhikh
2018-09-18 20:09:49 +03:00
parent 8a7ff4cd24
commit f6b805a973
7 changed files with 40 additions and 33 deletions
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.cli.common.arguments
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
object CliArgumentStringBuilder { object CliArgumentStringBuilder {
const val languagePrefix = "-XXLanguage:" private const val languagePrefix = "-XXLanguage:"
private val LanguageFeature.State.sign: String private val LanguageFeature.State.sign: String
get() = when (this) { get() = when (this) {
@@ -21,4 +21,30 @@ object CliArgumentStringBuilder {
fun LanguageFeature.buildArgumentString(state: LanguageFeature.State): String { fun LanguageFeature.buildArgumentString(state: LanguageFeature.State): String {
return "$languagePrefix${state.sign}$name" return "$languagePrefix${state.sign}$name"
} }
fun String.replaceLanguageFeature(
feature: LanguageFeature,
state: LanguageFeature.State,
prefix: String = "",
postfix: String = "",
separator: String = ", ",
quoted: Boolean = true
): String {
val existingFeatureIndex = indexOf(feature.name)
val languagePrefixIndex = lastIndexOf(languagePrefix, existingFeatureIndex)
val featureArgumentString = feature.buildArgumentString(state)
val quote = if (quoted) "\"" else ""
return if (languagePrefixIndex != -1) {
replaceRange(languagePrefixIndex, existingFeatureIndex + feature.name.length, featureArgumentString)
} else {
val splitText = if (postfix.isNotEmpty()) split(postfix) else listOf(this, "")
if (splitText.size != 2) {
"$prefix$quote$featureArgumentString$quote$postfix"
} else {
val (mainPart, commentPart) = splitText
// In Groovy / Kotlin DSL, we can have comment after [...] or listOf(...)
mainPart + "$separator$quote$featureArgumentString$quote$postfix" + commentPart
}
}
}
} }
@@ -22,7 +22,7 @@ import com.intellij.openapi.util.text.StringUtil
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.codeStyle.CodeStyleManager import com.intellij.psi.codeStyle.CodeStyleManager
import org.jetbrains.kotlin.cli.common.arguments.CliArgumentStringBuilder.buildArgumentString import org.jetbrains.kotlin.cli.common.arguments.CliArgumentStringBuilder.buildArgumentString
import org.jetbrains.kotlin.cli.common.arguments.CliArgumentStringBuilder.languagePrefix import org.jetbrains.kotlin.cli.common.arguments.CliArgumentStringBuilder.replaceLanguageFeature
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.idea.configuration.KotlinWithGradleConfigurator.Companion.getBuildScriptSettingsPsiFile import org.jetbrains.kotlin.idea.configuration.KotlinWithGradleConfigurator.Companion.getBuildScriptSettingsPsiFile
import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.application.runReadAction
@@ -166,19 +166,8 @@ class GroovyBuildScriptManipulator(
"[\"$featureArgumentString\"]", "[\"$featureArgumentString\"]",
forTests forTests
) { insideKotlinOptions -> ) { insideKotlinOptions ->
val existingFeatureIndex = text.indexOf(feature.name) val prefix = if (insideKotlinOptions) "kotlinOptions." else ""
val languagePrefixIndex = text.lastIndexOf(languagePrefix, existingFeatureIndex) val newText = text.replaceLanguageFeature(feature, state, prefix = "$prefix$parameterName = [", postfix = "]")
val newText = if (languagePrefixIndex != -1) {
text.substring(0, languagePrefixIndex) + featureArgumentString + text.substring(existingFeatureIndex + feature.name.length)
} else {
val splitText = text.split("]")
if (splitText.size != 2) {
val prefix = if (insideKotlinOptions) "kotlinOptions." else ""
"$prefix$parameterName = [\"$featureArgumentString\"]"
} else {
splitText[0] + ", \"$featureArgumentString\"]" + splitText[1]
}
}
replaceWithStatementFromText(newText) replaceWithStatementFromText(newText)
} }
} }
@@ -22,7 +22,7 @@ import com.intellij.openapi.util.text.StringUtil
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.cli.common.arguments.CliArgumentStringBuilder.buildArgumentString import org.jetbrains.kotlin.cli.common.arguments.CliArgumentStringBuilder.buildArgumentString
import org.jetbrains.kotlin.cli.common.arguments.CliArgumentStringBuilder.languagePrefix import org.jetbrains.kotlin.cli.common.arguments.CliArgumentStringBuilder.replaceLanguageFeature
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.idea.configuration.KotlinWithGradleConfigurator.Companion.getBuildScriptSettingsPsiFile import org.jetbrains.kotlin.idea.configuration.KotlinWithGradleConfigurator.Companion.getBuildScriptSettingsPsiFile
import org.jetbrains.kotlin.idea.inspections.gradle.GradleHeuristicHelper.PRODUCTION_DEPENDENCY_STATEMENTS import org.jetbrains.kotlin.idea.inspections.gradle.GradleHeuristicHelper.PRODUCTION_DEPENDENCY_STATEMENTS
@@ -320,18 +320,7 @@ class KotlinBuildScriptManipulator(
"listOf(\"$featureArgumentString\")", "listOf(\"$featureArgumentString\")",
forTests forTests
) { ) {
val existingFeatureIndex = text.indexOf(feature.name) val newText = text.replaceLanguageFeature(feature, state, prefix = "$parameterName = listOf(", postfix = ")")
val languagePrefixIndex = text.lastIndexOf(languagePrefix, existingFeatureIndex)
val newText = if (languagePrefixIndex != -1) {
text.substring(0, languagePrefixIndex) + featureArgumentString + text.substring(existingFeatureIndex + feature.name.length)
} else {
val splitText = text.split(")")
if (splitText.size != 2) {
"$parameterName = listOf(\"$featureArgumentString\")"
} else {
splitText[0] + ", \"$featureArgumentString\")" + splitText[1]
}
}
replace(psiFactory.createExpression(newText)) replace(psiFactory.createExpression(newText))
} }
} }
@@ -18,6 +18,7 @@ import com.intellij.openapi.vfs.VfsUtil
import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.VfsUtilCore
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.annotations.Contract import org.jetbrains.annotations.Contract
import org.jetbrains.kotlin.cli.common.arguments.CliArgumentStringBuilder.replaceLanguageFeature
import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.idea.facet.getRuntimeLibraryVersion import org.jetbrains.kotlin.idea.facet.getRuntimeLibraryVersion
import org.jetbrains.kotlin.idea.facet.toApiVersion import org.jetbrains.kotlin.idea.facet.toApiVersion
@@ -362,10 +363,10 @@ abstract class KotlinWithLibraryConfigurator protected constructor() : KotlinPro
val facetSettings = KotlinFacetSettingsProvider.getInstance(module.project).getInitializedSettings(module) val facetSettings = KotlinFacetSettingsProvider.getInstance(module.project).getInitializedSettings(module)
ModuleRootModificationUtil.updateModel(module) { ModuleRootModificationUtil.updateModel(module) {
facetSettings.apiLevel = LanguageVersion.KOTLIN_1_3 facetSettings.apiLevel = feature.sinceVersion
facetSettings.languageLevel = LanguageVersion.KOTLIN_1_3 facetSettings.languageLevel = feature.sinceVersion
facetSettings.compilerSettings?.apply { facetSettings.compilerSettings?.apply {
// TODO: JPS, module additionalArguments = additionalArguments.replaceLanguageFeature(feature, state, separator = " ", quoted = false)
} }
} }
} }
@@ -11,6 +11,7 @@ import com.intellij.openapi.module.ModuleUtilCore
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.cli.common.arguments.CliArgumentStringBuilder.replaceLanguageFeature
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCompilerSettings import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCompilerSettings
@@ -55,7 +56,7 @@ sealed class ChangeGeneralLanguageFeatureSupportFix(
if (!checkUpdateRuntime(project, feature.sinceApiVersion)) return if (!checkUpdateRuntime(project, feature.sinceApiVersion)) return
} }
KotlinCompilerSettings.getInstance(project).update { KotlinCompilerSettings.getInstance(project).update {
// TODO: JPS, project additionalArguments = additionalArguments.replaceLanguageFeature(feature, featureSupport, separator = " ", quoted = false)
} }
project.invalidateProjectRoots() project.invalidateProjectRoots()
} }
@@ -19,6 +19,6 @@ dependencies {
} }
compileKotlin { compileKotlin {
kotlinOptions { kotlinOptions {
freeCompilerArgs = ["-XXLanguage:+SamConversionForKotlinFunctions"] freeCompilerArgs = ["-XXLanguage:+SamConversionForKotlinFunctions"] // Free compiler arguments
} }
} }
@@ -20,5 +20,6 @@ dependencies {
compileKotlin { compileKotlin {
kotlinOptions { kotlinOptions {
freeCompilerArgs = ["-XXLanguage:+SamConversionForKotlinFunctions", "-XXLanguage:+InlineClasses"] freeCompilerArgs = ["-XXLanguage:+SamConversionForKotlinFunctions", "-XXLanguage:+InlineClasses"]
// Free compiler arguments
} }
} }