From 4c2b0b9444c15badf503868bf3c7aa711470e1cb Mon Sep 17 00:00:00 2001 From: svtk Date: Fri, 25 Nov 2011 15:15:51 +0400 Subject: [PATCH] some quick fixes refactoring --- .../jet/lang/diagnostics/Errors.java | 14 +--- .../quickfix/ChangeVariableMutabilityFix.java | 80 +++++++++++-------- .../jet/plugin/quickfix/QuickFixes.java | 7 +- 3 files changed, 53 insertions(+), 48 deletions(-) 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 98f7f7d5d69..742245b2263 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -144,7 +144,7 @@ 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 UNUSED_VARIABLE = PsiElementOnlyDiagnosticFactory1.create(WARNING, "Variable ''{0}'' is never used", NAME); + PsiElementOnlyDiagnosticFactory1 UNUSED_VARIABLE = PsiElementOnlyDiagnosticFactory1.create(WARNING, "Variable ''{0}'' is never used", NAME); PsiElementOnlyDiagnosticFactory2 UNUSED_VALUE = new PsiElementOnlyDiagnosticFactory2(WARNING, "The value ''{0}'' assigned to ''{1}'' is never used", NAME) { @Override protected String makeMessageForA(@NotNull JetElement element) { @@ -158,17 +158,7 @@ public interface Errors { } }; - PsiElementOnlyDiagnosticFactory2 VAL_REASSIGNMENT = new PsiElementOnlyDiagnosticFactory2(ERROR, "Val can not be reassigned", NAME) { - @NotNull - @Override - public DiagnosticWithPsiElement on(@NotNull JetExpression 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 VAL_REASSIGNMENT = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Val can not be reassigned", NAME); SimplePsiElementOnlyDiagnosticFactory VARIABLE_EXPECTED = new SimplePsiElementOnlyDiagnosticFactory(ERROR, "Variable expected"); PsiElementOnlyDiagnosticFactory1 INITIALIZATION_USING_BACKING_FIELD = PsiElementOnlyDiagnosticFactory1.create(ERROR, "Initialization using backing field required", NAME); diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeVariableMutabilityFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeVariableMutabilityFix.java index ace862bb542..23a01d37acf 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeVariableMutabilityFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/ChangeVariableMutabilityFix.java @@ -1,21 +1,25 @@ package org.jetbrains.jet.plugin.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 com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.codeStyle.CodeEditUtil; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.descriptors.VariableDescriptor; import org.jetbrains.jet.lang.diagnostics.DiagnosticParameter; 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.lang.psi.*; +import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.BindingContextUtils; +import org.jetbrains.jet.lang.resolve.java.AnalyzerFacade; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.plugin.JetBundle; @@ -24,15 +28,21 @@ import java.util.Arrays; /** * @author svtk */ -public class ChangeVariableMutabilityFix extends JetIntentionAction { - public ChangeVariableMutabilityFix(@NotNull JetProperty element) { - super(element); +public class ChangeVariableMutabilityFix implements IntentionAction { + private boolean isVar; + + public ChangeVariableMutabilityFix(boolean isVar) { + this.isVar = isVar; } + public ChangeVariableMutabilityFix() { + this(false); + } + @NotNull @Override public String getText() { - return element.isVar() ? JetBundle.message("make.variable.immutable") : JetBundle.message("make.variable.mutable"); + return isVar ? JetBundle.message("make.variable.immutable") : JetBundle.message("make.variable.mutable"); } @NotNull @@ -41,8 +51,34 @@ public class ChangeVariableMutabilityFix extends JetIntentionAction return JetBundle.message("change.variable.mutability.family"); } + @Override + public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { + if (!(file instanceof JetFile)) return false; + JetProperty property = getCorrespondingProperty(editor, (JetFile) file); + return property != null && !property.isVar(); + } + + private static JetProperty getCorrespondingProperty(Editor editor, JetFile file) { + final PsiElement elementAtCaret = file.findElementAt(editor.getCaretModel().getOffset()); + JetProperty property = PsiTreeUtil.getParentOfType(elementAtCaret, JetProperty.class); + if (property != null) return property; + JetSimpleNameExpression simpleNameExpression = PsiTreeUtil.getParentOfType(elementAtCaret, JetSimpleNameExpression.class); + if (simpleNameExpression != null) { + BindingContext bindingContext = AnalyzerFacade.analyzeFileWithCache(file, AnalyzerFacade.SINGLE_DECLARATION_PROVIDER); + VariableDescriptor descriptor = BindingContextUtils.extractVariableDescriptorIfAny(bindingContext, simpleNameExpression, true); + if (descriptor != null) { + PsiElement declaration = bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, descriptor); + if (declaration instanceof JetProperty) { + return (JetProperty) declaration; + } + } + } + return null; + } + @Override public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + JetProperty element = getCorrespondingProperty(editor, (JetFile)file); JetProperty newElement = (JetProperty) element.copy(); if (newElement.isVar()) { PsiElement varElement = newElement.getNode().findChildByType(JetTokens.VAR_KEYWORD).getPsi(); @@ -61,30 +97,8 @@ public class ChangeVariableMutabilityFix extends JetIntentionAction element.replace(newElement); } - public static JetIntentionActionFactory createFactory() { - return new JetIntentionActionFactory() { - @Nullable - @Override - public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { - assert diagnostic.getPsiElement() instanceof JetProperty; - return new ChangeVariableMutabilityFix((JetProperty) diagnostic.getPsiElement()); - } - }; - } - - public static JetIntentionActionFactory createFromSimpleNameFactory() { - return new JetIntentionActionFactory() { - @Override - public JetIntentionAction createAction(DiagnosticWithPsiElement diagnostic) { - if (diagnostic instanceof DiagnosticWithParameters) { - 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; - } - }; + @Override + public boolean startInWriteAction() { + return true; } } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java index 8c816241a4c..3a98d0803ac 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixes.java @@ -78,9 +78,6 @@ public class QuickFixes { add(Errors.NOTHING_TO_OVERRIDE, RemoveModifierFix.createRemoveModifierFromListFactory(JetTokens.OVERRIDE_KEYWORD)); 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()); @@ -120,5 +117,9 @@ public class QuickFixes { ImplementMethodsHandler implementMethodsHandler = new ImplementMethodsHandler(); actionMap.put(Errors.ABSTRACT_MEMBER_NOT_IMPLEMENTED, implementMethodsHandler); actionMap.put(Errors.MANY_IMPL_MEMBER_NOT_IMPLEMENTED, implementMethodsHandler); + + ChangeVariableMutabilityFix changeVariableMutabilityFix = new ChangeVariableMutabilityFix(); + actionMap.put(Errors.VAL_WITH_SETTER, changeVariableMutabilityFix); + actionMap.put(Errors.VAL_REASSIGNMENT, changeVariableMutabilityFix); } } \ No newline at end of file