From 231999e1da75156cffa285dd5889faa2b2090f93 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Mon, 1 Apr 2024 17:29:48 +0900 Subject: [PATCH] [kotlin] Add quickfix for VOLATILE_ON_VALUE to change property to 'var' ^KTIJ-29263 Fixed closes https://github.com/JetBrains/intellij-community/pull/2732 GitOrigin-RevId: 256660744ba207d04cbbf2ab769a7e8697184450 --- .../k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt | 1 + .../fixes/HighLevelQuickFixTestGenerated.java | 10 ++++++++++ .../impl/base/quickFix/ChangeVariableMutabilityFix.kt | 8 ++++++++ .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 2 ++ .../kotlin/idea/quickfix/K1QuickFixTestGenerated.java | 10 ++++++++++ .../variables/changeMutability/volatileOnValue.kt | 9 +++++++++ .../changeMutability/volatileOnValue.kt.after | 9 +++++++++ .../variables/changeMutability/volatileOnValueLocal.kt | 9 +++++++++ 8 files changed, 58 insertions(+) create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/variables/changeMutability/volatileOnValue.kt create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/variables/changeMutability/volatileOnValue.kt.after create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/variables/changeMutability/volatileOnValueLocal.kt diff --git a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt index f48a12991a20..df4b264d4c19 100644 --- a/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt +++ b/plugins/kotlin/code-insight/fixes-k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/KotlinK2QuickFixRegistrar.kt @@ -168,6 +168,7 @@ class KotlinK2QuickFixRegistrar : KotlinQuickFixRegistrar() { KtFirDiagnostic.MustBeInitializedOrFinalOrAbstractWarning::class, ChangeVariableMutabilityFix.MUST_BE_INITIALIZED_FACTORY ) + registerPsiQuickFixes(KtFirDiagnostic.VolatileOnValue::class, ChangeVariableMutabilityFix.VOLATILE_ON_VALUE_FACTORY) } private val expressions = KtQuickFixesListBuilder.registerPsiQuickFix { diff --git a/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java b/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java index 5be100316114..8b47760caecb 100644 --- a/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java +++ b/plugins/kotlin/code-insight/fixes-k2/tests/test/org/jetbrains/kotlin/idea/k2/codeinsight/fixes/HighLevelQuickFixTestGenerated.java @@ -2908,6 +2908,16 @@ public abstract class HighLevelQuickFixTestGenerated extends AbstractHighLevelQu public void testVarAnnotationParameter() throws Exception { runTest("../../../idea/tests/testData/quickfix/variables/changeMutability/varAnnotationParameter.kt"); } + + @TestMetadata("volatileOnValue.kt") + public void testVolatileOnValue() throws Exception { + runTest("../../../idea/tests/testData/quickfix/variables/changeMutability/volatileOnValue.kt"); + } + + @TestMetadata("volatileOnValueLocal.kt") + public void testVolatileOnValueLocal() throws Exception { + runTest("../../../idea/tests/testData/quickfix/variables/changeMutability/volatileOnValueLocal.kt"); + } } @RunWith(JUnit3RunnerWithInners.class) diff --git a/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/codeinsights/impl/base/quickFix/ChangeVariableMutabilityFix.kt b/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/codeinsights/impl/base/quickFix/ChangeVariableMutabilityFix.kt index 1e4f60f985ee..3a81465abab2 100644 --- a/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/codeinsights/impl/base/quickFix/ChangeVariableMutabilityFix.kt +++ b/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/codeinsights/impl/base/quickFix/ChangeVariableMutabilityFix.kt @@ -109,5 +109,13 @@ class ChangeVariableMutabilityFix( if (getter.hasBlockBody() && property.typeReference == null) return@quickFixesPsiBasedFactory emptyList() listOf(ChangeVariableMutabilityFix(property, makeVar = false)) } + + val VOLATILE_ON_VALUE_FACTORY: QuickFixesPsiBasedFactory = + quickFixesPsiBasedFactory { annotationEntry: KtAnnotationEntry -> + val modifierList = annotationEntry.parent as? KtDeclarationModifierList ?: return@quickFixesPsiBasedFactory emptyList() + val property = modifierList.parent as? KtProperty ?: return@quickFixesPsiBasedFactory emptyList() + if (!property.isWritable || property.isLocal) return@quickFixesPsiBasedFactory emptyList() + listOf(ChangeVariableMutabilityFix(property, makeVar = true)) + } } } \ No newline at end of file diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 2622483eff82..cd16f1b93d38 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -799,5 +799,7 @@ class QuickFixRegistrar : QuickFixContributor { NON_DATA_CLASS_JVM_RECORD.registerFactory(AddModifierFixFE10.createFactory(DATA_KEYWORD)) RETURN_IN_FUNCTION_WITH_EXPRESSION_BODY.registerFactory(ConvertToBlockBodyFixFactory) + + VOLATILE_ON_VALUE.registerFactory(ChangeVariableMutabilityFix.VOLATILE_ON_VALUE_FACTORY) } } diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/K1QuickFixTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/K1QuickFixTestGenerated.java index 79d0cd000382..6c9f4530c264 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/K1QuickFixTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/K1QuickFixTestGenerated.java @@ -17640,6 +17640,16 @@ public abstract class K1QuickFixTestGenerated extends AbstractK1QuickFixTest { public void testVarAnnotationParameter() throws Exception { runTest("testData/quickfix/variables/changeMutability/varAnnotationParameter.kt"); } + + @TestMetadata("volatileOnValue.kt") + public void testVolatileOnValue() throws Exception { + runTest("testData/quickfix/variables/changeMutability/volatileOnValue.kt"); + } + + @TestMetadata("volatileOnValueLocal.kt") + public void testVolatileOnValueLocal() throws Exception { + runTest("testData/quickfix/variables/changeMutability/volatileOnValueLocal.kt"); + } } } diff --git a/plugins/kotlin/idea/tests/testData/quickfix/variables/changeMutability/volatileOnValue.kt b/plugins/kotlin/idea/tests/testData/quickfix/variables/changeMutability/volatileOnValue.kt new file mode 100644 index 000000000000..c058fb9a0d6d --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/variables/changeMutability/volatileOnValue.kt @@ -0,0 +1,9 @@ +// "Change to 'var'" "true" +// WITH_STDLIB +class Foo { + @Volatile + val bar: String = "" +} + +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.codeinsights.impl.base.quickFix.ChangeVariableMutabilityFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.codeinsights.impl.base.quickFix.ChangeVariableMutabilityFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/variables/changeMutability/volatileOnValue.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/variables/changeMutability/volatileOnValue.kt.after new file mode 100644 index 000000000000..b6855c3540c5 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/variables/changeMutability/volatileOnValue.kt.after @@ -0,0 +1,9 @@ +// "Change to 'var'" "true" +// WITH_STDLIB +class Foo { + @Volatile + var bar: String = "" +} + +// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.codeinsights.impl.base.quickFix.ChangeVariableMutabilityFix +// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.codeinsights.impl.base.quickFix.ChangeVariableMutabilityFix \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/variables/changeMutability/volatileOnValueLocal.kt b/plugins/kotlin/idea/tests/testData/quickfix/variables/changeMutability/volatileOnValueLocal.kt new file mode 100644 index 000000000000..4a8ff0259f9e --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/variables/changeMutability/volatileOnValueLocal.kt @@ -0,0 +1,9 @@ +// "Change to 'var'" "false" +// ERROR: This annotation is not applicable to target 'local variable' +// WITH_STDLIB +class Foo { + fun foo() { + @Volatile + val bar: String = "" + } +}