From db27a4ba442b529d97f3575f0e4d40512a0eb478 Mon Sep 17 00:00:00 2001 From: Peter Gromov Date: Mon, 25 Nov 2019 12:49:56 +0100 Subject: [PATCH] DomExtenderEP: request stub index rebuild a bit later to avoid deadlock in tests because EP listeners are run under a lock, requestRebuild works synchronously and spawns threads inside which wait for the same EP lock GitOrigin-RevId: 5820c596e950409ca1abf79efb36851f0f65bbac --- .../intellij/util/xml/reflect/DomExtenderEP.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/xml/dom-impl/src/com/intellij/util/xml/reflect/DomExtenderEP.java b/xml/dom-impl/src/com/intellij/util/xml/reflect/DomExtenderEP.java index 471f516b4e5b..3d990a595966 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/reflect/DomExtenderEP.java +++ b/xml/dom-impl/src/com/intellij/util/xml/reflect/DomExtenderEP.java @@ -16,6 +16,7 @@ package com.intellij.util.xml.reflect; import com.intellij.diagnostic.PluginException; +import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.AbstractExtensionPointBean; @@ -42,17 +43,23 @@ public class DomExtenderEP extends AbstractExtensionPointBean { private static final Logger LOG = Logger.getInstance(DomExtenderEP.class); static { + Application app = ApplicationManager.getApplication(); EP_NAME.addExtensionPointListener(new ExtensionPointListener() { @Override public void extensionAdded(@NotNull DomExtenderEP extension, @NotNull PluginDescriptor pluginDescriptor) { - StubIndex.getInstance().forceRebuild(new Throwable()); + extensionsChanged(); } @Override public void extensionRemoved(@NotNull DomExtenderEP extension, @NotNull PluginDescriptor pluginDescriptor) { - StubIndex.getInstance().forceRebuild(new Throwable()); + extensionsChanged(); } - }, ApplicationManager.getApplication()); + + private void extensionsChanged() { + Throwable trace = new Throwable(); + app.invokeLater(() -> StubIndex.getInstance().forceRebuild(trace), app.getDisposed()); + } + }, app); } @Attribute("domClass")