diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinBuildScriptManipulator.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinBuildScriptManipulator.kt index ee2286a162f..7027d1bd3e7 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinBuildScriptManipulator.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinBuildScriptManipulator.kt @@ -114,7 +114,7 @@ class KotlinBuildScriptManipulator( state: LanguageFeature.State, forTests: Boolean ): PsiElement? = - scriptFile.changeLanguageFeatureConfiguration(feature, state) + scriptFile.changeLanguageFeatureConfiguration(feature, state, forTests) override fun changeLanguageVersion(version: String, forTests: Boolean): PsiElement? = scriptFile.changeKotlinTaskParameter("languageVersion", version, forTests) @@ -308,29 +308,63 @@ class KotlinBuildScriptManipulator( private fun KtFile.changeLanguageFeatureConfiguration( feature: LanguageFeature, - state: LanguageFeature.State + state: LanguageFeature.State, + forTests: Boolean ): PsiElement? { - // TODO: Kotlin DSL - return null + val sign = when (state) { + LanguageFeature.State.ENABLED -> "+" + LanguageFeature.State.DISABLED -> "-" + LanguageFeature.State.ENABLED_WITH_WARNING -> "+" // not supported normally + LanguageFeature.State.ENABLED_WITH_ERROR -> "-" // not supported normally + } + val languagePrefix = "-XXLanguage:" + val featureArgumentString = "$languagePrefix$sign${feature.name}" + val parameterName = "freeCompilerArgs" + return addOrReplaceKotlinTaskParameter( + parameterName, + "listOf(\"$featureArgumentString\")", + forTests + ) { + val existingFeatureIndex = text.indexOf(feature.name) + 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)) + } } - private fun KtFile.changeKotlinTaskParameter(parameterName: String, parameterValue: String, forTests: Boolean): PsiElement? { - val snippet = "$parameterName = \"$parameterValue\"" + private fun KtFile.addOrReplaceKotlinTaskParameter( + parameterName: String, + defaultValue: String, + forTests: Boolean, + replaceIt: KtExpression.() -> PsiElement + ): PsiElement? { val taskName = if (forTests) "compileTestKotlin" else "compileKotlin" val optionsBlock = findScriptInitializer("$taskName.kotlinOptions")?.getBlock() return if (optionsBlock != null) { val assignment = optionsBlock.statements.find { (it as? KtBinaryExpression)?.left?.text == parameterName } - if (assignment != null) { - assignment.replace(psiFactory.createExpression(snippet)) - } else { - optionsBlock.addExpressionIfMissing(snippet) - } + assignment?.replaceIt() ?: optionsBlock.addExpressionIfMissing("$parameterName = $defaultValue") } else { addImportIfMissing("org.jetbrains.kotlin.gradle.tasks.KotlinCompile") script?.blockExpression?.addDeclarationIfMissing("val $taskName: KotlinCompile by tasks") - addTopLevelBlock("$taskName.kotlinOptions")?.addExpressionIfMissing(snippet) + addTopLevelBlock("$taskName.kotlinOptions")?.addExpressionIfMissing("$parameterName = $defaultValue") + } + + } + + private fun KtFile.changeKotlinTaskParameter(parameterName: String, parameterValue: String, forTests: Boolean): PsiElement? { + return addOrReplaceKotlinTaskParameter(parameterName, "\"$parameterValue\"", forTests) { + replace(psiFactory.createExpression("$parameterName = \"$parameterValue\"")) } } diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleConfiguratorTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleConfiguratorTest.kt index ce0eb89e6f0..e964b6cb918 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleConfiguratorTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleConfiguratorTest.kt @@ -611,6 +611,51 @@ class GradleConfiguratorTest : GradleImportingTestCase() { } } + @Test + fun testChangeFeatureSupportGSK() { + val files = importProjectFromTestData() + + runInEdtAndWait { + myTestFixture.project.executeWriteCommand("") { + KotlinWithGradleConfigurator.changeFeatureConfiguration( + myTestFixture.module, LanguageFeature.InlineClasses, LanguageFeature.State.DISABLED, false + ) + } + + checkFiles(files) + } + } + + @Test + fun testDisableFeatureSupportGSK() { + val files = importProjectFromTestData() + + runInEdtAndWait { + myTestFixture.project.executeWriteCommand("") { + KotlinWithGradleConfigurator.changeFeatureConfiguration( + myTestFixture.module, LanguageFeature.InlineClasses, LanguageFeature.State.DISABLED, false + ) + } + + checkFiles(files) + } + } + + @Test + fun testEnableFeatureSupportGSK() { + val files = importProjectFromTestData() + + runInEdtAndWait { + myTestFixture.project.executeWriteCommand("") { + KotlinWithGradleConfigurator.changeFeatureConfiguration( + myTestFixture.module, LanguageFeature.InlineClasses, LanguageFeature.State.ENABLED, false + ) + } + + checkFiles(files) + } + } + private fun importProjectFromTestData(): List { val files = configureByFiles() importProject() diff --git a/idea/testData/gradle/configurator/changeFeatureSupportGSK/build.gradle.kts b/idea/testData/gradle/configurator/changeFeatureSupportGSK/build.gradle.kts new file mode 100644 index 00000000000..3d66c914888 --- /dev/null +++ b/idea/testData/gradle/configurator/changeFeatureSupportGSK/build.gradle.kts @@ -0,0 +1,9 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + kotlin("jvm") version "1.2.70" +} +val compileKotlin: KotlinCompile by tasks +compileKotlin.kotlinOptions { + freeCompilerArgs = listOf("-XXLanguage:+InlineClasses") +} \ No newline at end of file diff --git a/idea/testData/gradle/configurator/changeFeatureSupportGSK/build.gradle.kts.after b/idea/testData/gradle/configurator/changeFeatureSupportGSK/build.gradle.kts.after new file mode 100644 index 00000000000..2d21b91a33a --- /dev/null +++ b/idea/testData/gradle/configurator/changeFeatureSupportGSK/build.gradle.kts.after @@ -0,0 +1,9 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + kotlin("jvm") version "1.2.70" +} +val compileKotlin: KotlinCompile by tasks +compileKotlin.kotlinOptions { + freeCompilerArgs = listOf("-XXLanguage:-InlineClasses") +} \ No newline at end of file diff --git a/idea/testData/gradle/configurator/disableFeatureSupportGSK/build.gradle.kts b/idea/testData/gradle/configurator/disableFeatureSupportGSK/build.gradle.kts new file mode 100644 index 00000000000..8d96baf8ecc --- /dev/null +++ b/idea/testData/gradle/configurator/disableFeatureSupportGSK/build.gradle.kts @@ -0,0 +1,4 @@ +plugins { + kotlin("jvm") version "1.2.70" +} + diff --git a/idea/testData/gradle/configurator/disableFeatureSupportGSK/build.gradle.kts.after b/idea/testData/gradle/configurator/disableFeatureSupportGSK/build.gradle.kts.after new file mode 100644 index 00000000000..048437f64a1 --- /dev/null +++ b/idea/testData/gradle/configurator/disableFeatureSupportGSK/build.gradle.kts.after @@ -0,0 +1,10 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + kotlin("jvm") version "1.2.70" +} + +val compileKotlin: KotlinCompile by tasks +compileKotlin.kotlinOptions { + freeCompilerArgs = listOf("-XXLanguage:-InlineClasses") +} \ No newline at end of file diff --git a/idea/testData/gradle/configurator/enableFeatureSupportGSK/build.gradle.kts b/idea/testData/gradle/configurator/enableFeatureSupportGSK/build.gradle.kts new file mode 100644 index 00000000000..1b23cb629cc --- /dev/null +++ b/idea/testData/gradle/configurator/enableFeatureSupportGSK/build.gradle.kts @@ -0,0 +1,3 @@ +plugins { + kotlin("jvm") version "1.2.70" +} diff --git a/idea/testData/gradle/configurator/enableFeatureSupportGSK/build.gradle.kts.after b/idea/testData/gradle/configurator/enableFeatureSupportGSK/build.gradle.kts.after new file mode 100644 index 00000000000..3d66c914888 --- /dev/null +++ b/idea/testData/gradle/configurator/enableFeatureSupportGSK/build.gradle.kts.after @@ -0,0 +1,9 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + kotlin("jvm") version "1.2.70" +} +val compileKotlin: KotlinCompile by tasks +compileKotlin.kotlinOptions { + freeCompilerArgs = listOf("-XXLanguage:+InlineClasses") +} \ No newline at end of file