From d76b7a109f1bd4f6fc2619da471566598ab6a88c Mon Sep 17 00:00:00 2001 From: Piotr Tomiak Date: Fri, 9 Jan 2026 15:31:04 +0100 Subject: [PATCH] WEB-76271 PolySymbols/tests: fix problems with caching in KeyedExtensionCollector - cache should not be used if extension point listener is not registered - allow adding a new listener once an area is replaced - always notify that area is replaced. GitOrigin-RevId: 3d91be0598bc11a2cc193a764195a814d5be738c --- .../com/intellij/openapi/util/KeyedExtensionCollector.java | 3 +++ .../src/com/intellij/openapi/extensions/Extensions.java | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/platform/core-api/src/com/intellij/openapi/util/KeyedExtensionCollector.java b/platform/core-api/src/com/intellij/openapi/util/KeyedExtensionCollector.java index f87ad5f35af0..cb211cdd0741 100644 --- a/platform/core-api/src/com/intellij/openapi/util/KeyedExtensionCollector.java +++ b/platform/core-api/src/com/intellij/openapi/util/KeyedExtensionCollector.java @@ -111,6 +111,8 @@ public class KeyedExtensionCollector implements ModificationTracker { cached = buildExtensions(stringKey, key); + if (!myEpListenerAdded.get()) return cached; + synchronized (lock) { List recent = cache.get(stringKey); if (recent != null) { @@ -296,6 +298,7 @@ public class KeyedExtensionCollector implements ModificationTracker { public void areaReplaced(@NotNull ExtensionsArea area) { synchronized (lock) { cache = Java11Shim.INSTANCE.mapOf(); + myEpListenerAdded.set(false); tracker.incModificationCount(); } } diff --git a/platform/extensions/src/com/intellij/openapi/extensions/Extensions.java b/platform/extensions/src/com/intellij/openapi/extensions/Extensions.java index c0fc2f1d2659..f98a7693acd4 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/Extensions.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/Extensions.java @@ -37,6 +37,9 @@ public final class Extensions { public static void setRootArea(@NotNull ExtensionsAreaImpl area, @NotNull Disposable parentDisposable) { ExtensionsAreaImpl oldRootArea = staticRootArea; staticRootArea = area; + if (oldRootArea != null) { + oldRootArea.notifyAreaReplaced(area); + } Disposer.register(parentDisposable, () -> { staticRootArea.notifyAreaReplaced(oldRootArea); staticRootArea = oldRootArea; @@ -51,7 +54,8 @@ public final class Extensions { public static ExtensionsArea getRootArea() { if (rootSupplier != null) { return rootSupplier.get(); - } else { + } + else { return staticRootArea; } }