diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableMutabilityFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableMutabilityFix.kt index 2fc8021f867..bab6881c8d9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableMutabilityFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVariableMutabilityFix.kt @@ -22,26 +22,31 @@ import com.intellij.openapi.project.Project import com.intellij.psi.PsiFile import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Errors -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.KtProperty -import org.jetbrains.kotlin.psi.KtPropertyAccessor -import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils -public class ChangeVariableMutabilityFix(element: KtProperty, private val makeVar: Boolean) : KotlinQuickFixAction(element) { +public class ChangeVariableMutabilityFix(element: KtNamedDeclaration, private val makeVar: Boolean) : KotlinQuickFixAction(element) { override fun getText() = if (makeVar) "Make variable mutable" else "Make variable immutable" override fun getFamilyName(): String = getText() override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean { - return element.isVar() != makeVar + return when (element) { + is KtProperty -> element.isVar != makeVar + is KtParameter -> (element.valOrVarKeyword == KtTokens.VAR_KEYWORD) != makeVar + else -> false + } } override fun invoke(project: Project, editor: Editor?, file: KtFile) { val factory = KtPsiFactory(project) val newKeyword = if (makeVar) factory.createVarKeyword() else factory.createValKeyword() - element.getValOrVarKeyword().replace(newKeyword) + when (element) { + is KtProperty -> element.valOrVarKeyword.replace(newKeyword) + is KtParameter -> element.valOrVarKeyword!!.replace(newKeyword) + } } companion object { @@ -56,14 +61,18 @@ public class ChangeVariableMutabilityFix(element: KtProperty, private val makeVa public val VAL_REASSIGNMENT_FACTORY: KotlinSingleIntentionActionFactory = object: KotlinSingleIntentionActionFactory() { override fun createAction(diagnostic: Diagnostic): IntentionAction? { val propertyDescriptor = Errors.VAL_REASSIGNMENT.cast(diagnostic).getA() - val declaration = DescriptorToSourceUtils.descriptorToDeclaration(propertyDescriptor) as? KtProperty ?: return null + val declaration = DescriptorToSourceUtils.descriptorToDeclaration(propertyDescriptor) as? KtNamedDeclaration ?: return null return ChangeVariableMutabilityFix(declaration, true) } } public val VAR_OVERRIDDEN_BY_VAL_FACTORY: KotlinSingleIntentionActionFactory = object: KotlinSingleIntentionActionFactory() { override fun createAction(diagnostic: Diagnostic): IntentionAction? { - return ChangeVariableMutabilityFix(diagnostic.getPsiElement() as KtProperty, true) + val element = diagnostic.psiElement + return when (element) { + is KtProperty, is KtParameter -> ChangeVariableMutabilityFix(element as KtNamedDeclaration, true) + else -> null + } } } } diff --git a/idea/testData/quickfix/variables/changeMutability/valOverrideVarConstructorParameter.kt b/idea/testData/quickfix/variables/changeMutability/valOverrideVarConstructorParameter.kt new file mode 100644 index 00000000000..91246e33d4f --- /dev/null +++ b/idea/testData/quickfix/variables/changeMutability/valOverrideVarConstructorParameter.kt @@ -0,0 +1,6 @@ +// "Make variable mutable" "true" +open class A { + open var x = 42; +} + +class B(override val x: Int) : A() \ 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 new file mode 100644 index 00000000000..f56adb015c7 --- /dev/null +++ b/idea/testData/quickfix/variables/changeMutability/valOverrideVarConstructorParameter.kt.after @@ -0,0 +1,6 @@ +// "Make variable mutable" "true" +open class A { + open var x = 42; +} + +class B(override var x: Int) : A() \ No newline at end of file diff --git a/idea/testData/quickfix/variables/changeMutability/valReassignmentPropertyConstructorParameter.kt b/idea/testData/quickfix/variables/changeMutability/valReassignmentPropertyConstructorParameter.kt new file mode 100644 index 00000000000..866d642f52c --- /dev/null +++ b/idea/testData/quickfix/variables/changeMutability/valReassignmentPropertyConstructorParameter.kt @@ -0,0 +1,6 @@ +// "Make variable mutable" "true" +class A(val a: Int) { + fun foo() { + a = 5 + } +} diff --git a/idea/testData/quickfix/variables/changeMutability/valReassignmentPropertyConstructorParameter.kt.after b/idea/testData/quickfix/variables/changeMutability/valReassignmentPropertyConstructorParameter.kt.after new file mode 100644 index 00000000000..33e426938fd --- /dev/null +++ b/idea/testData/quickfix/variables/changeMutability/valReassignmentPropertyConstructorParameter.kt.after @@ -0,0 +1,6 @@ +// "Make variable mutable" "true" +class A(var a: Int) { + fun foo() { + a = 5 + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index a5392a0ac9e..1cfb3c91a73 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -7310,6 +7310,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("valOverrideVarConstructorParameter.kt") + public void testValOverrideVarConstructorParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/variables/changeMutability/valOverrideVarConstructorParameter.kt"); + doTest(fileName); + } + @TestMetadata("valReassignmentLocal.kt") public void testValReassignmentLocal() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/variables/changeMutability/valReassignmentLocal.kt"); @@ -7328,6 +7334,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("valReassignmentPropertyConstructorParameter.kt") + public void testValReassignmentPropertyConstructorParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/variables/changeMutability/valReassignmentPropertyConstructorParameter.kt"); + doTest(fileName); + } + @TestMetadata("valWithSetter.kt") public void testValWithSetter() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/variables/changeMutability/valWithSetter.kt");