From ddbb4762111355b41bbe598136376a584d1ca588 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 27 Jan 2017 20:15:27 +0100 Subject: [PATCH] Add quickfix to increase language level by editing build.gradle --- .../KotlinWithGradleConfigurator.kt | 17 +++++++++ .../quickfix/EnableUnsupportedFeatureFix.kt | 20 ++++++++-- .../KotlinWithGradleConfiguratorTest.kt | 37 +++++++++++++++++++ 3 files changed, 71 insertions(+), 3 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.kt b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.kt index ad1f1fccdf6..4e55c7288f8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.kt +++ b/idea/src/org/jetbrains/kotlin/idea/configuration/KotlinWithGradleConfigurator.kt @@ -43,6 +43,7 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrStatement import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrApplicationStatement +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrAssignmentExpression import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrMethodCall import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrMethodCallExpression import org.jetbrains.plugins.groovy.lang.psi.api.util.GrStatementOwner @@ -273,6 +274,22 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator { return kotlinBlock.parent } + fun changeLanguageVersion(module: Module, languageVersion: String, forTests: Boolean): PsiElement? { + return changeBuildGradle(module) { gradleFile -> + changeLanguageVersion(gradleFile, languageVersion, forTests) + } + } + + fun changeLanguageVersion(gradleFile: GroovyFile, languageVersion: String, forTests: Boolean): PsiElement? { + val snippet = "languageVersion = \"$languageVersion\"" + val kotlinBlock = getBlockOrCreate(gradleFile, if (forTests) "compileTestKotlin" else "compileKotlin") + val experimentalBlock = getBlockOrCreate(kotlinBlock, "kotlinOptions") + addOrReplaceExpression(experimentalBlock, snippet) { stmt -> + (stmt as? GrAssignmentExpression)?.lValue?.text == "languageVersion" + } + return kotlinBlock.parent + } + private fun changeBuildGradle(module: Module, body: (GroovyFile) -> PsiElement?): PsiElement? { val gradleFilePath = getModuleFilePath(module) val gradleFile = getBuildGradleFile(module.project, gradleFilePath) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/EnableUnsupportedFeatureFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/EnableUnsupportedFeatureFix.kt index 1562da14af2..e8f2e4098d8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/EnableUnsupportedFeatureFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/EnableUnsupportedFeatureFix.kt @@ -17,8 +17,10 @@ package org.jetbrains.kotlin.idea.quickfix import com.intellij.openapi.editor.Editor +import com.intellij.openapi.fileEditor.OpenFileDescriptor import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootModificationUtil import com.intellij.openapi.roots.ex.ProjectRootManagerEx import com.intellij.psi.PsiElement @@ -27,6 +29,7 @@ import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.idea.KotlinPluginUtil import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgumentsHolder +import org.jetbrains.kotlin.idea.configuration.KotlinWithGradleConfigurator import org.jetbrains.kotlin.idea.facet.KotlinFacet import org.jetbrains.kotlin.psi.KtFile @@ -41,6 +44,15 @@ sealed class EnableUnsupportedFeatureFix( override fun invoke(project: Project, editor: Editor?, file: KtFile) { val module = ModuleUtilCore.findModuleForPsiElement(file) ?: return + if (KotlinPluginUtil.isGradleModule(module)) { + val forTests = ModuleRootManager.getInstance(module).fileIndex.isInTestSourceContent(file.virtualFile) + val element = KotlinWithGradleConfigurator.changeLanguageVersion(module, targetVersion.versionString, forTests) + element?.let { + OpenFileDescriptor(project, it.containingFile.virtualFile, it.textRange.startOffset).navigate(true) + } + return + } + val facetSettings = KotlinFacet.get(module)?.configuration?.settings ?: return ModuleRootModificationUtil.updateModel(module) { with(facetSettings.versionInfo) { @@ -69,9 +81,11 @@ sealed class EnableUnsupportedFeatureFix( override fun createAction(diagnostic: Diagnostic): EnableUnsupportedFeatureFix? { val targetVersion = Errors.UNSUPPORTED_FEATURE.cast(diagnostic).a.sinceVersion ?: return null val module = ModuleUtilCore.findModuleForPsiElement(diagnostic.psiElement) ?: return null - if (KotlinPluginUtil.isGradleModule(module) || KotlinPluginUtil.isMavenModule(module)) return null - val facetSettings = KotlinFacet.get(module)?.configuration?.settings - if (facetSettings == null || facetSettings.useProjectSettings) return InProject(diagnostic.psiElement, targetVersion) + if (KotlinPluginUtil.isMavenModule(module)) return null + if (!KotlinPluginUtil.isGradleModule(module)) { + val facetSettings = KotlinFacet.get(module)?.configuration?.settings + if (facetSettings == null || facetSettings.useProjectSettings) return InProject(diagnostic.psiElement, targetVersion) + } return InModule(diagnostic.psiElement, targetVersion) } } diff --git a/idea/tests/org/jetbrains/kotlin/gradle/KotlinWithGradleConfiguratorTest.kt b/idea/tests/org/jetbrains/kotlin/gradle/KotlinWithGradleConfiguratorTest.kt index 6a8b6179167..40e646591d8 100644 --- a/idea/tests/org/jetbrains/kotlin/gradle/KotlinWithGradleConfiguratorTest.kt +++ b/idea/tests/org/jetbrains/kotlin/gradle/KotlinWithGradleConfiguratorTest.kt @@ -58,4 +58,41 @@ class KotlinWithGradleConfiguratorTest : LightCodeInsightFixtureTestCase() { |} |""".trimMargin("|")) } + + fun testAddLanguageVersion() { + val buildGradle = myFixture.configureByText("build.gradle", "apply plugin: 'kotlin'\n") as GroovyFile + myFixture.project.executeWriteCommand("") { + KotlinWithGradleConfigurator.changeLanguageVersion(buildGradle, "1.1", false) + } + myFixture.checkResult( + """apply plugin: 'kotlin' + |compileKotlin { + | kotlinOptions { + | languageVersion = "1.1" + | } + |} + |""".trimMargin("|")) + } + + fun testChangeLanguageVersion() { + val buildGradle = myFixture.configureByText("build.gradle", + """apply plugin: 'kotlin' + |compileKotlin { + | kotlinOptions { + | languageVersion = "1.0" + | } + |} + |""".trimMargin("|")) as GroovyFile + myFixture.project.executeWriteCommand("") { + KotlinWithGradleConfigurator.changeLanguageVersion(buildGradle, "1.1", false) + } + myFixture.checkResult( + """apply plugin: 'kotlin' + |compileKotlin { + | kotlinOptions { + | languageVersion = "1.1" + | } + |} + |""".trimMargin("|")) + } }