diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java index a563dd032fca..1062bd4011a6 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java @@ -250,6 +250,7 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzer implements JDOMEx if (callbackWhileWaiting != null) { callbackWhileWaiting.run(); } + myPassExecutorService.waitFor(50); UIUtil.dispatchAllInvocationEvents(); Throwable savedException = PassExecutorService.getSavedException(progress); if (savedException != null) throw savedException; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java index 6b8cfb5b8bdf..f9488aad2794 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/PassExecutorService.java @@ -47,12 +47,10 @@ import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.TestOnly; import java.util.*; -import java.util.concurrent.CancellationException; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; +import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; /** @@ -519,4 +517,21 @@ public abstract class PassExecutorService implements Disposable { public static Throwable getSavedException(DaemonProgressIndicator indicator) { return indicator.getUserData(THROWABLE_KEY); } + + @TestOnly + public void waitFor(int millis) throws Exception { + ApplicationManager.getApplication().assertIsDispatchThread(); + try { + for (Job job : mySubmittedPasses.values()) { + if (!job.isDone()) { + for (FutureTask task : ((JobImpl)job).getTasks()) { + task.get(millis, TimeUnit.MILLISECONDS); + } + } + } + } + catch (TimeoutException ignored) { + + } + } }