From 2eb7835ae1584e993e72e5f2dde493171793c89f Mon Sep 17 00:00:00 2001 From: svtk Date: Thu, 3 Nov 2011 18:30:28 +0400 Subject: [PATCH] Registered 'change variable mutability' fix for 'val reassignment' error --- .../jet/lang/diagnostics/Errors.java | 13 +++++++++++- .../quickfix/ChangeVariableMutabilityFix.java | 20 +++++++++++++++++++ .../jet/plugin/quickfix/QuickFixes.java | 1 + .../afterValReassignmentLocal.kt | 5 +++++ .../afterValReassignmentOuterDecl.kt | 6 ++++++ .../afterValReassignmentProperty.kt | 8 ++++++++ .../beforeValReassignmentLocal.kt | 5 +++++ .../beforeValReassignmentOuterDecl.kt | 6 ++++++ .../beforeValReassignmentProperty.kt | 8 ++++++++ 9 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 idea/testData/quickfix/variables/changeMutability/afterValReassignmentLocal.kt create mode 100644 idea/testData/quickfix/variables/changeMutability/afterValReassignmentOuterDecl.kt create mode 100644 idea/testData/quickfix/variables/changeMutability/afterValReassignmentProperty.kt create mode 100644 idea/testData/quickfix/variables/changeMutability/beforeValReassignmentLocal.kt create mode 100644 idea/testData/quickfix/variables/changeMutability/beforeValReassignmentOuterDecl.kt create mode 100644 idea/testData/quickfix/variables/changeMutability/beforeValReassignmentProperty.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index 11680129eb7..ca125ad1db4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -143,7 +143,18 @@ public interface Errors { PsiElementOnlyDiagnosticFactory3 VIRTUAL_MEMBER_HIDDEN = PsiElementOnlyDiagnosticFactory3.create(ERROR, "''{0}'' hides ''{1}'' in class {2} and needs 'override' modifier", DescriptorRenderer.TEXT); PsiElementOnlyDiagnosticFactory1 UNINITIALIZED_VARIABLE = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Variable ''{0}'' must be initialized", NAME); - PsiElementOnlyDiagnosticFactory1 VAL_REASSIGNMENT = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Val can not be reassigned", NAME); + PsiElementOnlyDiagnosticFactory2 VAL_REASSIGNMENT = new PsiElementOnlyDiagnosticFactory2(ERROR, "Val can not be reassigned", NAME) { + @NotNull + @Override + public DiagnosticWithPsiElement on(@NotNull JetSimpleNameExpression elementToBlame, @NotNull ASTNode nodeToMark, @NotNull DeclarationDescriptor declarationDescriptor, @NotNull JetProperty[] property) { + DiagnosticWithPsiElement diagnostic = super.on(elementToBlame, nodeToMark, declarationDescriptor, property); + if (property.length == 1) { + return diagnostic.add(DiagnosticParameters.PROPERTY, property[0]); + } + return diagnostic; + } + }; + PsiElementOnlyDiagnosticFactory1 INITIALIZATION_USING_BACKING_FIELD = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Initialization using backing field required", NAME); PsiElementOnlyDiagnosticFactory1 FUNCTION_PARAMETERS_OF_INLINE_FUNCTION = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Function parameters of inline function can only be invoked", NAME); diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeVariableMutabilityFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeVariableMutabilityFix.java index 853d9ca9272..c974d7628f6 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeVariableMutabilityFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeVariableMutabilityFix.java @@ -7,9 +7,14 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.codeStyle.CodeEditUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.diagnostics.DiagnosticParameters; +import org.jetbrains.jet.lang.diagnostics.DiagnosticWithParameters; import org.jetbrains.jet.lang.diagnostics.DiagnosticWithPsiElement; +import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.jet.lang.psi.JetProperty; import org.jetbrains.jet.lang.psi.JetPsiFactory; +import org.jetbrains.jet.lang.psi.JetSimpleNameExpression; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.plugin.JetBundle; @@ -55,6 +60,7 @@ public class ChangeVariableMutabilityFix extends JetIntentionAction public static JetIntentionActionFactory createFactory() { return new JetIntentionActionFactory() { + @Nullable @Override public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { assert diagnostic.getPsiElement() instanceof JetProperty; @@ -62,4 +68,18 @@ public class ChangeVariableMutabilityFix extends JetIntentionAction } }; } + + public static JetIntentionActionFactory createFromSimpleNameFactory() { + return new JetIntentionActionFactory() { + @Override + public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { + DiagnosticWithParameters diagnosticWithParameters = assertAndCastToDiagnosticWithParameters(diagnostic, DiagnosticParameters.PROPERTY); + JetProperty property = diagnosticWithParameters.getParameter(DiagnosticParameters.PROPERTY); + if (diagnostic.getPsiElement().getContainingFile() == property.getContainingFile()) { + return (JetIntentionAction) new ChangeVariableMutabilityFix(property); + } + return null; + } + }; + } } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java index b082ee4d1ae..356bc3237df 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java @@ -71,6 +71,7 @@ public class QuickFixes { add(Errors.VIRTUAL_MEMBER_HIDDEN, AddModifierFix.createFactory(JetTokens.OVERRIDE_KEYWORD, new JetToken[] {JetTokens.OPEN_KEYWORD})); add(Errors.VAL_WITH_SETTER, ChangeVariableMutabilityFix.createFactory()); + add(Errors.VAL_REASSIGNMENT, ChangeVariableMutabilityFix.createFromSimpleNameFactory()); add(Errors.USELESS_CAST_STATIC_ASSERT_IS_FINE, ReplaceOperationInBinaryExpressionFix.createChangeCastToStaticAssertFactory()); add(Errors.USELESS_CAST, RemoveRightPartOfBinaryExpressionFix.createRemoveCastFactory()); diff --git a/idea/testData/quickfix/variables/changeMutability/afterValReassignmentLocal.kt b/idea/testData/quickfix/variables/changeMutability/afterValReassignmentLocal.kt new file mode 100644 index 00000000000..ce989c9eca4 --- /dev/null +++ b/idea/testData/quickfix/variables/changeMutability/afterValReassignmentLocal.kt @@ -0,0 +1,5 @@ +// "Make variable mutable" "true" +fun foo() { + var a = 1 + a = 3 +} diff --git a/idea/testData/quickfix/variables/changeMutability/afterValReassignmentOuterDecl.kt b/idea/testData/quickfix/variables/changeMutability/afterValReassignmentOuterDecl.kt new file mode 100644 index 00000000000..915949f6cf5 --- /dev/null +++ b/idea/testData/quickfix/variables/changeMutability/afterValReassignmentOuterDecl.kt @@ -0,0 +1,6 @@ +// "Make variable mutable" "true" +var a = 4 + +fun bar() { + a = 5 +} diff --git a/idea/testData/quickfix/variables/changeMutability/afterValReassignmentProperty.kt b/idea/testData/quickfix/variables/changeMutability/afterValReassignmentProperty.kt new file mode 100644 index 00000000000..f8f28d3add5 --- /dev/null +++ b/idea/testData/quickfix/variables/changeMutability/afterValReassignmentProperty.kt @@ -0,0 +1,8 @@ +// "Make variable mutable" "true" +class A() { + var a = 1 + + fun foo() { + a = 5 + } +} diff --git a/idea/testData/quickfix/variables/changeMutability/beforeValReassignmentLocal.kt b/idea/testData/quickfix/variables/changeMutability/beforeValReassignmentLocal.kt new file mode 100644 index 00000000000..ffda8c49743 --- /dev/null +++ b/idea/testData/quickfix/variables/changeMutability/beforeValReassignmentLocal.kt @@ -0,0 +1,5 @@ +// "Make variable mutable" "true" +fun foo() { + val a = 1 + a = 3 +} diff --git a/idea/testData/quickfix/variables/changeMutability/beforeValReassignmentOuterDecl.kt b/idea/testData/quickfix/variables/changeMutability/beforeValReassignmentOuterDecl.kt new file mode 100644 index 00000000000..fcdd1c300a8 --- /dev/null +++ b/idea/testData/quickfix/variables/changeMutability/beforeValReassignmentOuterDecl.kt @@ -0,0 +1,6 @@ +// "Make variable mutable" "true" +val a = 4 + +fun bar() { + a = 5 +} diff --git a/idea/testData/quickfix/variables/changeMutability/beforeValReassignmentProperty.kt b/idea/testData/quickfix/variables/changeMutability/beforeValReassignmentProperty.kt new file mode 100644 index 00000000000..59988d60427 --- /dev/null +++ b/idea/testData/quickfix/variables/changeMutability/beforeValReassignmentProperty.kt @@ -0,0 +1,8 @@ +// "Make variable mutable" "true" +class A() { + val a = 1 + + fun foo() { + a = 5 + } +}