From 29b96470b44ba002cf3bfb9a80913df710cfa026 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Fri, 11 Nov 2016 12:39:42 +0100 Subject: [PATCH] inplace change signature: ensure detached/keep track of document change offset being invalidated by consequence changes --- .../JavaChangeSignatureDetector.java | 2 +- .../inplace/InplaceChangeSignature.java | 13 ++++++------- .../inplace/LanguageChangeSignatureDetector.java | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) 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 4df9ba000ccf..6e4a21f3b07a 100644 --- a/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureDetector.java +++ b/java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureDetector.java @@ -42,7 +42,7 @@ public class JavaChangeSignatureDetector implements LanguageChangeSignatureDetec } @Override - public boolean isChangeSignatureAvailableOnElement(PsiElement element, DetectedJavaChangeInfo currentInfo) { + public boolean isChangeSignatureAvailableOnElement(@NotNull PsiElement element, DetectedJavaChangeInfo currentInfo) { final PsiMethod method = currentInfo.getMethod(); TextRange range = method.getTextRange(); PsiCodeBlock body = method.getBody(); diff --git a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/inplace/InplaceChangeSignature.java b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/inplace/InplaceChangeSignature.java index d5c6c93f6629..f6b8e172f1c9 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/inplace/InplaceChangeSignature.java +++ b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/inplace/InplaceChangeSignature.java @@ -19,10 +19,7 @@ import com.intellij.codeInsight.highlighting.HighlightManager; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.command.impl.FinishMarkAction; import com.intellij.openapi.command.impl.StartMarkAction; -import com.intellij.openapi.editor.Document; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.ScrollType; -import com.intellij.openapi.editor.VisualPosition; +import com.intellij.openapi.editor.*; import com.intellij.openapi.editor.colors.EditorColors; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.event.DocumentEvent; @@ -136,6 +133,7 @@ public class InplaceChangeSignature implements DocumentListener { @Override public void documentChanged(DocumentEvent event) { + RangeMarker marker = event.getDocument().createRangeMarker(event.getOffset(), event.getOffset()); myDocumentManager.performWhenAllCommitted(() -> { if (myDetector == null) { return; @@ -144,8 +142,9 @@ public class InplaceChangeSignature implements DocumentListener { if (file == null) { return; } - PsiElement element = file.findElementAt(event.getOffset()); - if (myDetector.ignoreChanges(element)) return; + PsiElement element = file.findElementAt(marker.getStartOffset()); + marker.dispose(); + if (element == null || myDetector.ignoreChanges(element)) return; if (element instanceof PsiWhiteSpace) { PsiElement method = myStableChange.getMethod(); @@ -177,7 +176,6 @@ public class InplaceChangeSignature implements DocumentListener { final BalloonBuilder balloonBuilder = JBPopupFactory.getInstance().createDialogBalloonBuilder(checkBox, null).setSmallVariant(true); myBalloon = balloonBuilder.createBalloon(); myEditor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE); - final JBPopupFactory popupFactory = JBPopupFactory.getInstance(); myBalloon.show(new PositionTracker(myEditor.getContentComponent()) { @Override public RelativePoint recalculateLocation(Balloon object) { @@ -197,6 +195,7 @@ public class InplaceChangeSignature implements DocumentListener { } myHighlighters.clear(); myBalloon.hide(); + myDetector = null; FinishMarkAction.finish(myProject, myEditor, myMarkAction); myEditor.putUserData(INPLACE_CHANGE_SIGNATURE, null); } diff --git a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/inplace/LanguageChangeSignatureDetector.java b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/inplace/LanguageChangeSignatureDetector.java index 9ff3e3e21ed7..eb76bd4d4534 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/changeSignature/inplace/LanguageChangeSignatureDetector.java +++ b/platform/lang-impl/src/com/intellij/refactoring/changeSignature/inplace/LanguageChangeSignatureDetector.java @@ -33,7 +33,7 @@ public interface LanguageChangeSignatureDetector { void performChange(C changeInfo, @NotNull String oldText); - boolean isChangeSignatureAvailableOnElement(PsiElement element, C currentInfo); + boolean isChangeSignatureAvailableOnElement(@NotNull PsiElement element, C currentInfo); TextRange getHighlightingRange(@NotNull C changeInfo);