From b54d3c2a6ea108683be5eb259b4aebd126fc9b00 Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Wed, 20 Dec 2017 16:08:35 +0300 Subject: [PATCH] IDEA-183950 start visiting after processing background tasks to ensure that invalidation requests --- .../impl/AsyncProjectViewSupport.java | 28 ++++++++----------- .../StructureViewComponent.java | 3 +- .../intellij/ide/util/FileStructurePopup.java | 6 ++-- .../com/intellij/ui/tree/AsyncTreeModel.java | 15 +++++----- 4 files changed, 21 insertions(+), 31 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/AsyncProjectViewSupport.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/AsyncProjectViewSupport.java index 82319ea0c59c..226d858eb6af 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/AsyncProjectViewSupport.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/AsyncProjectViewSupport.java @@ -248,24 +248,18 @@ class AsyncProjectViewSupport { } void accept(List visitors, Consumer> consumer) { - int size = visitors == null ? 0 : visitors.size(); if (visitors != null && !visitors.isEmpty()) { - // start visiting on the background thread to ensure that root node is already invalidated - myStructureTreeModel.getInvoker().invokeLater(() -> { - if (1 == visitors.size()) { - myAsyncTreeModel.accept(visitors.get(0)).done(path -> { - if (path != null) consumer.consume(singletonList(path)); - }); - } - else if (size > 1) { - myStructureTreeModel.getInvoker().invokeLater(() -> { - List> promises = visitors.stream().map(visitor -> myAsyncTreeModel.accept(visitor)).collect(toList()); - collectResults(promises, true).done(list -> { - if (list != null && !list.isEmpty()) consumer.consume(list); - }); - }); - } - }); + if (1 == visitors.size()) { + myAsyncTreeModel.accept(visitors.get(0)).done(path -> { + if (path != null) consumer.consume(singletonList(path)); + }); + } + else { + List> promises = visitors.stream().map(visitor -> myAsyncTreeModel.accept(visitor)).collect(toList()); + collectResults(promises, true).done(list -> { + if (list != null && !list.isEmpty()) consumer.consume(list); + }); + } } } diff --git a/platform/lang-impl/src/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java b/platform/lang-impl/src/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java index 0844f7dbe129..7e7e3ccd27a3 100644 --- a/platform/lang-impl/src/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java +++ b/platform/lang-impl/src/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java @@ -744,8 +744,7 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre if (o instanceof AbstractTreeNode) ((AbstractTreeNode)o).update(); return TreeVisitor.Action.CONTINUE; }; - myStructureTreeModel.getInvoker().invokeLater(() -> - myAsyncTreeModel.accept(visitor).processed(ignore -> result.setResult(null))); + myAsyncTreeModel.accept(visitor).processed(ignore -> result.setResult(null)); return result; } diff --git a/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java b/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java index a52c4effd45e..44892ed896df 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java +++ b/platform/lang-impl/src/com/intellij/ide/util/FileStructurePopup.java @@ -493,8 +493,7 @@ public class FileStructurePopup implements Disposable, TreeActionsOwner { } } }; - myStructureTreeModel.getInvoker().invokeLaterIfNeeded( - () -> myAsyncTreeModel.accept(visitor).thenAsync(fallback).processed(result)); + myAsyncTreeModel.accept(visitor).thenAsync(fallback).processed(result); return result; } @@ -510,8 +509,7 @@ public class FileStructurePopup implements Disposable, TreeActionsOwner { if (o instanceof AbstractTreeNode) ((AbstractTreeNode)o).update(); return TreeVisitor.Action.CONTINUE; }; - rebuild(false).processed(ignore1 -> myStructureTreeModel.getInvoker().invokeLater( - () -> myAsyncTreeModel.accept(visitor).processed(ignore2 -> result.setResult(null)))); + rebuild(false).processed(ignore1 -> myAsyncTreeModel.accept(visitor).processed(ignore2 -> result.setResult(null))); return result; } diff --git a/platform/platform-impl/src/com/intellij/ui/tree/AsyncTreeModel.java b/platform/platform-impl/src/com/intellij/ui/tree/AsyncTreeModel.java index 7ec7f1175158..93734f1edb27 100644 --- a/platform/platform-impl/src/com/intellij/ui/tree/AsyncTreeModel.java +++ b/platform/platform-impl/src/com/intellij/ui/tree/AsyncTreeModel.java @@ -260,14 +260,13 @@ public final class AsyncTreeModel extends AbstractTreeModel implements Identifia return null; } }; - onValidThread(() -> { - if (allowLoading) { - promiseRootEntry().done(walker::start).rejected(walker::setError); - } - else { - walker.start(tree.root); - } - }); + if (allowLoading) { + // start visiting on the background thread to ensure that root node is already invalidated + processor.background.invokeLater(() -> onValidThread(() -> promiseRootEntry().done(walker::start).rejected(walker::setError))); + } + else { + onValidThread(() -> walker.start(tree.root)); + } return walker.promise(); }