GradleBuildScript: throw exception when trying to change level of language features to disable in multiplatform & fix tests

This commit is contained in:
Dmitry Gridin
2019-07-17 12:27:11 +03:00
parent 0d49ffa831
commit 7d173ed385
8 changed files with 14 additions and 108 deletions
@@ -92,6 +92,16 @@ fun GradleBuildScriptManipulator<*>.useNewSyntax(kotlinPluginName: String, gradl
return !hasOldApply return !hasOldApply
} }
fun GradleBuildScriptManipulator<*>.usesNewMultiplatform(): Boolean {
val fileText = runReadAction { scriptFile.text }
return fileText.contains("multiplatform")
}
fun LanguageFeature.State.assertApplicableInMultiplatform() {
if (this == LanguageFeature.State.ENABLED_WITH_ERROR || this == LanguageFeature.State.DISABLED)
throw UnsupportedOperationException("Disabling the language feature is unsupported for multiplatform")
}
private val MIN_GRADLE_VERSION_FOR_API_AND_IMPLEMENTATION = GradleVersion.version("3.4") private val MIN_GRADLE_VERSION_FOR_API_AND_IMPLEMENTATION = GradleVersion.version("3.4")
fun GradleVersion.scope(directive: String): String { fun GradleVersion.scope(directive: String): String {
@@ -14,7 +14,6 @@ import org.gradle.util.GradleVersion
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.replaceLanguageFeature 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.GroovyBuildScriptManipulator.Companion.getBlockOrCreate
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
import org.jetbrains.kotlin.idea.util.module import org.jetbrains.kotlin.idea.util.module
@@ -156,6 +155,7 @@ class GroovyBuildScriptManipulator(
forTests: Boolean forTests: Boolean
): PsiElement? { ): PsiElement? {
if (usesNewMultiplatform()) { if (usesNewMultiplatform()) {
state.assertApplicableInMultiplatform()
val kotlinBlock = scriptFile.getBlockOrCreate("kotlin") val kotlinBlock = scriptFile.getBlockOrCreate("kotlin")
val sourceSetsBlock = kotlinBlock.getBlockOrCreate("sourceSets") val sourceSetsBlock = kotlinBlock.getBlockOrCreate("sourceSets")
val allBlock = sourceSetsBlock.getBlockOrCreate("all") val allBlock = sourceSetsBlock.getBlockOrCreate("all")
@@ -251,11 +251,6 @@ class GroovyBuildScriptManipulator(
) )
} }
private fun usesNewMultiplatform(): Boolean {
val fileText = runReadAction { scriptFile.text }
return fileText.contains("multiplatform")
}
private fun GrClosableBlock.addParameterAssignment( private fun GrClosableBlock.addParameterAssignment(
parameterName: String, parameterName: String,
defaultValue: String, defaultValue: String,
@@ -299,17 +299,13 @@ class KotlinBuildScriptManipulator(
} }
} }
private fun usesNewMultiplatform(): Boolean {
val fileText = runReadAction { scriptFile.text }
return fileText.contains("multiplatform")
}
private fun KtFile.changeLanguageFeatureConfiguration( private fun KtFile.changeLanguageFeatureConfiguration(
feature: LanguageFeature, feature: LanguageFeature,
state: LanguageFeature.State, state: LanguageFeature.State,
forTests: Boolean forTests: Boolean
): PsiElement? { ): PsiElement? {
if (usesNewMultiplatform()) { if (usesNewMultiplatform()) {
state.assertApplicableInMultiplatform()
return findOrCreateScriptInitializer("kotlin") return findOrCreateScriptInitializer("kotlin")
?.findOrCreateBlock("sourceSets") ?.findOrCreateBlock("sourceSets")
?.findOrCreateBlock("all") ?.findOrCreateBlock("all")
@@ -13,22 +13,6 @@ import org.jetbrains.plugins.gradle.tooling.annotation.TargetVersions
import org.junit.Test import org.junit.Test
class GradleConfiguratorPlatformSpecificTest : GradleImportingTestCase() { 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+") @TargetVersions("4.7+")
@Test @Test
fun testEnableFeatureSupportMultiplatform() { fun testEnableFeatureSupportMultiplatform() {
@@ -1,31 +0,0 @@
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.0-rc-190"
}
}
apply plugin: "kotlin-multiplatform"
repositories {
jcenter()
mavenCentral()
}
kotlin {
targets {
fromPreset(presets.jvm, 'jvm')
}
sourceSets {
commonMain {
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib-common'
}
}
jvmMain {
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib'
}
}
}
}
@@ -1,34 +0,0 @@
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.0-rc-190"
}
}
apply plugin: "kotlin-multiplatform"
repositories {
jcenter()
mavenCentral()
}
kotlin {
targets {
fromPreset(presets.jvm, 'jvm')
}
sourceSets {
commonMain {
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib-common'
}
}
jvmMain {
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib'
}
}
all {
languageSettings.enableLanguageFeature("InlineClasses")
}
}
}
@@ -14,7 +14,6 @@ import com.intellij.openapi.roots.ui.configuration.libraryEditor.NewLibraryEdito
import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.vfs.JarFileSystem import com.intellij.openapi.vfs.JarFileSystem
import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.LocalFileSystem
import com.intellij.testFramework.exceptionCases.AbstractExceptionCase
import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments.Companion.DEFAULT import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments.Companion.DEFAULT
import org.jetbrains.kotlin.config.CompilerSettings.Companion.DEFAULT_ADDITIONAL_ARGUMENTS import org.jetbrains.kotlin.config.CompilerSettings.Companion.DEFAULT_ADDITIONAL_ARGUMENTS
@@ -45,13 +44,7 @@ class UpdateConfigurationQuickFixTest : LightPlatformCodeInsightFixtureTestCase(
myFixture.configureByText("foo.kt", "inline class My(val n: Int)") myFixture.configureByText("foo.kt", "inline class My(val n: Int)")
assertEquals(LanguageFeature.State.ENABLED_WITH_WARNING, inlineClassesSupport) assertEquals(LanguageFeature.State.ENABLED_WITH_WARNING, inlineClassesSupport)
assertException(object : AbstractExceptionCase<AssertionError>() { assertTrue(myFixture.availableIntentions.none { it.text == "Disable inline classes support in the project" })
override fun getExpectedExceptionClass(): Class<AssertionError> = AssertionError::class.java
override fun tryClosure() {
myFixture.findSingleIntention("Disable inline classes support in the project")
}
})
} }
fun testEnableInlineClasses() { fun testEnableInlineClasses() {
@@ -14,7 +14,6 @@ import com.intellij.openapi.roots.ui.configuration.libraryEditor.NewLibraryEdito
import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtil
import com.intellij.openapi.vfs.JarFileSystem import com.intellij.openapi.vfs.JarFileSystem
import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.LocalFileSystem
import com.intellij.testFramework.exceptionCases.AbstractExceptionCase
import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments.Companion.DEFAULT import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments.Companion.DEFAULT
import org.jetbrains.kotlin.config.CompilerSettings.Companion.DEFAULT_ADDITIONAL_ARGUMENTS import org.jetbrains.kotlin.config.CompilerSettings.Companion.DEFAULT_ADDITIONAL_ARGUMENTS
@@ -42,13 +41,7 @@ class UpdateConfigurationQuickFixTest : LightPlatformCodeInsightFixtureTestCase(
myFixture.configureByText("foo.kt", "inline class My(val n: Int)") myFixture.configureByText("foo.kt", "inline class My(val n: Int)")
assertEquals(LanguageFeature.State.ENABLED_WITH_WARNING, inlineClassesSupport) assertEquals(LanguageFeature.State.ENABLED_WITH_WARNING, inlineClassesSupport)
assertException(object : AbstractExceptionCase<AssertionError>() { assertTrue(myFixture.availableIntentions.none { it.text == "Disable inline classes support in the project" })
override fun getExpectedExceptionClass(): Class<AssertionError> = AssertionError::class.java
override fun tryClosure() {
myFixture.findSingleIntention("Disable inline classes support in the project")
}
})
} }
fun testEnableInlineClasses() { fun testEnableInlineClasses() {