From f2989ee3a60cb2c9e189cdd8825c0fd4279165d7 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 8 May 2018 13:46:01 +0300 Subject: [PATCH] Experimental fixes: introduce experimental enabling #KT-24243 Fixed --- .../quickfix/MakeModuleExperimentalFix.kt | 25 ++++++++++++++++++- .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 1 + .../quickfix/experimental/switchOn.kt | 8 ++++++ .../quickfix/experimental/switchOn.kt.after | 8 ++++++ .../idea/quickfix/QuickFixTestGenerated.java | 5 ++++ 5 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 idea/testData/quickfix/experimental/switchOn.kt create mode 100644 idea/testData/quickfix/experimental/switchOn.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/MakeModuleExperimentalFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/MakeModuleExperimentalFix.kt index 75ae943aff8..176874ac9ed 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/MakeModuleExperimentalFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/MakeModuleExperimentalFix.kt @@ -5,14 +5,20 @@ package org.jetbrains.kotlin.idea.quickfix +import com.intellij.codeInsight.intention.IntentionAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import org.jetbrains.kotlin.config.CompilerSettings +import org.jetbrains.kotlin.config.additionalArgumentsAsList +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.idea.facet.KotlinFacet import org.jetbrains.kotlin.idea.facet.getOrCreateFacet +import org.jetbrains.kotlin.idea.util.projectStructure.module import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.resolve.checkers.ExperimentalUsageChecker class MakeModuleExperimentalFix( file: KtFile, @@ -23,6 +29,8 @@ class MakeModuleExperimentalFix( override fun getFamilyName(): String = "Make module experimental" + private val compilerArgument = "-Xuse-experimental=$annotationFqName" + override fun invoke(project: Project, editor: Editor?, file: KtFile) { val modelsProvider = IdeModifiableModelsProviderImpl(project) val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false, commitModel = true) @@ -31,7 +39,22 @@ class MakeModuleExperimentalFix( facetSettings.compilerSettings = it } - compilerSettings.additionalArguments += " -Xuse-experimental=$annotationFqName" + compilerSettings.additionalArguments += " $compilerArgument" facetSettings.updateMergedArguments() } + + override fun isAvailable(project: Project, editor: Editor?, file: KtFile): Boolean { + val facet = KotlinFacet.get(module) ?: return true + val facetSettings = facet.configuration.settings + val compilerSettings = facetSettings.compilerSettings ?: return true + return compilerArgument !in compilerSettings.additionalArgumentsAsList + } + + companion object : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): IntentionAction? { + val containingKtFile = diagnostic.psiElement.containingFile as? KtFile ?: return null + val module = containingKtFile.module ?: return null + return MakeModuleExperimentalFix(containingKtFile, module, ExperimentalUsageChecker.EXPERIMENTAL_FQ_NAME) + } + } } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index fc732930eac..5c1293619cd 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -551,5 +551,6 @@ class QuickFixRegistrar : QuickFixContributor { EXPERIMENTAL_API_USAGE_ERROR.registerFactory(ExperimentalFixesFactory) EXPERIMENTAL_OVERRIDE.registerFactory(ExperimentalFixesFactory) EXPERIMENTAL_OVERRIDE_ERROR.registerFactory(ExperimentalFixesFactory) + EXPERIMENTAL_IS_NOT_ENABLED.registerFactory(MakeModuleExperimentalFix) } } diff --git a/idea/testData/quickfix/experimental/switchOn.kt b/idea/testData/quickfix/experimental/switchOn.kt new file mode 100644 index 00000000000..f8fa5eb86f4 --- /dev/null +++ b/idea/testData/quickfix/experimental/switchOn.kt @@ -0,0 +1,8 @@ +// "Add '-Xuse-experimental=kotlin.Experimental' to module light_idea_test_case compiler arguments" "true" +// COMPILER_ARGUMENTS: -version +// COMPILER_ARGUMENTS_AFTER: -version -Xuse-experimental=kotlin.Experimental +// DISABLE-ERRORS +// WITH_RUNTIME + +@Experimental +annotation class MyExperimentalAPI \ No newline at end of file diff --git a/idea/testData/quickfix/experimental/switchOn.kt.after b/idea/testData/quickfix/experimental/switchOn.kt.after new file mode 100644 index 00000000000..c841c4a2906 --- /dev/null +++ b/idea/testData/quickfix/experimental/switchOn.kt.after @@ -0,0 +1,8 @@ +// "Add '-Xuse-experimental=kotlin.Experimental' to module light_idea_test_case compiler arguments" "true" +// COMPILER_ARGUMENTS: -version +// COMPILER_ARGUMENTS_AFTER: -version -Xuse-experimental=kotlin.Experimental +// DISABLE-ERRORS +// WITH_RUNTIME + +@Experimental +annotation class MyExperimentalAPI \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 2b6dadc6e63..cf78d87a7c2 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -6081,6 +6081,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { public void testOverride() throws Exception { runTest("idea/testData/quickfix/experimental/override.kt"); } + + @TestMetadata("switchOn.kt") + public void testSwitchOn() throws Exception { + runTest("idea/testData/quickfix/experimental/switchOn.kt"); + } } @TestMetadata("idea/testData/quickfix/expressions")