From 3fc3c1cd3502b8bc13558af9f0d8151e497cf772 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 28 Nov 2012 23:01:45 +0100 Subject: [PATCH] reject to refactor when inplace refactoring is not ended (cherry picked from commit 3fa8012435e9832dbd51fa8e67b903bbbe7dafdb) --- .../InplaceIntroduceConstantPopup.java | 6 +++ .../InplaceIntroduceFieldPopup.java | 6 +++ .../IntroduceConstantHandler.java | 4 -- .../introduceField/IntroduceFieldHandler.java | 4 -- .../InplaceIntroduceParameterPopup.java | 8 +++- .../IntroduceParameterHandler.java | 4 -- .../actions/BaseRefactoringAction.java | 7 ++++ .../inplace/AbstractInplaceIntroducer.java | 8 ---- .../rename/inplace/InplaceRefactoring.java | 39 +++++++++++++++++-- .../inplace/VariableInplaceRenamer.java | 6 +++ .../openapi/command/impl/StartMarkAction.java | 4 ++ 11 files changed, 70 insertions(+), 26 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java index 50499cfb2fda..4238c2181f0b 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java @@ -26,6 +26,7 @@ import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.codeStyle.VariableKind; import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.JavaRefactoringSettings; +import com.intellij.refactoring.RefactoringActionHandler; import com.intellij.refactoring.ui.TypeSelectorManagerImpl; import com.intellij.refactoring.util.occurrences.OccurrenceManager; import org.jetbrains.annotations.NotNull; @@ -222,6 +223,11 @@ public class InplaceIntroduceConstantPopup extends AbstractInplaceIntroduceField return super.performRefactoring(); } + @Override + protected boolean startsOnTheSameElement(RefactoringActionHandler handler, PsiElement element) { + return super.startsOnTheSameElement(handler, element) && handler instanceof IntroduceConstantHandler; + } + @Override protected void performIntroduce() { final BaseExpressionToFieldHandler.Settings settings = diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceFieldPopup.java b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceFieldPopup.java index bf690ac853f7..4c1de5e39551 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceFieldPopup.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceFieldPopup.java @@ -27,6 +27,7 @@ import com.intellij.psi.codeStyle.VariableKind; import com.intellij.psi.util.PsiExpressionTrimRenderer; import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.JavaRefactoringSettings; +import com.intellij.refactoring.RefactoringActionHandler; import com.intellij.refactoring.ui.TypeSelectorManagerImpl; import com.intellij.refactoring.util.occurrences.OccurrenceManager; import org.jetbrains.annotations.NotNull; @@ -164,6 +165,11 @@ public class InplaceIntroduceFieldPopup extends AbstractInplaceIntroduceFieldPop myIntroduceFieldPanel.saveFinalState(); } + @Override + protected boolean startsOnTheSameElement(RefactoringActionHandler handler, PsiElement element) { + return super.startsOnTheSameElement(handler, element) && handler instanceof IntroduceFieldHandler; + } + @Override protected JComponent getComponent() { myIntroduceFieldPanel.addOccurrenceListener(new ItemListener() { diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java index d51b1eaacc9e..31734bdb32e0 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceConstantHandler.java @@ -117,10 +117,6 @@ public class IntroduceConstantHandler extends BaseExpressionToFieldHandler { final AbstractInplaceIntroducer activeIntroducer = AbstractInplaceIntroducer.getActiveIntroducer(editor); if (activeIntroducer != null) { - if (!(activeIntroducer instanceof InplaceIntroduceConstantPopup) || !activeIntroducer.startsOnTheSameElement(expr, localVariable)) { - AbstractInplaceIntroducer.unableToStartWarning(project, editor, activeIntroducer); - return null; - } activeIntroducer.stopIntroduce(editor); expr = (PsiExpression)activeIntroducer.getExpr(); localVariable = (PsiLocalVariable)activeIntroducer.getLocalVariable(); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldHandler.java index 2abad90e3ef0..c16fc9fbcdd8 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/IntroduceFieldHandler.java @@ -88,10 +88,6 @@ public class IntroduceFieldHandler extends BaseExpressionToFieldHandler { String enteredName = null; boolean replaceAll = false; if (activeIntroducer != null) { - if (!(activeIntroducer instanceof InplaceIntroduceFieldPopup) || !activeIntroducer.startsOnTheSameElement(expr, localVariable)) { - AbstractInplaceIntroducer.unableToStartWarning(project, editor, activeIntroducer); - return null; - } activeIntroducer.stopIntroduce(editor); expr = (PsiExpression)activeIntroducer.getExpr(); localVariable = (PsiLocalVariable)activeIntroducer.getLocalVariable(); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/InplaceIntroduceParameterPopup.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/InplaceIntroduceParameterPopup.java index 70b5e1ab6c78..82b0c44bbe1e 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/InplaceIntroduceParameterPopup.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/InplaceIntroduceParameterPopup.java @@ -29,15 +29,14 @@ import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.codeStyle.VariableKind; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.SearchScope; import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.JavaRefactoringSettings; +import com.intellij.refactoring.RefactoringActionHandler; import com.intellij.refactoring.ui.TypeSelectorManagerImpl; import com.intellij.usageView.UsageInfo; -import com.intellij.util.ArrayUtil; import gnu.trove.TIntArrayList; import gnu.trove.TIntProcedure; import org.jetbrains.annotations.NotNull; @@ -171,6 +170,11 @@ public class InplaceIntroduceParameterPopup extends AbstractJavaInplaceIntroduce return getParameter(); } + @Override + protected boolean startsOnTheSameElement(RefactoringActionHandler handler, PsiElement element) { + return super.startsOnTheSameElement(handler, element) && handler instanceof IntroduceParameterHandler; + } + @Override protected void saveSettings(@NotNull PsiVariable psiVariable) { diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterHandler.java index 4975172ead36..eaa5afffb0c4 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterHandler.java @@ -388,10 +388,6 @@ public class IntroduceParameterHandler extends IntroduceHandlerBase { final AbstractInplaceIntroducer activeIntroducer = AbstractInplaceIntroducer.getActiveIntroducer(myEditor); if (activeIntroducer != null) { - if (!(activeIntroducer instanceof InplaceIntroduceParameterPopup) || !activeIntroducer.startsOnTheSameElement(myExpr, myLocalVar)) { - AbstractInplaceIntroducer.unableToStartWarning(myProject, myEditor, activeIntroducer); - return; - } activeIntroducer.stopIntroduce(myEditor); myExpr = (PsiExpression)activeIntroducer.getExpr(); myLocalVar = (PsiLocalVariable)activeIntroducer.getLocalVariable(); diff --git a/platform/lang-impl/src/com/intellij/refactoring/actions/BaseRefactoringAction.java b/platform/lang-impl/src/com/intellij/refactoring/actions/BaseRefactoringAction.java index f515699987bc..c7a80c8cf0d2 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/actions/BaseRefactoringAction.java +++ b/platform/lang-impl/src/com/intellij/refactoring/actions/BaseRefactoringAction.java @@ -29,6 +29,7 @@ import com.intellij.psi.*; import com.intellij.psi.util.PsiUtilBase; import com.intellij.refactoring.RefactoringActionHandler; import com.intellij.refactoring.RefactoringBundle; +import com.intellij.refactoring.rename.inplace.InplaceRefactoring; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -81,6 +82,12 @@ public abstract class BaseRefactoringAction extends AnAction { "error.wrong.caret.position.symbol.to.refactor")), RefactoringBundle.getCannotRefactorMessage(null), null); return; } + + if (!InplaceRefactoring.canStartAnotherRefactoring(editor, project, handler, elements)) { + InplaceRefactoring.unableToStartWarning(project, editor); + return; + } + IdeEventQueue.getInstance().setEventCount(eventCount); if (editor != null) { final PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument()); diff --git a/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/AbstractInplaceIntroducer.java b/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/AbstractInplaceIntroducer.java index ff0153f7cb24..8df997242610 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/AbstractInplaceIntroducer.java +++ b/platform/lang-impl/src/com/intellij/refactoring/introduce/inplace/AbstractInplaceIntroducer.java @@ -42,9 +42,7 @@ import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.rename.inplace.InplaceRefactoring; -import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.ui.DottedBorder; import com.intellij.util.ui.PositionTracker; import org.jetbrains.annotations.NotNull; @@ -617,12 +615,6 @@ public abstract class AbstractInplaceIntroducer 0){ templateState.gotoEnd(); return; } @@ -666,6 +687,16 @@ public abstract class InplaceRefactoring { return isRestart != null && isRestart; } + public static boolean canStartAnotherRefactoring(Editor editor, Project project, RefactoringActionHandler handler, PsiElement... element) { + final InplaceRefactoring inplaceRefactoring = editor != null ? editor.getUserData(INPLACE_RENAMER) : null; + return StartMarkAction.canStart(project) == null || + (inplaceRefactoring != null && element.length == 1 && inplaceRefactoring.startsOnTheSameElement(handler, element[0])); + } + + protected boolean startsOnTheSameElement(RefactoringActionHandler handler, PsiElement element) { + return getVariable() == element; + } + protected void releaseResources() { } diff --git a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenamer.java b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenamer.java index 76679b956237..9c61d84566e3 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenamer.java +++ b/platform/lang-impl/src/com/intellij/refactoring/rename/inplace/VariableInplaceRenamer.java @@ -35,6 +35,7 @@ import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.psi.util.PsiUtilCore; +import com.intellij.refactoring.RefactoringActionHandler; import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.listeners.RefactoringElementListener; import com.intellij.refactoring.rename.AutomaticRenamingDialog; @@ -85,6 +86,11 @@ public class VariableInplaceRenamer extends InplaceRefactoring { super(editor, elementToRename, project, initialName, oldName); } + @Override + protected boolean startsOnTheSameElement(RefactoringActionHandler handler, PsiElement element) { + return super.startsOnTheSameElement(handler, element) && handler instanceof VariableInplaceRenameHandler; + } + public boolean performInplaceRename() { return performInplaceRefactoring(null); } diff --git a/platform/platform-impl/src/com/intellij/openapi/command/impl/StartMarkAction.java b/platform/platform-impl/src/com/intellij/openapi/command/impl/StartMarkAction.java index 1ddd1c308aa2..c917ca0ea27c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/command/impl/StartMarkAction.java +++ b/platform/platform-impl/src/com/intellij/openapi/command/impl/StartMarkAction.java @@ -65,6 +65,10 @@ public class StartMarkAction extends BasicUndoableAction { myCommandName = commandName; } + public Document getDocument() { + return myDocument; + } + @TestOnly public static void checkCleared() { try {