From cb432acfb7624c0a4cada3a2a047dd251024648d Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Mon, 15 Jul 2019 18:34:43 +0300 Subject: [PATCH] BuildScriptManipulator: implement new syntax for enable experimental features in MPP #KT-28295 Fixed --- .../GroovyBuildScriptManipulator.kt | 26 +++++++------- .../KotlinBuildScriptManipulator.kt | 27 +++++++------- .../GradleConfiguratorPlatformSpecificTest.kt | 36 +++++++++++++++++-- .../gradle/GradleConfiguratorTest.kt | 18 +--------- .../ChangeGeneralLanguageFeatureSupportFix.kt | 2 +- .../build.gradle.after | 8 ++--- .../build.gradle.after | 8 ++--- .../build.gradle | 6 ++-- .../build.gradle.after | 14 ++++---- .../build.gradle.kts | 16 +++++++++ .../build.gradle.kts.after | 19 ++++++++++ .../build.gradle | 11 ++---- .../build.gradle.after | 12 +++---- 13 files changed, 120 insertions(+), 83 deletions(-) rename idea/testData/gradle/configurator/{enableFeatureSupportMultiplatformWithDots => enableFeatureSupportMultiplatform2}/build.gradle (86%) rename idea/testData/gradle/configurator/{enableFeatureSupportMultiplatformWithDots => enableFeatureSupportMultiplatform2}/build.gradle.after (65%) create mode 100644 idea/testData/gradle/configurator/enableFeatureSupportMultiplatformKts/build.gradle.kts create mode 100644 idea/testData/gradle/configurator/enableFeatureSupportMultiplatformKts/build.gradle.kts.after diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/GroovyBuildScriptManipulator.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/GroovyBuildScriptManipulator.kt index c8d57cf2d7f..9813f20656c 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/GroovyBuildScriptManipulator.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/GroovyBuildScriptManipulator.kt @@ -1,17 +1,6 @@ /* - * 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. + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ package org.jetbrains.kotlin.idea.configuration @@ -25,6 +14,7 @@ import org.gradle.util.GradleVersion import org.jetbrains.kotlin.cli.common.arguments.CliArgumentStringBuilder.buildArgumentString import org.jetbrains.kotlin.cli.common.arguments.CliArgumentStringBuilder.replaceLanguageFeature import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.idea.configuration.GroovyBuildScriptManipulator.Companion.getBlockOrCreate import org.jetbrains.kotlin.idea.configuration.KotlinWithGradleConfigurator.Companion.getBuildScriptSettingsPsiFile import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.module @@ -165,6 +155,14 @@ class GroovyBuildScriptManipulator( state: LanguageFeature.State, forTests: Boolean ): PsiElement? { + if (usesNewMultiplatform()) { + val kotlinBlock = scriptFile.getBlockOrCreate("kotlin") + val sourceSetsBlock = kotlinBlock.getBlockOrCreate("sourceSets") + val allBlock = sourceSetsBlock.getBlockOrCreate("all") + allBlock.addLastExpressionInBlockIfNeeded("languageSettings.enableLanguageFeature(\"${feature.name}\")") + return allBlock.statements.lastOrNull() + } + val featureArgumentString = feature.buildArgumentString(state) val parameterName = "freeCompilerArgs" return addOrReplaceKotlinTaskParameter( @@ -255,7 +253,7 @@ class GroovyBuildScriptManipulator( private fun usesNewMultiplatform(): Boolean { val fileText = runReadAction { scriptFile.text } - return fileText.contains("kotlin-multiplatform") + return fileText.contains("multiplatform") } private fun GrClosableBlock.addParameterAssignment( 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 74acb57332a..fd553fbd28f 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 @@ -1,17 +1,6 @@ /* - * 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. + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ package org.jetbrains.kotlin.idea.configuration @@ -310,11 +299,23 @@ class KotlinBuildScriptManipulator( } } + private fun usesNewMultiplatform(): Boolean { + val fileText = runReadAction { scriptFile.text } + return fileText.contains("multiplatform") + } + private fun KtFile.changeLanguageFeatureConfiguration( feature: LanguageFeature, state: LanguageFeature.State, forTests: Boolean ): PsiElement? { + if (usesNewMultiplatform()) { + return findOrCreateScriptInitializer("kotlin") + ?.findOrCreateBlock("sourceSets") + ?.findOrCreateBlock("all") + ?.addExpressionIfMissing("languageSettings.enableLanguageFeature(\"${feature.name}\")") + } + val featureArgumentString = feature.buildArgumentString(state) val parameterName = "freeCompilerArgs" return addOrReplaceKotlinTaskParameter( diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleConfiguratorPlatformSpecificTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleConfiguratorPlatformSpecificTest.kt index f3dd19321e7..02f53f55279 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleConfiguratorPlatformSpecificTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/idea/codeInsight/gradle/GradleConfiguratorPlatformSpecificTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -13,6 +13,22 @@ import org.jetbrains.plugins.gradle.tooling.annotation.TargetVersions import org.junit.Test class GradleConfiguratorPlatformSpecificTest : GradleImportingTestCase() { + @TargetVersions("4.7+") + @Test + fun testDisableFeatureSupportMultiplatform() { + val files = importProjectFromTestData() + // now it's impossible to disable feature in multiplatform + runInEdtAndWait { + myTestFixture.project.executeWriteCommand("") { + KotlinWithGradleConfigurator.changeFeatureConfiguration( + myTestFixture.module, LanguageFeature.InlineClasses, LanguageFeature.State.DISABLED, false + ) + } + + checkFiles(files) + } + } + @TargetVersions("4.7+") @Test fun testEnableFeatureSupportMultiplatform() { @@ -31,7 +47,7 @@ class GradleConfiguratorPlatformSpecificTest : GradleImportingTestCase() { @TargetVersions("4.7+") @Test - fun testEnableFeatureSupportMultiplatformWithDots() { + fun testEnableFeatureSupportMultiplatform2() { val files = importProjectFromTestData() runInEdtAndWait { @@ -61,6 +77,22 @@ class GradleConfiguratorPlatformSpecificTest : GradleImportingTestCase() { } } + @TargetVersions("4.7+") + @Test + fun testEnableFeatureSupportMultiplatformKts() { + val files = importProjectFromTestData() + + runInEdtAndWait { + myTestFixture.project.executeWriteCommand("") { + KotlinWithGradleConfigurator.changeFeatureConfiguration( + myTestFixture.module, LanguageFeature.InlineClasses, LanguageFeature.State.ENABLED, false + ) + } + + checkFiles(files) + } + } + override fun testDataDirName(): String { return "configurator" } 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 cdbdb3a75dd..d2e0f8c00ff 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 @@ -1,5 +1,5 @@ /* - * Copyright 2000-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2000-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -584,22 +584,6 @@ class GradleConfiguratorTest : GradleImportingTestCase() { } } - @TargetVersions("4.7+") - @Test - fun testDisableFeatureSupportMultiplatform() { - val files = importProjectFromTestData() - - runInEdtAndWait { - myTestFixture.project.executeWriteCommand("") { - KotlinWithGradleConfigurator.changeFeatureConfiguration( - myTestFixture.module, LanguageFeature.InlineClasses, LanguageFeature.State.DISABLED, false - ) - } - - checkFiles(files) - } - } - @Test fun testEnableFeatureSupport() { val files = importProjectFromTestData() diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/quickfix/ChangeGeneralLanguageFeatureSupportFix.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/quickfix/ChangeGeneralLanguageFeatureSupportFix.kt index d099c011410..eea69a95840 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/quickfix/ChangeGeneralLanguageFeatureSupportFix.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/quickfix/ChangeGeneralLanguageFeatureSupportFix.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ diff --git a/idea/testData/gradle/configurator/disableFeatureSupportMultiplatform/build.gradle.after b/idea/testData/gradle/configurator/disableFeatureSupportMultiplatform/build.gradle.after index 7ef39f1c443..e53450d7db9 100644 --- a/idea/testData/gradle/configurator/disableFeatureSupportMultiplatform/build.gradle.after +++ b/idea/testData/gradle/configurator/disableFeatureSupportMultiplatform/build.gradle.after @@ -15,11 +15,6 @@ repositories { kotlin { targets { fromPreset(presets.jvm, 'jvm') - configure([jvm]) { - tasks.getByName(compilations.main.compileKotlinTaskName).kotlinOptions { - freeCompilerArgs = ["-XXLanguage:-InlineClasses"] - } - } } sourceSets { commonMain { @@ -32,5 +27,8 @@ kotlin { implementation 'org.jetbrains.kotlin:kotlin-stdlib' } } + all { + languageSettings.enableLanguageFeature("InlineClasses") + } } } diff --git a/idea/testData/gradle/configurator/enableFeatureSupportMultiplatform/build.gradle.after b/idea/testData/gradle/configurator/enableFeatureSupportMultiplatform/build.gradle.after index 4350b62943a..e53450d7db9 100644 --- a/idea/testData/gradle/configurator/enableFeatureSupportMultiplatform/build.gradle.after +++ b/idea/testData/gradle/configurator/enableFeatureSupportMultiplatform/build.gradle.after @@ -15,11 +15,6 @@ repositories { kotlin { targets { fromPreset(presets.jvm, 'jvm') - configure([jvm]) { - tasks.getByName(compilations.main.compileKotlinTaskName).kotlinOptions { - freeCompilerArgs = ["-XXLanguage:+InlineClasses"] - } - } } sourceSets { commonMain { @@ -32,5 +27,8 @@ kotlin { implementation 'org.jetbrains.kotlin:kotlin-stdlib' } } + all { + languageSettings.enableLanguageFeature("InlineClasses") + } } } diff --git a/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformWithDots/build.gradle b/idea/testData/gradle/configurator/enableFeatureSupportMultiplatform2/build.gradle similarity index 86% rename from idea/testData/gradle/configurator/enableFeatureSupportMultiplatformWithDots/build.gradle rename to idea/testData/gradle/configurator/enableFeatureSupportMultiplatform2/build.gradle index 3c60ed007dc..23ddab6d4c5 100644 --- a/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformWithDots/build.gradle +++ b/idea/testData/gradle/configurator/enableFeatureSupportMultiplatform2/build.gradle @@ -7,13 +7,15 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.0-rc-190" } } -apply plugin: "kotlin-multiplatform" +plugins { + id 'org.jetbrains.kotlin.multiplatform' version '1.3.41' +} repositories { jcenter() mavenCentral() } kotlin { - targets.fromPreset(presets.jvm, 'jvm') + jvm() sourceSets { commonMain { dependencies { diff --git a/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformWithDots/build.gradle.after b/idea/testData/gradle/configurator/enableFeatureSupportMultiplatform2/build.gradle.after similarity index 65% rename from idea/testData/gradle/configurator/enableFeatureSupportMultiplatformWithDots/build.gradle.after rename to idea/testData/gradle/configurator/enableFeatureSupportMultiplatform2/build.gradle.after index 647c6ac247c..149e3116d64 100644 --- a/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformWithDots/build.gradle.after +++ b/idea/testData/gradle/configurator/enableFeatureSupportMultiplatform2/build.gradle.after @@ -7,13 +7,15 @@ buildscript { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.0-rc-190" } } -apply plugin: "kotlin-multiplatform" +plugins { + id 'org.jetbrains.kotlin.multiplatform' version '1.3.41' +} repositories { jcenter() mavenCentral() } kotlin { - targets.fromPreset(presets.jvm, 'jvm') + jvm() sourceSets { commonMain { dependencies { @@ -25,12 +27,8 @@ kotlin { implementation 'org.jetbrains.kotlin:kotlin-stdlib' } } - } - targets { - configure([jvm]) { - tasks.getByName(compilations.main.compileKotlinTaskName).kotlinOptions { - freeCompilerArgs = ["-XXLanguage:+InlineClasses"] - } + all { + languageSettings.enableLanguageFeature("InlineClasses") } } } diff --git a/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformKts/build.gradle.kts b/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformKts/build.gradle.kts new file mode 100644 index 00000000000..a27bdf60476 --- /dev/null +++ b/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformKts/build.gradle.kts @@ -0,0 +1,16 @@ +plugins { + kotlin("multiplatform") version "1.3.41" +} + +repositories { + mavenCentral() +} + +group = "com.example" +version = "0.0.1" + +kotlin { + sourceSets { + val commonMain by getting + } +} diff --git a/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformKts/build.gradle.kts.after b/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformKts/build.gradle.kts.after new file mode 100644 index 00000000000..73d02703a93 --- /dev/null +++ b/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformKts/build.gradle.kts.after @@ -0,0 +1,19 @@ +plugins { + kotlin("multiplatform") version "1.3.41" +} + +repositories { + mavenCentral() +} + +group = "com.example" +version = "0.0.1" + +kotlin { + sourceSets { + val commonMain by getting + all { + languageSettings.enableLanguageFeature("InlineClasses") + } + } +} diff --git a/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformToExistentArguments/build.gradle b/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformToExistentArguments/build.gradle index c06e5a5f4bd..87631adb8f1 100644 --- a/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformToExistentArguments/build.gradle +++ b/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformToExistentArguments/build.gradle @@ -13,14 +13,6 @@ repositories { mavenCentral() } kotlin { - targets { - fromPreset(presets.jvm, 'jvm') - configure([jvm]) { - tasks.getByName(compilations.main.compileKotlinTaskName).kotlinOptions { - freeCompilerArgs = ["-XXLanguage:+SamConversionForKotlinFunctions"] - } - } - } sourceSets { commonMain { dependencies { @@ -32,5 +24,8 @@ kotlin { implementation 'org.jetbrains.kotlin:kotlin-stdlib' } } + all { + languageSettings.enableLanguageFeature("SamConversionForKotlinFunctions") + } } } diff --git a/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformToExistentArguments/build.gradle.after b/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformToExistentArguments/build.gradle.after index 0599bc2c7f3..0b9da981c50 100644 --- a/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformToExistentArguments/build.gradle.after +++ b/idea/testData/gradle/configurator/enableFeatureSupportMultiplatformToExistentArguments/build.gradle.after @@ -13,14 +13,6 @@ repositories { mavenCentral() } kotlin { - targets { - fromPreset(presets.jvm, 'jvm') - configure([jvm]) { - tasks.getByName(compilations.main.compileKotlinTaskName).kotlinOptions { - freeCompilerArgs = ["-XXLanguage:+SamConversionForKotlinFunctions", "-XXLanguage:+InlineClasses"] - } - } - } sourceSets { commonMain { dependencies { @@ -32,5 +24,9 @@ kotlin { implementation 'org.jetbrains.kotlin:kotlin-stdlib' } } + all { + languageSettings.enableLanguageFeature("SamConversionForKotlinFunctions") + languageSettings.enableLanguageFeature("InlineClasses") + } } }