Introduce skeleton for ChangeGeneralLanguageFeatureSupportFix
Part of KT-26775 and KT-26774
This commit is contained in:
+20
-15
@@ -62,25 +62,30 @@ fun getLibraryLanguageLevel(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getDefaultLanguageLevel(
|
fun getDefaultLanguageLevel(
|
||||||
module: Module,
|
module: Module,
|
||||||
explicitVersion: String? = null,
|
explicitVersion: String? = null,
|
||||||
coerceRuntimeLibraryVersionToReleased: Boolean = true
|
coerceRuntimeLibraryVersionToReleased: Boolean = true
|
||||||
): LanguageVersion {
|
): LanguageVersion {
|
||||||
val libVersion = explicitVersion
|
val libVersion = explicitVersion
|
||||||
?: KotlinVersionInfoProvider.EP_NAME.extensions
|
?: KotlinVersionInfoProvider.EP_NAME.extensions
|
||||||
.mapNotNull { it.getCompilerVersion(module) }
|
.mapNotNull { it.getCompilerVersion(module) }
|
||||||
.addReleaseVersionIfNecessary(coerceRuntimeLibraryVersionToReleased)
|
.addReleaseVersionIfNecessary(coerceRuntimeLibraryVersionToReleased)
|
||||||
.minWith(VersionComparatorUtil.COMPARATOR)
|
.minWith(VersionComparatorUtil.COMPARATOR)
|
||||||
?: return VersionView.RELEASED_VERSION
|
?: return VersionView.RELEASED_VERSION
|
||||||
return when {
|
return libVersion.toLanguageVersion()
|
||||||
libVersion.startsWith("1.3") -> LanguageVersion.KOTLIN_1_3
|
|
||||||
libVersion.startsWith("1.2") -> LanguageVersion.KOTLIN_1_2
|
|
||||||
libVersion.startsWith("1.1") -> LanguageVersion.KOTLIN_1_1
|
|
||||||
libVersion.startsWith("1.0") -> LanguageVersion.KOTLIN_1_0
|
|
||||||
else -> VersionView.RELEASED_VERSION
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun String?.toLanguageVersion(): LanguageVersion = when {
|
||||||
|
this == null -> VersionView.RELEASED_VERSION
|
||||||
|
startsWith("1.3") -> LanguageVersion.KOTLIN_1_3
|
||||||
|
startsWith("1.2") -> LanguageVersion.KOTLIN_1_2
|
||||||
|
startsWith("1.1") -> LanguageVersion.KOTLIN_1_1
|
||||||
|
startsWith("1.0") -> LanguageVersion.KOTLIN_1_0
|
||||||
|
else -> VersionView.RELEASED_VERSION
|
||||||
|
}
|
||||||
|
|
||||||
|
fun String?.toApiVersion(): ApiVersion = ApiVersion.createByLanguageVersion(toLanguageVersion())
|
||||||
|
|
||||||
private fun Iterable<String>.addReleaseVersionIfNecessary(shouldAdd: Boolean): Iterable<String> =
|
private fun Iterable<String>.addReleaseVersionIfNecessary(shouldAdd: Boolean): Iterable<String> =
|
||||||
if (shouldAdd) this + VersionView.RELEASED_VERSION.versionString else this
|
if (shouldAdd) this + VersionView.RELEASED_VERSION.versionString else this
|
||||||
|
|
||||||
|
|||||||
+4
-1
@@ -22,10 +22,11 @@ import com.intellij.openapi.roots.ExternalLibraryDescriptor
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiFile
|
import com.intellij.psi.PsiFile
|
||||||
import org.gradle.util.GradleVersion
|
import org.gradle.util.GradleVersion
|
||||||
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
import org.jetbrains.kotlin.idea.util.module
|
import org.jetbrains.kotlin.idea.util.module
|
||||||
import org.jetbrains.plugins.gradle.settings.GradleSettings
|
import org.jetbrains.plugins.gradle.settings.GradleSettings
|
||||||
|
|
||||||
interface GradleBuildScriptManipulator<out Psi: PsiFile> {
|
interface GradleBuildScriptManipulator<out Psi : PsiFile> {
|
||||||
val scriptFile: Psi
|
val scriptFile: Psi
|
||||||
val preferNewSyntax: Boolean
|
val preferNewSyntax: Boolean
|
||||||
|
|
||||||
@@ -44,6 +45,8 @@ interface GradleBuildScriptManipulator<out Psi: PsiFile> {
|
|||||||
|
|
||||||
fun changeCoroutineConfiguration(coroutineOption: String): PsiElement?
|
fun changeCoroutineConfiguration(coroutineOption: String): PsiElement?
|
||||||
|
|
||||||
|
fun changeLanguageFeatureConfiguration(feature: LanguageFeature, state: LanguageFeature.State): PsiElement?
|
||||||
|
|
||||||
fun changeLanguageVersion(version: String, forTests: Boolean): PsiElement?
|
fun changeLanguageVersion(version: String, forTests: Boolean): PsiElement?
|
||||||
|
|
||||||
fun changeApiVersion(version: String, forTests: Boolean): PsiElement?
|
fun changeApiVersion(version: String, forTests: Boolean): PsiElement?
|
||||||
|
|||||||
+9
@@ -21,6 +21,7 @@ import com.intellij.openapi.roots.ExternalLibraryDescriptor
|
|||||||
import com.intellij.openapi.util.text.StringUtil
|
import com.intellij.openapi.util.text.StringUtil
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.codeStyle.CodeStyleManager
|
import com.intellij.psi.codeStyle.CodeStyleManager
|
||||||
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
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
|
||||||
@@ -150,6 +151,14 @@ class GroovyBuildScriptManipulator(
|
|||||||
return kotlinBlock.parent
|
return kotlinBlock.parent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun changeLanguageFeatureConfiguration(
|
||||||
|
feature: LanguageFeature,
|
||||||
|
state: LanguageFeature.State
|
||||||
|
): PsiElement? {
|
||||||
|
// TODO: here we should use compileKotlin (TestKotlin).kotlinOptions.freeCompilerArgs = ["-XXLanguage:-InlineClasses"]
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
override fun changeLanguageVersion(version: String, forTests: Boolean): PsiElement? =
|
override fun changeLanguageVersion(version: String, forTests: Boolean): PsiElement? =
|
||||||
changeKotlinTaskParameter(scriptFile, "languageVersion", version, forTests)
|
changeKotlinTaskParameter(scriptFile, "languageVersion", version, forTests)
|
||||||
|
|
||||||
|
|||||||
+15
@@ -21,6 +21,7 @@ import com.intellij.openapi.roots.ExternalLibraryDescriptor
|
|||||||
import com.intellij.openapi.util.text.StringUtil
|
import com.intellij.openapi.util.text.StringUtil
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.util.PsiTreeUtil
|
import com.intellij.psi.util.PsiTreeUtil
|
||||||
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
import org.jetbrains.kotlin.idea.configuration.KotlinWithGradleConfigurator.Companion.getBuildScriptSettingsPsiFile
|
import org.jetbrains.kotlin.idea.configuration.KotlinWithGradleConfigurator.Companion.getBuildScriptSettingsPsiFile
|
||||||
import org.jetbrains.kotlin.idea.inspections.gradle.GradleHeuristicHelper.PRODUCTION_DEPENDENCY_STATEMENTS
|
import org.jetbrains.kotlin.idea.inspections.gradle.GradleHeuristicHelper.PRODUCTION_DEPENDENCY_STATEMENTS
|
||||||
import org.jetbrains.kotlin.idea.util.application.runReadAction
|
import org.jetbrains.kotlin.idea.util.application.runReadAction
|
||||||
@@ -108,6 +109,12 @@ class KotlinBuildScriptManipulator(
|
|||||||
override fun changeCoroutineConfiguration(coroutineOption: String): PsiElement? =
|
override fun changeCoroutineConfiguration(coroutineOption: String): PsiElement? =
|
||||||
scriptFile.changeCoroutineConfiguration(coroutineOption)
|
scriptFile.changeCoroutineConfiguration(coroutineOption)
|
||||||
|
|
||||||
|
override fun changeLanguageFeatureConfiguration(
|
||||||
|
feature: LanguageFeature,
|
||||||
|
state: LanguageFeature.State
|
||||||
|
): PsiElement? =
|
||||||
|
scriptFile.changeLanguageFeatureConfiguration(feature, state)
|
||||||
|
|
||||||
override fun changeLanguageVersion(version: String, forTests: Boolean): PsiElement? =
|
override fun changeLanguageVersion(version: String, forTests: Boolean): PsiElement? =
|
||||||
scriptFile.changeKotlinTaskParameter("languageVersion", version, forTests)
|
scriptFile.changeKotlinTaskParameter("languageVersion", version, forTests)
|
||||||
|
|
||||||
@@ -298,6 +305,14 @@ class KotlinBuildScriptManipulator(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun KtFile.changeLanguageFeatureConfiguration(
|
||||||
|
feature: LanguageFeature,
|
||||||
|
state: LanguageFeature.State
|
||||||
|
): PsiElement? {
|
||||||
|
// TODO: Kotlin DSL
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
private fun KtFile.changeKotlinTaskParameter(parameterName: String, parameterValue: String, forTests: Boolean): PsiElement? {
|
private fun KtFile.changeKotlinTaskParameter(parameterName: String, parameterValue: String, forTests: Boolean): PsiElement? {
|
||||||
val snippet = "$parameterName = \"$parameterValue\""
|
val snippet = "$parameterName = \"$parameterValue\""
|
||||||
val taskName = if (forTests) "compileTestKotlin" else "compileKotlin"
|
val taskName = if (forTests) "compileTestKotlin" else "compileKotlin"
|
||||||
|
|||||||
+27
-1
@@ -29,6 +29,7 @@ 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.idea.facet.getRuntimeLibraryVersion
|
import org.jetbrains.kotlin.idea.facet.getRuntimeLibraryVersion
|
||||||
|
import org.jetbrains.kotlin.idea.facet.toApiVersion
|
||||||
import org.jetbrains.kotlin.idea.framework.ui.ConfigureDialogWithModulesAndVersion
|
import org.jetbrains.kotlin.idea.framework.ui.ConfigureDialogWithModulesAndVersion
|
||||||
import org.jetbrains.kotlin.idea.quickfix.ChangeCoroutineSupportFix
|
import org.jetbrains.kotlin.idea.quickfix.ChangeCoroutineSupportFix
|
||||||
import org.jetbrains.kotlin.idea.util.application.executeCommand
|
import org.jetbrains.kotlin.idea.util.application.executeCommand
|
||||||
@@ -234,7 +235,7 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator {
|
|||||||
|
|
||||||
override fun changeCoroutineConfiguration(module: Module, state: LanguageFeature.State) {
|
override fun changeCoroutineConfiguration(module: Module, state: LanguageFeature.State) {
|
||||||
val runtimeUpdateRequired = state != LanguageFeature.State.DISABLED &&
|
val runtimeUpdateRequired = state != LanguageFeature.State.DISABLED &&
|
||||||
(getRuntimeLibraryVersion(module)?.startsWith("1.0") ?: false)
|
getRuntimeLibraryVersion(module).toApiVersion() == ApiVersion.KOTLIN_1_0
|
||||||
|
|
||||||
if (runtimeUpdateRequired) {
|
if (runtimeUpdateRequired) {
|
||||||
Messages.showErrorDialog(
|
Messages.showErrorDialog(
|
||||||
@@ -252,6 +253,31 @@ abstract class KotlinWithGradleConfigurator : KotlinProjectConfigurator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun changeGeneralFeatureConfiguration(
|
||||||
|
module: Module,
|
||||||
|
feature: LanguageFeature,
|
||||||
|
state: LanguageFeature.State
|
||||||
|
) {
|
||||||
|
val sinceVersion = feature.sinceApiVersion
|
||||||
|
|
||||||
|
if (state != LanguageFeature.State.DISABLED && getRuntimeLibraryVersion(module).toApiVersion() < sinceVersion) {
|
||||||
|
Messages.showErrorDialog(
|
||||||
|
module.project,
|
||||||
|
"${feature.presentableName} support requires version $sinceVersion or later of the Kotlin runtime library. " +
|
||||||
|
"Please update the version in your build script.",
|
||||||
|
ChangeCoroutineSupportFix.getFixText(state)
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val element = changeBuildGradle(module) {
|
||||||
|
getManipulator(it).changeLanguageFeatureConfiguration(feature, state)
|
||||||
|
}
|
||||||
|
if (element != null) {
|
||||||
|
OpenFileDescriptor(module.project, element.containingFile.virtualFile, element.textRange.startOffset).navigate(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun addLibraryDependency(
|
override fun addLibraryDependency(
|
||||||
module: Module,
|
module: Module,
|
||||||
element: PsiElement,
|
element: PsiElement,
|
||||||
|
|||||||
@@ -56,6 +56,8 @@ interface KotlinProjectConfigurator {
|
|||||||
|
|
||||||
fun changeCoroutineConfiguration(module: Module, state: LanguageFeature.State)
|
fun changeCoroutineConfiguration(module: Module, state: LanguageFeature.State)
|
||||||
|
|
||||||
|
fun changeGeneralFeatureConfiguration(module: Module, feature: LanguageFeature, state: LanguageFeature.State)
|
||||||
|
|
||||||
fun addLibraryDependency(module: Module, element: PsiElement, library: ExternalLibraryDescriptor, libraryJarDescriptors: List<LibraryJarDescriptor>)
|
fun addLibraryDependency(module: Module, element: PsiElement, library: ExternalLibraryDescriptor, libraryJarDescriptors: List<LibraryJarDescriptor>)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
+26
-3
@@ -19,9 +19,8 @@ import com.intellij.openapi.vfs.VfsUtilCore
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.annotations.Contract
|
import org.jetbrains.annotations.Contract
|
||||||
import org.jetbrains.kotlin.config.*
|
import org.jetbrains.kotlin.config.*
|
||||||
import org.jetbrains.kotlin.idea.KotlinPluginUtil
|
|
||||||
import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCommonCompilerArgumentsHolder
|
|
||||||
import org.jetbrains.kotlin.idea.facet.getRuntimeLibraryVersion
|
import org.jetbrains.kotlin.idea.facet.getRuntimeLibraryVersion
|
||||||
|
import org.jetbrains.kotlin.idea.facet.toApiVersion
|
||||||
import org.jetbrains.kotlin.idea.framework.ui.CreateLibraryDialogWithModules
|
import org.jetbrains.kotlin.idea.framework.ui.CreateLibraryDialogWithModules
|
||||||
import org.jetbrains.kotlin.idea.framework.ui.FileUIUtils
|
import org.jetbrains.kotlin.idea.framework.ui.FileUIUtils
|
||||||
import org.jetbrains.kotlin.idea.quickfix.askUpdateRuntime
|
import org.jetbrains.kotlin.idea.quickfix.askUpdateRuntime
|
||||||
@@ -332,7 +331,7 @@ abstract class KotlinWithLibraryConfigurator protected constructor() : KotlinPro
|
|||||||
|
|
||||||
override fun changeCoroutineConfiguration(module: Module, state: LanguageFeature.State) {
|
override fun changeCoroutineConfiguration(module: Module, state: LanguageFeature.State) {
|
||||||
val runtimeUpdateRequired = state != LanguageFeature.State.DISABLED &&
|
val runtimeUpdateRequired = state != LanguageFeature.State.DISABLED &&
|
||||||
(getRuntimeLibraryVersion(module)?.startsWith("1.0") ?: false)
|
getRuntimeLibraryVersion(module).toApiVersion() == ApiVersion.KOTLIN_1_0
|
||||||
|
|
||||||
if (runtimeUpdateRequired && !askUpdateRuntime(module, LanguageFeature.Coroutines.sinceApiVersion)) {
|
if (runtimeUpdateRequired && !askUpdateRuntime(module, LanguageFeature.Coroutines.sinceApiVersion)) {
|
||||||
return
|
return
|
||||||
@@ -346,6 +345,30 @@ abstract class KotlinWithLibraryConfigurator protected constructor() : KotlinPro
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun changeGeneralFeatureConfiguration(
|
||||||
|
module: Module,
|
||||||
|
feature: LanguageFeature,
|
||||||
|
state: LanguageFeature.State
|
||||||
|
) {
|
||||||
|
val sinceVersion = feature.sinceApiVersion
|
||||||
|
|
||||||
|
if (state != LanguageFeature.State.DISABLED &&
|
||||||
|
getRuntimeLibraryVersion(module).toApiVersion() < sinceVersion &&
|
||||||
|
!askUpdateRuntime(module, sinceVersion)
|
||||||
|
) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val facetSettings = KotlinFacetSettingsProvider.getInstance(module.project).getInitializedSettings(module)
|
||||||
|
ModuleRootModificationUtil.updateModel(module) {
|
||||||
|
facetSettings.apiLevel = LanguageVersion.KOTLIN_1_3
|
||||||
|
facetSettings.languageLevel = LanguageVersion.KOTLIN_1_3
|
||||||
|
facetSettings.compilerSettings?.apply {
|
||||||
|
// TODO: JPS, module
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun updateLanguageVersion(module: Module, languageVersion: String?, apiVersion: String?, requiredStdlibVersion: ApiVersion, forTests: Boolean) {
|
override fun updateLanguageVersion(module: Module, languageVersion: String?, apiVersion: String?, requiredStdlibVersion: ApiVersion, forTests: Boolean) {
|
||||||
val runtimeUpdateRequired = getRuntimeLibraryVersion(module)?.let { ApiVersion.parse(it) }?.let { runtimeVersion ->
|
val runtimeUpdateRequired = getRuntimeLibraryVersion(module)?.let { ApiVersion.parse(it) }?.let { runtimeVersion ->
|
||||||
runtimeVersion < requiredStdlibVersion
|
runtimeVersion < requiredStdlibVersion
|
||||||
|
|||||||
+84
@@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.quickfix
|
||||||
|
|
||||||
|
import com.intellij.codeInsight.intention.IntentionAction
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
|
import com.intellij.openapi.module.ModuleUtilCore
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
|
import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCompilerSettings
|
||||||
|
import org.jetbrains.kotlin.idea.configuration.BuildSystemType
|
||||||
|
import org.jetbrains.kotlin.idea.configuration.findApplicableConfigurator
|
||||||
|
import org.jetbrains.kotlin.idea.configuration.getBuildSystemType
|
||||||
|
import org.jetbrains.kotlin.idea.facet.KotlinFacet
|
||||||
|
import org.jetbrains.kotlin.idea.roots.invalidateProjectRoots
|
||||||
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
|
||||||
|
sealed class ChangeGeneralLanguageFeatureSupportFix(
|
||||||
|
element: PsiElement,
|
||||||
|
feature: LanguageFeature,
|
||||||
|
featureSupport: LanguageFeature.State
|
||||||
|
) : AbstractChangeFeatureSupportLevelFix(element, feature, featureSupport, feature.presentableName) {
|
||||||
|
|
||||||
|
class InModule(
|
||||||
|
element: PsiElement,
|
||||||
|
feature: LanguageFeature,
|
||||||
|
featureSupport: LanguageFeature.State
|
||||||
|
) : ChangeGeneralLanguageFeatureSupportFix(element, feature, featureSupport) {
|
||||||
|
override fun getText() = "${super.getText()} in the current module"
|
||||||
|
|
||||||
|
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
|
||||||
|
val module = ModuleUtilCore.findModuleForPsiElement(file) ?: return
|
||||||
|
|
||||||
|
findApplicableConfigurator(module).changeGeneralFeatureConfiguration(module, feature, featureSupport)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class InProject(
|
||||||
|
element: PsiElement,
|
||||||
|
feature: LanguageFeature,
|
||||||
|
featureSupport: LanguageFeature.State
|
||||||
|
) : ChangeGeneralLanguageFeatureSupportFix(element, feature, featureSupport) {
|
||||||
|
override fun getText() = "${super.getText()} in the project"
|
||||||
|
|
||||||
|
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
|
||||||
|
if (featureSupportEnabled) {
|
||||||
|
if (!checkUpdateRuntime(project, feature.sinceApiVersion)) return
|
||||||
|
}
|
||||||
|
KotlinCompilerSettings.getInstance(project).update {
|
||||||
|
// TODO: JPS, project
|
||||||
|
}
|
||||||
|
project.invalidateProjectRoots()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object : FeatureSupportIntentionActionsFactory() {
|
||||||
|
private val supportedFeatures = listOf(LanguageFeature.InlineClasses)
|
||||||
|
|
||||||
|
fun getFixText(feature: LanguageFeature, state: LanguageFeature.State) = getFixText(state, feature.presentableName)
|
||||||
|
|
||||||
|
override fun doCreateActions(diagnostic: Diagnostic): List<IntentionAction> {
|
||||||
|
val module = ModuleUtilCore.findModuleForPsiElement(diagnostic.psiElement) ?: return emptyList()
|
||||||
|
|
||||||
|
fun shouldConfigureInProject(): Boolean {
|
||||||
|
val facetSettings = KotlinFacet.get(module)?.configuration?.settings
|
||||||
|
return (facetSettings == null || facetSettings.useProjectSettings) &&
|
||||||
|
module.getBuildSystemType() == BuildSystemType.JPS
|
||||||
|
}
|
||||||
|
|
||||||
|
return supportedFeatures.flatMap { feature ->
|
||||||
|
doCreateActions(
|
||||||
|
diagnostic, feature, allowWarningAndErrorMode = false,
|
||||||
|
quickFixConstructor = if (shouldConfigureInProject()) ::InProject else ::InModule
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -36,6 +36,9 @@ class JvmQuickFixRegistrar : QuickFixContributor {
|
|||||||
EXPERIMENTAL_FEATURE_ERROR.registerFactory(ChangeCoroutineSupportFix)
|
EXPERIMENTAL_FEATURE_ERROR.registerFactory(ChangeCoroutineSupportFix)
|
||||||
EXPERIMENTAL_FEATURE_WARNING.registerFactory(ChangeCoroutineSupportFix)
|
EXPERIMENTAL_FEATURE_WARNING.registerFactory(ChangeCoroutineSupportFix)
|
||||||
|
|
||||||
|
EXPERIMENTAL_FEATURE_ERROR.registerFactory(ChangeGeneralLanguageFeatureSupportFix)
|
||||||
|
EXPERIMENTAL_FEATURE_WARNING.registerFactory(ChangeGeneralLanguageFeatureSupportFix)
|
||||||
|
|
||||||
NO_REFLECTION_IN_CLASS_PATH.registerFactory(AddReflectionQuickFix)
|
NO_REFLECTION_IN_CLASS_PATH.registerFactory(AddReflectionQuickFix)
|
||||||
|
|
||||||
MISSING_SCRIPT_BASE_CLASS.registerFactory(AddScriptRuntimeQuickFix)
|
MISSING_SCRIPT_BASE_CLASS.registerFactory(AddScriptRuntimeQuickFix)
|
||||||
|
|||||||
+28
-2
@@ -34,9 +34,11 @@ import org.jetbrains.kotlin.config.CoroutineSupport
|
|||||||
import org.jetbrains.kotlin.config.LanguageFeature
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
import org.jetbrains.kotlin.idea.configuration.*
|
import org.jetbrains.kotlin.idea.configuration.*
|
||||||
import org.jetbrains.kotlin.idea.facet.getRuntimeLibraryVersion
|
import org.jetbrains.kotlin.idea.facet.getRuntimeLibraryVersion
|
||||||
|
import org.jetbrains.kotlin.idea.facet.toApiVersion
|
||||||
import org.jetbrains.kotlin.idea.framework.ui.ConfigureDialogWithModulesAndVersion
|
import org.jetbrains.kotlin.idea.framework.ui.ConfigureDialogWithModulesAndVersion
|
||||||
import org.jetbrains.kotlin.idea.maven.*
|
import org.jetbrains.kotlin.idea.maven.*
|
||||||
import org.jetbrains.kotlin.idea.quickfix.ChangeCoroutineSupportFix
|
import org.jetbrains.kotlin.idea.quickfix.ChangeCoroutineSupportFix
|
||||||
|
import org.jetbrains.kotlin.idea.quickfix.ChangeGeneralLanguageFeatureSupportFix
|
||||||
import org.jetbrains.kotlin.idea.util.application.runReadAction
|
import org.jetbrains.kotlin.idea.util.application.runReadAction
|
||||||
import org.jetbrains.kotlin.idea.versions.LibraryJarDescriptor
|
import org.jetbrains.kotlin.idea.versions.LibraryJarDescriptor
|
||||||
|
|
||||||
@@ -249,7 +251,7 @@ protected constructor(
|
|||||||
|
|
||||||
override fun changeCoroutineConfiguration(module: Module, state: LanguageFeature.State) {
|
override fun changeCoroutineConfiguration(module: Module, state: LanguageFeature.State) {
|
||||||
val runtimeUpdateRequired = state != LanguageFeature.State.DISABLED &&
|
val runtimeUpdateRequired = state != LanguageFeature.State.DISABLED &&
|
||||||
(getRuntimeLibraryVersion(module)?.startsWith("1.0") ?: false)
|
getRuntimeLibraryVersion(module).toApiVersion() == ApiVersion.KOTLIN_1_0
|
||||||
|
|
||||||
val messageTitle = ChangeCoroutineSupportFix.getFixText(state)
|
val messageTitle = ChangeCoroutineSupportFix.getFixText(state)
|
||||||
if (runtimeUpdateRequired) {
|
if (runtimeUpdateRequired) {
|
||||||
@@ -270,7 +272,31 @@ protected constructor(
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun changeMavenCoroutineConfiguration(module: Module, value: String, messageTitle: String): PsiElement? {
|
override fun changeGeneralFeatureConfiguration(
|
||||||
|
module: Module,
|
||||||
|
feature: LanguageFeature,
|
||||||
|
state: LanguageFeature.State
|
||||||
|
) {
|
||||||
|
val sinceVersion = feature.sinceApiVersion
|
||||||
|
|
||||||
|
val messageTitle = ChangeGeneralLanguageFeatureSupportFix.getFixText(feature, state)
|
||||||
|
if (state != LanguageFeature.State.DISABLED && getRuntimeLibraryVersion(module).toApiVersion() < sinceVersion) {
|
||||||
|
Messages.showErrorDialog(
|
||||||
|
module.project,
|
||||||
|
"${feature.presentableName} support requires version $sinceVersion or later of the Kotlin runtime library. " +
|
||||||
|
"Please update the version in your build script.",
|
||||||
|
messageTitle
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// TODO: here we should make something like https://kotlinlang.org/docs/reference/using-maven.html#specifying-compiler-options
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun changeMavenCoroutineConfiguration(
|
||||||
|
module: Module,
|
||||||
|
value: String,
|
||||||
|
messageTitle: String
|
||||||
|
): PsiElement? {
|
||||||
fun doChangeMavenCoroutineConfiguration(): PsiElement? {
|
fun doChangeMavenCoroutineConfiguration(): PsiElement? {
|
||||||
val psi = KotlinMavenConfigurator.findModulePomFile(module) as? XmlFile ?: return null
|
val psi = KotlinMavenConfigurator.findModulePomFile(module) as? XmlFile ?: return null
|
||||||
val pom = PomFile.forFileOrNull(psi) ?: return null
|
val pom = PomFile.forFileOrNull(psi) ?: return null
|
||||||
|
|||||||
Reference in New Issue
Block a user