Ask to update runtime library when increasing language version for module

This commit is contained in:
Dmitry Jemerov
2017-02-16 13:39:48 +01:00
parent de2117663c
commit 58713270bb
2 changed files with 28 additions and 24 deletions
@@ -25,7 +25,6 @@ import com.intellij.openapi.roots.ModuleRootModificationUtil
import com.intellij.openapi.roots.ex.ProjectRootManagerEx import com.intellij.openapi.roots.ex.ProjectRootManagerEx
import com.intellij.openapi.ui.Messages import com.intellij.openapi.ui.Messages
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.config.CoroutineSupport import org.jetbrains.kotlin.config.CoroutineSupport
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersion import org.jetbrains.kotlin.config.LanguageVersion
@@ -36,9 +35,6 @@ import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgu
import org.jetbrains.kotlin.idea.configuration.KotlinWithGradleConfigurator import org.jetbrains.kotlin.idea.configuration.KotlinWithGradleConfigurator
import org.jetbrains.kotlin.idea.facet.KotlinFacet import org.jetbrains.kotlin.idea.facet.KotlinFacet
import org.jetbrains.kotlin.idea.facet.getRuntimeLibraryVersion import org.jetbrains.kotlin.idea.facet.getRuntimeLibraryVersion
import org.jetbrains.kotlin.idea.util.projectStructure.allModules
import org.jetbrains.kotlin.idea.versions.findKotlinRuntimeLibrary
import org.jetbrains.kotlin.idea.versions.updateLibraries
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
sealed class ChangeCoroutineSupportFix( sealed class ChangeCoroutineSupportFix(
@@ -70,17 +66,8 @@ sealed class ChangeCoroutineSupportFix(
return return
} }
if (runtimeUpdateRequired) { if (runtimeUpdateRequired && !askUpdateRuntime(module, LanguageFeature.Coroutines.sinceApiVersion)) {
val library = findKotlinRuntimeLibrary(module) return
if (library != null) {
val rc = Messages.showOkCancelDialog(project,
"Coroutines support requires version 1.1 or later of the Kotlin runtime library. " +
"Would you like to update the runtime library in your project?",
super.getText(),
Messages.getQuestionIcon())
if (rc != Messages.OK) return
updateLibraries(project, listOf(library))
}
} }
val facetSettings = KotlinFacet.get(module)?.configuration?.settings ?: return val facetSettings = KotlinFacet.get(module)?.configuration?.settings ?: return
@@ -90,6 +77,7 @@ sealed class ChangeCoroutineSupportFix(
facetSettings.versionInfo.languageLevel = LanguageVersion.KOTLIN_1_1 facetSettings.versionInfo.languageLevel = LanguageVersion.KOTLIN_1_1
} }
} }
} }
class InProject(element: PsiElement, coroutineSupport: CoroutineSupport) : ChangeCoroutineSupportFix(element, coroutineSupport) { class InProject(element: PsiElement, coroutineSupport: CoroutineSupport) : ChangeCoroutineSupportFix(element, coroutineSupport) {
@@ -18,11 +18,13 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.Editor
import com.intellij.openapi.fileEditor.OpenFileDescriptor import com.intellij.openapi.fileEditor.OpenFileDescriptor
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.module.ModuleUtilCore
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.roots.ModuleRootModificationUtil import com.intellij.openapi.roots.ModuleRootModificationUtil
import com.intellij.openapi.roots.ex.ProjectRootManagerEx import com.intellij.openapi.roots.ex.ProjectRootManagerEx
import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.ui.Messages import com.intellij.openapi.ui.Messages
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.config.ApiVersion import org.jetbrains.kotlin.config.ApiVersion
@@ -89,6 +91,10 @@ sealed class EnableUnsupportedFeatureFix(
return return
} }
if (runtimeUpdateRequired && !askUpdateRuntime(module, feature.sinceApiVersion)) {
return
}
ModuleRootModificationUtil.updateModel(module) { ModuleRootModificationUtil.updateModel(module) {
with(facetSettings.versionInfo) { with(facetSettings.versionInfo) {
if (!apiVersionOnly) { if (!apiVersionOnly) {
@@ -155,15 +161,25 @@ fun checkUpdateRuntime(project: Project, requiredVersion: ApiVersion): Boolean {
parsedModuleRuntimeVersion != null && parsedModuleRuntimeVersion < requiredVersion parsedModuleRuntimeVersion != null && parsedModuleRuntimeVersion < requiredVersion
} }
if (modulesWithOutdatedRuntime.isNotEmpty()) { if (modulesWithOutdatedRuntime.isNotEmpty()) {
val rc = Messages.showOkCancelDialog(project, if (askUpdateRuntime(project, requiredVersion,
"This language feature requires version $requiredVersion or later of the Kotlin runtime library. " + modulesWithOutdatedRuntime.mapNotNull(::findKotlinRuntimeLibrary))) return false
"Would you like to update the runtime library in your project?",
"Update runtime library",
Messages.getQuestionIcon())
if (rc != Messages.OK) return false
val librariesToUpdate = modulesWithOutdatedRuntime.mapNotNull(::findKotlinRuntimeLibrary)
updateLibraries(project, librariesToUpdate)
} }
return true return true
} }
fun askUpdateRuntime(project: Project, requiredVersion: ApiVersion, librariesToUpdate: List<Library>): Boolean {
val rc = Messages.showOkCancelDialog(project,
"This language feature requires version $requiredVersion or later of the Kotlin runtime library. " +
"Would you like to update the runtime library in your project?",
"Update Runtime Library",
Messages.getQuestionIcon())
if (rc != Messages.OK) return false
updateLibraries(project, librariesToUpdate)
return true
}
fun askUpdateRuntime(module: Module, requiredVersion: ApiVersion): Boolean {
val library = findKotlinRuntimeLibrary(module) ?: return true
return askUpdateRuntime(module.project, requiredVersion, listOf(library))
}