From 3aab68d635a5675d9dc80e98df50e0a2e0c384e9 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Tue, 8 May 2018 17:32:29 +0300 Subject: [PATCH] Add "Make variable immutable" quickfix for const #KT-24263 Fixed --- .../idea/quickfix/ChangeVariableMutabilityFix.kt | 10 ++++++++++ .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 2 +- .../testData/quickfix/typeOfAnnotationMember/string.kt | 1 + .../variables/changeMutability/canBeVal/const.kt | 4 ++++ .../variables/changeMutability/canBeVal/const.kt.after | 4 ++++ .../kotlin/idea/quickfix/QuickFixTestGenerated.java | 5 +++++ 6 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 idea/testData/quickfix/variables/changeMutability/canBeVal/const.kt create mode 100644 idea/testData/quickfix/variables/changeMutability/canBeVal/const.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableMutabilityFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableMutabilityFix.kt index d55d4f7ea4e..72b417ab00e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableMutabilityFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableMutabilityFix.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticFactory1 import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.lexer.KtToken import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType @@ -98,5 +99,14 @@ class ChangeVariableMutabilityFix( return ChangeVariableMutabilityFix(property, makeVar = true) } } + + val CONST_VAL_FACTORY = object : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): IntentionAction? { + val (modifier, element) = Errors.WRONG_MODIFIER_TARGET.cast(diagnostic).run { a to psiElement } + if (modifier != KtTokens.CONST_KEYWORD) return null + val property = element.getStrictParentOfType() ?: return null + return ChangeVariableMutabilityFix(property, makeVar = false) + } + } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 6f48b0b6431..a723eded0d5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -137,7 +137,7 @@ class QuickFixRegistrar : QuickFixContributor { removeModifierFactory ) REDUNDANT_MODIFIER_IN_GETTER.registerFactory(removeRedundantModifierFactory) - WRONG_MODIFIER_TARGET.registerFactory(removeModifierFactory) + WRONG_MODIFIER_TARGET.registerFactory(removeModifierFactory, ChangeVariableMutabilityFix.CONST_VAL_FACTORY) DEPRECATED_MODIFIER.registerFactory(ReplaceModifierFix) REDUNDANT_MODIFIER_FOR_TARGET.registerFactory(removeModifierFactory) WRONG_MODIFIER_CONTAINING_DECLARATION.registerFactory(removeModifierFactory) diff --git a/idea/testData/quickfix/typeOfAnnotationMember/string.kt b/idea/testData/quickfix/typeOfAnnotationMember/string.kt index e3cf3dee40d..a20b597f95b 100644 --- a/idea/testData/quickfix/typeOfAnnotationMember/string.kt +++ b/idea/testData/quickfix/typeOfAnnotationMember/string.kt @@ -1,5 +1,6 @@ // "Replace array of boxed with array of primitive" "false" // ACTION: Put parameters on one line +// ACTION: Convert to vararg parameter (may break code) annotation class SuperAnnotation( val str: Array ) \ No newline at end of file diff --git a/idea/testData/quickfix/variables/changeMutability/canBeVal/const.kt b/idea/testData/quickfix/variables/changeMutability/canBeVal/const.kt new file mode 100644 index 00000000000..86aec666fd9 --- /dev/null +++ b/idea/testData/quickfix/variables/changeMutability/canBeVal/const.kt @@ -0,0 +1,4 @@ +// "Make variable immutable" "true" +object Test { + const var foo = "123" +} \ No newline at end of file diff --git a/idea/testData/quickfix/variables/changeMutability/canBeVal/const.kt.after b/idea/testData/quickfix/variables/changeMutability/canBeVal/const.kt.after new file mode 100644 index 00000000000..308af909133 --- /dev/null +++ b/idea/testData/quickfix/variables/changeMutability/canBeVal/const.kt.after @@ -0,0 +1,4 @@ +// "Make variable immutable" "true" +object Test { + const val foo = "123" +} \ 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 902f3f3aafb..96ae6da89cd 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -11762,6 +11762,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/variables/changeMutability/canBeVal"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("const.kt") + public void testConst() throws Exception { + runTest("idea/testData/quickfix/variables/changeMutability/canBeVal/const.kt"); + } + @TestMetadata("multiVariable.kt") public void testMultiVariable() throws Exception { runTest("idea/testData/quickfix/variables/changeMutability/canBeVal/multiVariable.kt");