From 796222480451f823b1f4522546596d9908a8e6b7 Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Wed, 10 Feb 2021 08:28:42 +0000 Subject: [PATCH] FIR IDE: Add quickfix for VAR_OVERRIDDEN_BY_VAL. --- .../kotlin/generators/tests/GenerateTests.kt | 1 + .../idea/quickfix/MainKtQuickFixRegistrar.kt | 5 ++ .../HighLevelQuickFixTestGenerated.java | 73 +++++++++++++++++++ .../quickfix/ChangeVariableMutabilityFix.kt | 14 ++-- .../changeMutability/funParameter.kt | 3 +- .../changeMutability/valOverrideVar.kt | 3 +- .../changeMutability/valOverrideVar.kt.after | 3 +- .../valOverrideVarConstructorParameter.kt | 3 +- ...alOverrideVarConstructorParameter.kt.after | 3 +- 9 files changed, 96 insertions(+), 12 deletions(-) diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index a6c56fe8408..a258ba4f77e 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -1105,6 +1105,7 @@ fun main(args: Array) { val pattern = "^([\\w\\-_]+)\\.kt$" model("quickfix/modifiers", pattern = pattern, filenameStartsLowerCase = true, recursive = false) model("quickfix/override/typeMismatchOnOverride", pattern = pattern, filenameStartsLowerCase = true, recursive = false) + model("quickfix/variables/changeMutability", pattern = pattern, filenameStartsLowerCase = true, recursive = false) } testClass { diff --git a/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt b/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt index 43a79ab96c5..b8ee27b79ff 100644 --- a/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt +++ b/idea/idea-fir/src/org/jetbrains/kotlin/idea/quickfix/MainKtQuickFixRegistrar.kt @@ -10,12 +10,14 @@ import org.jetbrains.kotlin.idea.fir.api.fixes.KtQuickFixRegistrar import org.jetbrains.kotlin.idea.fir.api.fixes.KtQuickFixesList import org.jetbrains.kotlin.idea.fir.api.fixes.KtQuickFixesListBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.diagnostics.KtFirDiagnostic +import org.jetbrains.kotlin.idea.quickfix.ChangeVariableMutabilityFix.Companion.VAR_OVERRIDDEN_BY_VAL_FACTORY import org.jetbrains.kotlin.idea.quickfix.fixes.ChangeTypeQuickFix import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtModifierListOwner class MainKtQuickFixRegistrar : KtQuickFixRegistrar() { private val modifiers = KtQuickFixesListBuilder.registerPsiQuickFix { + // RemoveModifierFix registerPsiQuickFix(RemoveModifierFix.createRemoveModifierFactory(isRedundant = true)) registerPsiQuickFix(RemoveModifierFix.createRemoveModifierFactory(isRedundant = false)) registerPsiQuickFix(RemoveModifierFix.createRemoveModifierFactory(isRedundant = false)) @@ -27,6 +29,9 @@ class MainKtQuickFixRegistrar : KtQuickFixRegistrar() { isRedundant = true ) ) + + // ChangeVariableMutabilityFix + registerPsiQuickFix(VAR_OVERRIDDEN_BY_VAL_FACTORY) } private val overrides = KtQuickFixesListBuilder.registerPsiQuickFix { diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java index 7a8e975175d..8422bcc0ff0 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java +++ b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java @@ -449,4 +449,77 @@ public class HighLevelQuickFixTestGenerated extends AbstractHighLevelQuickFixTes runTest("idea/testData/quickfix/override/typeMismatchOnOverride/returnTypeMismatchOnOverrideUnitInt.kt"); } } + + @TestMetadata("idea/testData/quickfix/variables/changeMutability") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ChangeMutability extends AbstractHighLevelQuickFixTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInChangeMutability() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/quickfix/variables/changeMutability"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), null, false); + } + + @TestMetadata("capturedMemberValInitialization.kt") + public void testCapturedMemberValInitialization() throws Exception { + runTest("idea/testData/quickfix/variables/changeMutability/capturedMemberValInitialization.kt"); + } + + @TestMetadata("capturedValInitialization.kt") + public void testCapturedValInitialization() throws Exception { + runTest("idea/testData/quickfix/variables/changeMutability/capturedValInitialization.kt"); + } + + @TestMetadata("const.kt") + public void testConst() throws Exception { + runTest("idea/testData/quickfix/variables/changeMutability/const.kt"); + } + + @TestMetadata("funParameter.kt") + public void testFunParameter() throws Exception { + runTest("idea/testData/quickfix/variables/changeMutability/funParameter.kt"); + } + + @TestMetadata("localInGetter.kt") + public void testLocalInGetter() throws Exception { + runTest("idea/testData/quickfix/variables/changeMutability/localInGetter.kt"); + } + + @TestMetadata("valOverrideVar.kt") + public void testValOverrideVar() throws Exception { + runTest("idea/testData/quickfix/variables/changeMutability/valOverrideVar.kt"); + } + + @TestMetadata("valOverrideVarConstructorParameter.kt") + public void testValOverrideVarConstructorParameter() throws Exception { + runTest("idea/testData/quickfix/variables/changeMutability/valOverrideVarConstructorParameter.kt"); + } + + @TestMetadata("valReassignmentLocal.kt") + public void testValReassignmentLocal() throws Exception { + runTest("idea/testData/quickfix/variables/changeMutability/valReassignmentLocal.kt"); + } + + @TestMetadata("valReassignmentOuterDecl.kt") + public void testValReassignmentOuterDecl() throws Exception { + runTest("idea/testData/quickfix/variables/changeMutability/valReassignmentOuterDecl.kt"); + } + + @TestMetadata("valReassignmentProperty.kt") + public void testValReassignmentProperty() throws Exception { + runTest("idea/testData/quickfix/variables/changeMutability/valReassignmentProperty.kt"); + } + + @TestMetadata("valReassignmentPropertyConstructorParameter.kt") + public void testValReassignmentPropertyConstructorParameter() throws Exception { + runTest("idea/testData/quickfix/variables/changeMutability/valReassignmentPropertyConstructorParameter.kt"); + } + + @TestMetadata("valWithSetter.kt") + public void testValWithSetter() throws Exception { + runTest("idea/testData/quickfix/variables/changeMutability/valWithSetter.kt"); + } + } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableMutabilityFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableMutabilityFix.kt index fa1122c375d..44e3c7189b8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableMutabilityFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableMutabilityFix.kt @@ -19,12 +19,14 @@ package org.jetbrains.kotlin.idea.quickfix import com.intellij.codeInsight.intention.IntentionAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElement 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.idea.KotlinBundle import org.jetbrains.kotlin.idea.quickfix.createFromUsage.createCallable.CreatePropertyDelegateAccessorsActionFactory +import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType @@ -86,15 +88,13 @@ class ChangeVariableMutabilityFix( val CAPTURED_MEMBER_VAL_INITIALIZATION_FACTORY = ReassignmentActionFactory(Errors.CAPTURED_MEMBER_VAL_INITIALIZATION) - val VAR_OVERRIDDEN_BY_VAL_FACTORY: KotlinSingleIntentionActionFactory = object : KotlinSingleIntentionActionFactory() { - override fun createAction(diagnostic: Diagnostic): IntentionAction? { - val element = diagnostic.psiElement - return when (element) { - is KtProperty, is KtParameter -> ChangeVariableMutabilityFix(element as KtValVarKeywordOwner, true) - else -> null + val VAR_OVERRIDDEN_BY_VAL_FACTORY: QuickFixesPsiBasedFactory = + quickFixesPsiBasedFactory { psiElement: PsiElement -> + when (psiElement) { + is KtProperty, is KtParameter -> listOf(ChangeVariableMutabilityFix(psiElement as KtValVarKeywordOwner, true)) + else -> emptyList() } } - } val VAR_ANNOTATION_PARAMETER_FACTORY: KotlinSingleIntentionActionFactory = object : KotlinSingleIntentionActionFactory() { override fun createAction(diagnostic: Diagnostic): IntentionAction? { diff --git a/idea/testData/quickfix/variables/changeMutability/funParameter.kt b/idea/testData/quickfix/variables/changeMutability/funParameter.kt index a7304a11bed..23c0fa721c8 100644 --- a/idea/testData/quickfix/variables/changeMutability/funParameter.kt +++ b/idea/testData/quickfix/variables/changeMutability/funParameter.kt @@ -4,4 +4,5 @@ // ERROR: Val cannot be reassigned fun fun1(i: Int) { i = 2 -} \ No newline at end of file +} +/* FIR_COMPARISON */ \ No newline at end of file diff --git a/idea/testData/quickfix/variables/changeMutability/valOverrideVar.kt b/idea/testData/quickfix/variables/changeMutability/valOverrideVar.kt index a701f9af290..8d3806e7274 100644 --- a/idea/testData/quickfix/variables/changeMutability/valOverrideVar.kt +++ b/idea/testData/quickfix/variables/changeMutability/valOverrideVar.kt @@ -5,4 +5,5 @@ open class A { class B : A() { override val x: Int = 3; -} \ No newline at end of file +} +/* FIR_COMPARISON */ \ No newline at end of file diff --git a/idea/testData/quickfix/variables/changeMutability/valOverrideVar.kt.after b/idea/testData/quickfix/variables/changeMutability/valOverrideVar.kt.after index 59e2623f0a2..59f7eee5de8 100644 --- a/idea/testData/quickfix/variables/changeMutability/valOverrideVar.kt.after +++ b/idea/testData/quickfix/variables/changeMutability/valOverrideVar.kt.after @@ -5,4 +5,5 @@ open class A { class B : A() { override var x: Int = 3; -} \ No newline at end of file +} +/* FIR_COMPARISON */ \ No newline at end of file diff --git a/idea/testData/quickfix/variables/changeMutability/valOverrideVarConstructorParameter.kt b/idea/testData/quickfix/variables/changeMutability/valOverrideVarConstructorParameter.kt index 9fb43f04655..5385bf67d29 100644 --- a/idea/testData/quickfix/variables/changeMutability/valOverrideVarConstructorParameter.kt +++ b/idea/testData/quickfix/variables/changeMutability/valOverrideVarConstructorParameter.kt @@ -3,4 +3,5 @@ open class A { open var x = 42; } -class B(override val x: Int) : A() \ No newline at end of file +class B(override val x: Int) : A() +/* FIR_COMPARISON */ \ No newline at end of file diff --git a/idea/testData/quickfix/variables/changeMutability/valOverrideVarConstructorParameter.kt.after b/idea/testData/quickfix/variables/changeMutability/valOverrideVarConstructorParameter.kt.after index 177bbb302e0..0ab7e9d6500 100644 --- a/idea/testData/quickfix/variables/changeMutability/valOverrideVarConstructorParameter.kt.after +++ b/idea/testData/quickfix/variables/changeMutability/valOverrideVarConstructorParameter.kt.after @@ -3,4 +3,5 @@ open class A { open var x = 42; } -class B(override var x: Int) : A() \ No newline at end of file +class B(override var x: Int) : A() +/* FIR_COMPARISON */ \ No newline at end of file