Add quickfix to increase language level by editing build.gradle
This commit is contained in:
@@ -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("|"))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user