Add quickfix to increase language level by editing build.gradle

This commit is contained in:
Dmitry Jemerov
2017-01-27 20:15:27 +01:00
parent c170c7b98f
commit ddbb476211
3 changed files with 71 additions and 3 deletions
@@ -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)
@@ -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)
}
}
@@ -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("|"))
}
}