From 340412cca0a945590ed5be47045d6cd1be040e16 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 21 Jan 2019 11:51:40 +0100 Subject: [PATCH] cheaper UIUtil.dispatchAllInvocationEvents avoid reflection and assertions on each event --- .../impl/DaemonRespondToChangesTest.java | 4 +- .../util/src/com/intellij/util/ui/UIUtil.java | 49 ++++++++++--------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/impl/DaemonRespondToChangesTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/impl/DaemonRespondToChangesTest.java index c291e2e57012..337f162e0e7b 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/impl/DaemonRespondToChangesTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/impl/DaemonRespondToChangesTest.java @@ -2360,14 +2360,14 @@ public class DaemonRespondToChangesTest extends DaemonAnalyzerTestCase { long deadline = System.currentTimeMillis() + 60_000; while (!daemonIsWorkingOrPending()) { if (System.currentTimeMillis() > deadline) fail("Too long waiting for daemon to start"); - UIUtil.dispatchInvocationEvent(); + PlatformTestUtil.dispatchAllInvocationEventsInIdeEventQueue(); } while (daemonIsWorkingOrPending()) { if (System.currentTimeMillis() > deadline) { dumpThreadsToConsole(); fail("Too long waiting for daemon to finish"); } - UIUtil.dispatchInvocationEvent(); + PlatformTestUtil.dispatchAllInvocationEventsInIdeEventQueue(); } } diff --git a/platform/util/src/com/intellij/util/ui/UIUtil.java b/platform/util/src/com/intellij/util/ui/UIUtil.java index ac1dac4d4f0d..367dc29881f3 100644 --- a/platform/util/src/com/intellij/util/ui/UIUtil.java +++ b/platform/util/src/com/intellij/util/ui/UIUtil.java @@ -2321,12 +2321,36 @@ public class UIUtil { g.setComposite(X_RENDER_ACTIVE.getValue() ? AlphaComposite.SrcOver : AlphaComposite.Src); } - /** @see #pump() */ + /** + * In tests, consider using {@link com.intellij.testFramework.PlatformTestUtil#dispatchAllInvocationEventsInIdeEventQueue()} + * @see #pump() + */ @TestOnly public static void dispatchAllInvocationEvents() { + assert EdtInvocationManager.getInstance().isEventDispatchThread() : Thread.currentThread() + "; EDT: "+getEventQueueThread(); + EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue(); + Method dispatchEventMethod; + try { + dispatchEventMethod = eventQueue.getClass().getDeclaredMethod("dispatchEvent", AWTEvent.class); + } + catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } for (int i = 1; ; i++) { - AWTEvent event = dispatchInvocationEvent(); + AWTEvent event = eventQueue.peekEvent(); if (event == null) break; + try { + event = eventQueue.getNextEvent(); + if (event instanceof InvocationEvent) { + dispatchEventMethod.invoke(eventQueue, event); + } + } + catch (InvocationTargetException e) { + ExceptionUtil.rethrowAllAsUnchecked(e.getCause()); + } + catch (Exception e) { + LOG.error(e); + } if (i % 10000 == 0) { //noinspection UseOfSystemOutOrSystemErr @@ -2335,27 +2359,6 @@ public class UIUtil { } } - @TestOnly - public static AWTEvent dispatchInvocationEvent() { - assert EdtInvocationManager.getInstance().isEventDispatchThread() : Thread.currentThread() + "; EDT: "+getEventQueueThread(); - final EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue(); - AWTEvent event = eventQueue.peekEvent(); - if (event == null) return null; - try { - event = eventQueue.getNextEvent(); - if (event instanceof InvocationEvent) { - eventQueue.getClass().getDeclaredMethod("dispatchEvent", AWTEvent.class).invoke(eventQueue, event); - } - } - catch (InvocationTargetException e) { - ExceptionUtil.rethrowAllAsUnchecked(e.getCause()); - } - catch (Exception e) { - LOG.error(e); - } - return event; - } - private static Thread getEventQueueThread() { EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue(); try {