diff --git a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureDetector.java b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureDetector.java
index 27e9f1e5f3b1..92995c8fd09d 100644
--- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureDetector.java
+++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureDetector.java
@@ -44,7 +44,6 @@ public class JavaChangeSignatureDetector implements LanguageChangeSignatureDetec
@Override
public ChangeInfo createCurrentChangeSignature(final @NotNull PsiElement element,
final @Nullable ChangeInfo changeInfo) {
-
PsiMethod method = PsiTreeUtil.getParentOfType(element, PsiMethod.class);
if (method != null && isInsideMethodSignature(element, method.getBody())) {
final String newVisibility = VisibilityUtil.getVisibilityModifier(method.getModifierList());
@@ -204,6 +203,11 @@ public class JavaChangeSignatureDetector implements LanguageChangeSignatureDetec
return null;
}
+ @Override
+ public boolean wasBanned(PsiElement element, @NotNull ChangeInfo bannedInfo) {
+ return Comparing.equal(PsiTreeUtil.getParentOfType(element, PsiMethod.class), bannedInfo.getMethod());
+ }
+
private static boolean isInsideMethodSignature(PsiElement element, PsiCodeBlock body) {
return body == null || element.getTextOffset() < body.getTextOffset();
}
diff --git a/platform/lang-impl/src/com/intellij/codeInsight/highlighting/EscapeHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/highlighting/EscapeHandler.java
index 547a608e9783..d62e438a6351 100644
--- a/platform/lang-impl/src/com/intellij/codeInsight/highlighting/EscapeHandler.java
+++ b/platform/lang-impl/src/com/intellij/codeInsight/highlighting/EscapeHandler.java
@@ -16,6 +16,8 @@
package com.intellij.codeInsight.highlighting;
+import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
+import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.markup.RangeHighlighter;
@@ -25,6 +27,8 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.wm.WindowManager;
import com.intellij.find.FindManager;
import com.intellij.find.FindModel;
+import com.intellij.psi.PsiFile;
+import com.intellij.refactoring.changeSignature.ChangeSignatureGestureDetector;
import java.util.Map;
@@ -39,19 +43,29 @@ public class EscapeHandler extends EditorActionHandler {
Project project = PlatformDataKeys.PROJECT.getData(dataContext);
editor.setHeaderComponent(null);
- if (project != null && ((HighlightManagerImpl)HighlightManager.getInstance(project)).hideHighlights(editor, HighlightManager.HIDE_BY_ESCAPE |
- HighlightManager .HIDE_BY_ANY_KEY)) {
- WindowManager.getInstance().getStatusBar(project).setInfo(""); //??
- FindManager findManager = FindManager.getInstance(project);
- FindModel model = findManager.getFindNextModel(editor);
- if (model != null) {
- model.setSearchHighlighters(false);
- findManager.setFindNextModel(model);
+ if (project != null) {
+ if (((HighlightManagerImpl)HighlightManager.getInstance(project)).hideHighlights(editor, HighlightManager.HIDE_BY_ESCAPE |
+ HighlightManager.HIDE_BY_ANY_KEY)) {
+ WindowManager.getInstance().getStatusBar(project).setInfo(""); //??
+ FindManager findManager = FindManager.getInstance(project);
+ FindModel model = findManager.getFindNextModel(editor);
+ if (model != null) {
+ model.setSearchHighlighters(false);
+ findManager.setFindNextModel(model);
+ }
+ return;
+ }
+ else {
+ final PsiFile file = LangDataKeys.PSI_FILE.getData(dataContext);
+ final ChangeSignatureGestureDetector detector = ChangeSignatureGestureDetector.getInstance(project);
+ if (file != null && detector.containsChangeSignatureChange(file)) {
+ detector.clearSignatureChange(file);
+ DaemonCodeAnalyzer.getInstance(project).restart();
+ return;
+ }
}
}
- else{
- myOriginalHandler.execute(editor, dataContext);
- }
+ myOriginalHandler.execute(editor, dataContext);
}
public boolean isEnabled(Editor editor, DataContext dataContext) {
@@ -70,6 +84,10 @@ public class EscapeHandler extends EditorActionHandler {
}
}
}
+ final PsiFile file = LangDataKeys.PSI_FILE.getData(dataContext);
+ if (file != null && ChangeSignatureGestureDetector.getInstance(project).containsChangeSignatureChange(file)) {
+ return true;
+ }
}
return myOriginalHandler.isEnabled(editor, dataContext);
diff --git a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureDetector.java b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureDetector.java
index 0432e1fe55ac..f4c76779cf22 100644
--- a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureDetector.java
+++ b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureDetector.java
@@ -58,6 +58,11 @@ public class ChangeSignatureGestureDetector extends PsiTreeChangeAdapter impleme
return false;
}
+ public boolean containsChangeSignatureChange(@NotNull PsiFile file) {
+ final MyDocumentChangeAdapter adapter = myListenerMap.get(file);
+ return adapter != null && adapter.getCurrentInfo() != null;
+ }
+
public void changeSignature(PsiFile file) {
try {
myDeaf = true;
@@ -137,9 +142,19 @@ public class ChangeSignatureGestureDetector extends PsiTreeChangeAdapter impleme
}
}
+ public void clearSignatureChange(PsiFile file) {
+ final MyDocumentChangeAdapter adapter = myListenerMap.get(file);
+ if (adapter != null) {
+ adapter.setBannedChangeInfo(adapter.getCurrentInfo());
+ adapter.setCurrentInfo(null);
+ adapter.setInitialText(null);
+ }
+ }
+
private class MyDocumentChangeAdapter extends DocumentAdapter {
private String myInitialText;
private ChangeInfo myCurrentInfo;
+ private ChangeInfo myBannedChangeInfo;
public void setCurrentInfo(ChangeInfo currentInfo) {
myCurrentInfo = currentInfo;
@@ -168,6 +183,8 @@ public class ChangeSignatureGestureDetector extends PsiTreeChangeAdapter impleme
if (file != null) {
final PsiElement element = file.findElementAt(e.getOffset());
if (element != null) {
+ if (myBannedChangeInfo != null && LanguageChangeSignatureDetectors.wasBanned(element, myBannedChangeInfo)) return;
+ myBannedChangeInfo = null;
final ChangeInfo info = LanguageChangeSignatureDetectors.createCurrentChangeInfo(element, myCurrentInfo);
if (info != null) {
myInitialText = document.getText();
@@ -178,6 +195,10 @@ public class ChangeSignatureGestureDetector extends PsiTreeChangeAdapter impleme
}
}
}
+
+ public void setBannedChangeInfo(ChangeInfo bannedChangeInfo) {
+ myBannedChangeInfo = bannedChangeInfo;
+ }
}
}
diff --git a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureVisistor.java b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureVisitor.java
similarity index 96%
rename from platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureVisistor.java
rename to platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureVisitor.java
index 66f033af4d92..85e654498eb0 100644
--- a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureVisistor.java
+++ b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/ChangeSignatureGestureVisitor.java
@@ -36,7 +36,7 @@ import java.awt.*;
* User: anna
* Date: Sep 8, 2010
*/
-public class ChangeSignatureGestureVisistor implements HighlightVisitor {
+public class ChangeSignatureGestureVisitor implements HighlightVisitor {
private static final Logger LOG = Logger.getInstance("#" + ChangeSignatureGestureDetector.class.getName());
@NonNls private static final String SIGNATURE_SHOULD_BE_POSSIBLY_CHANGED = "Signature should be possibly changed";
@@ -68,7 +68,7 @@ public class ChangeSignatureGestureVisistor implements HighlightVisitor {
@Override
public HighlightVisitor clone() {
- return new ChangeSignatureGestureVisistor();
+ return new ChangeSignatureGestureVisitor();
}
@Override
diff --git a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/EditorEscapeHandler.java b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/EditorEscapeHandler.java
new file mode 100644
index 000000000000..b80fd7591366
--- /dev/null
+++ b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/EditorEscapeHandler.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2000-2010 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.refactoring.changeSignature;
+
+import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer;
+import com.intellij.openapi.actionSystem.DataContext;
+import com.intellij.openapi.actionSystem.LangDataKeys;
+import com.intellij.openapi.actionSystem.PlatformDataKeys;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiFile;
+
+/**
+ * User: anna
+ * Date: Sep 9, 2010
+ */
+public class EditorEscapeHandler extends EditorActionHandler {
+ private final EditorActionHandler myOriginalHandler;
+
+ public EditorEscapeHandler(EditorActionHandler originalHandler) {
+ myOriginalHandler = originalHandler;
+ }
+
+ @Override
+ public void execute(Editor editor, DataContext dataContext) {
+ final Project project = PlatformDataKeys.PROJECT.getData(dataContext);
+ final PsiFile file = LangDataKeys.PSI_FILE.getData(dataContext);
+ final ChangeSignatureGestureDetector detector = ChangeSignatureGestureDetector.getInstance(project);
+ if (file != null && detector.containsChangeSignatureChange(file)) {
+ detector.clearSignatureChange(file);
+ DaemonCodeAnalyzer.getInstance(project).restart();
+ }
+ else {
+ myOriginalHandler.execute(editor, dataContext);
+ }
+ }
+
+ @Override
+ public boolean isEnabled(Editor editor, DataContext dataContext) {
+ final Project project = PlatformDataKeys.PROJECT.getData(dataContext);
+ if (project != null) {
+ final PsiFile file = LangDataKeys.PSI_FILE.getData(dataContext);
+ if (file != null && ChangeSignatureGestureDetector.getInstance(project).containsChangeSignatureChange(file)) {
+ return true;
+ }
+ }
+ return myOriginalHandler.isEnabled(editor, dataContext);
+ }
+}
diff --git a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/LanguageChangeSignatureDetector.java b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/LanguageChangeSignatureDetector.java
index 3084336b0947..58f8cd5f4829 100644
--- a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/LanguageChangeSignatureDetector.java
+++ b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/LanguageChangeSignatureDetector.java
@@ -37,4 +37,6 @@ public interface LanguageChangeSignatureDetector {
@Nullable
TextRange getHighlightingRange(PsiElement element);
+
+ boolean wasBanned(PsiElement element, @NotNull ChangeInfo bannedInfo);
}
diff --git a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/LanguageChangeSignatureDetectors.java b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/LanguageChangeSignatureDetectors.java
index 757f18d54a37..3e6fa220e3ca 100644
--- a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/LanguageChangeSignatureDetectors.java
+++ b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/LanguageChangeSignatureDetectors.java
@@ -47,4 +47,9 @@ class LanguageChangeSignatureDetectors extends LanguageExtension
-
+
+