From aad2d50e381a76de2c60f01e9a621e9ea73f195f Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 29 Jun 2016 20:27:42 +0300 Subject: [PATCH] explicit cancel of searching for implementations if popup closed (IDEA-158010) --- .../daemon/impl/PsiElementListNavigator.java | 3 +++ .../actions/ShowImplementationsAction.java | 23 ++++++------------- .../navigation/BackgroundUpdaterTask.java | 10 ++++++++ .../navigation/GotoTargetHandler.java | 4 ++++ 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PsiElementListNavigator.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PsiElementListNavigator.java index 023da660687d..5396c133dfc1 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PsiElementListNavigator.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PsiElementListNavigator.java @@ -144,6 +144,9 @@ public class PsiElementListNavigator { }). setCancelCallback(() -> { HintUpdateSupply.hideHint(list); + if (listUpdaterTask != null) { + return listUpdaterTask.cancelTask(); + } return true; }); final Ref usageView = new Ref(); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/hint/actions/ShowImplementationsAction.java b/platform/lang-impl/src/com/intellij/codeInsight/hint/actions/ShowImplementationsAction.java index 50ec2c8d66ac..48665d43dc44 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/hint/actions/ShowImplementationsAction.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/hint/actions/ShowImplementationsAction.java @@ -300,7 +300,9 @@ public class ShowImplementationsAction extends AnAction implements PopupAction { }) .setCancelCallback(() -> { ImplementationsUpdaterTask task = SoftReference.dereference(myTaskRef); - cancelTask(task); + if (task != null) { + task.cancelTask(); + } return Boolean.TRUE; }) .createPopup(); @@ -314,17 +316,6 @@ public class ShowImplementationsAction extends AnAction implements PopupAction { } } - private static boolean cancelTask(@Nullable ImplementationsUpdaterTask task) { - if (task != null) { - ProgressIndicator indicator = task.myIndicator; - if (indicator != null) { - indicator.cancel(); - } - return task.setCanceled(); - } - return false; - } - private void updateInBackground(Editor editor, @Nullable PsiElement element, @NotNull ImplementationViewComponent component, @@ -332,7 +323,9 @@ public class ShowImplementationsAction extends AnAction implements PopupAction { @NotNull AbstractPopup popup, @NotNull Ref usageView) { final ImplementationsUpdaterTask updaterTask = SoftReference.dereference(myTaskRef); - cancelTask(updaterTask); + if (updaterTask != null) { + updaterTask.cancelTask(); + } if (element == null) return; //already found final ImplementationsUpdaterTask task = new ImplementationsUpdaterTask(element, editor, title, isIncludeAlwaysSelf()); @@ -412,7 +405,6 @@ public class ShowImplementationsAction extends AnAction implements PopupAction { private final PsiElement myElement; private final boolean myIncludeSelf; private PsiElement[] myElements; - private volatile ProgressIndicator myIndicator; private ImplementationsUpdaterTask(@NotNull PsiElement element, final Editor editor, final String caption, boolean includeSelf) { super(element.getProject(), ImplementationSearcher.SEARCHING_FOR_IMPLEMENTATIONS); @@ -445,7 +437,6 @@ public class ShowImplementationsAction extends AnAction implements PopupAction { @Override public void run(@NotNull final ProgressIndicator indicator) { - myIndicator = indicator; super.run(indicator); final ImplementationSearcher.BackgroundableImplementationSearcher implementationSearcher = new ImplementationSearcher.BackgroundableImplementationSearcher() { @@ -477,7 +468,7 @@ public class ShowImplementationsAction extends AnAction implements PopupAction { @Override public void onSuccess() { - if (!cancelTask(this)) { + if (!cancelTask()) { myComponent.update(myElements, myComponent.getIndex()); } super.onSuccess(); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/navigation/BackgroundUpdaterTask.java b/platform/lang-impl/src/com/intellij/codeInsight/navigation/BackgroundUpdaterTask.java index d171512b0031..76b57f41fa79 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/navigation/BackgroundUpdaterTask.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/navigation/BackgroundUpdaterTask.java @@ -52,6 +52,7 @@ public abstract class BackgroundUpdaterTask extends Task.Backgroundable { private volatile boolean myCanceled; private volatile boolean myFinished; + private volatile ProgressIndicator myIndicator; public BackgroundUpdaterTask(Project project, String title, boolean canBeCancelled) { super(project, title, canBeCancelled); @@ -132,6 +133,7 @@ public abstract class BackgroundUpdaterTask extends Task.Backgroundable { @Override public void run(@NotNull ProgressIndicator indicator) { paintBusy(true); + myIndicator = indicator; } @Override @@ -148,4 +150,12 @@ public abstract class BackgroundUpdaterTask extends Task.Backgroundable { public boolean isFinished() { return myFinished; } + + public boolean cancelTask() { + ProgressIndicator indicator = myIndicator; + if (indicator != null) { + indicator.cancel(); + } + return setCanceled(); + } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoTargetHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoTargetHandler.java index 74b3c29de57e..a5b1ecf27c97 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoTargetHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/navigation/GotoTargetHandler.java @@ -182,6 +182,10 @@ public abstract class GotoTargetHandler implements CodeInsightActionHandler { setMovable(true). setCancelCallback(() -> { HintUpdateSupply.hideHint(list); + final ListBackgroundUpdaterTask task = gotoData.listUpdaterTask; + if (task != null) { + return task.cancelTask(); + } return true; }). setCouldPin(popup1 -> {