From 46f6b33e988546f652fc93155cffb6d077d7a1ca Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 15 May 2018 17:18:37 +0300 Subject: [PATCH] interruptibility when doing "analyze from here" has to perform huge find usages and the user starts typing, to fix IDEA-191450 Idea hangs trying to investigate data flow from a `project` parameter of PsiBuilderImpl --- .../src/com/intellij/slicer/SliceNode.java | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/slicer/SliceNode.java b/platform/lang-impl/src/com/intellij/slicer/SliceNode.java index acc4d6f646cf..86fd6389f0f8 100644 --- a/platform/lang-impl/src/com/intellij/slicer/SliceNode.java +++ b/platform/lang-impl/src/com/intellij/slicer/SliceNode.java @@ -17,8 +17,8 @@ package com.intellij.slicer; import com.intellij.ide.projectView.PresentationData; import com.intellij.ide.util.treeView.AbstractTreeNode; -import com.intellij.ide.util.treeView.AbstractTreeUi; import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.application.ex.ApplicationManagerEx; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; @@ -101,23 +101,20 @@ public class SliceNode extends AbstractTreeNode implements Duplicate } private List doGetChildren() { - return AbstractTreeUi.calculateYieldingToWriteAction(() -> { - final List children = new ArrayList<>(); - final ProgressIndicator progress = ProgressManager.getInstance().getProgressIndicator(); - Processor processor = sliceUsage -> { - progress.checkCanceled(); - SliceNode node = new SliceNode(myProject, sliceUsage, targetEqualUsages); - synchronized (children) { - node.index = children.size(); - children.add(node); - } - return true; - }; + final List children = new ArrayList<>(); + final ProgressIndicator progress = ProgressManager.getInstance().getProgressIndicator(); + Processor processor = sliceUsage -> { + progress.checkCanceled(); + SliceNode node = new SliceNode(myProject, sliceUsage, targetEqualUsages); + synchronized (children) { + node.index = children.size(); + children.add(node); + } + return true; + }; - getValue().processChildren(processor); - - return children; - }); + ApplicationManagerEx.getApplicationEx().executeByImpatientReader(() -> getValue().processChildren(processor)); + return children; } SliceNode getNext(List parentChildren) {