inplace change signature: ensure detached/keep track of document change offset being...
authorAnna.Kozlova <anna.kozlova@jetbrains.com>
Fri, 11 Nov 2016 11:39:42 +0000 (12:39 +0100)
committerAnna.Kozlova <anna.kozlova@jetbrains.com>
Fri, 11 Nov 2016 11:46:01 +0000 (12:46 +0100)
java/java-impl/src/com/intellij/refactoring/changeSignature/JavaChangeSignatureDetector.java
platform/lang-impl/src/com/intellij/refactoring/changeSignature/inplace/InplaceChangeSignature.java
platform/lang-impl/src/com/intellij/refactoring/changeSignature/inplace/LanguageChangeSignatureDetector.java

index 4df9ba000ccf2930f2eed390eaa2d2dfa01897b2..6e4a21f3b07a94d306eb745632f22cfb2f7ae161 100644 (file)
@@ -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();
index d5c6c93f66299f3f4857478264f6f64f46939699..f6b8e172f1c982799c2df00cda7ec7c10b385baa 100644 (file)
@@ -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<Balloon>(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);
   }
index 9ff3e3e21ed7ad699e5b53a6fc7d99eb69399afa..eb76bd4d45343e1436458944134bc75ca6bc41a1 100644 (file)
@@ -33,7 +33,7 @@ public interface LanguageChangeSignatureDetector<C extends ChangeInfo> {
 
   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);