From ac357741dedef773bba5dd7acc276ea9cb752052 Mon Sep 17 00:00:00 2001 From: Nikita Zaytsev Date: Thu, 31 Jul 2025 18:12:33 +0300 Subject: [PATCH] [rdct] IJPL-166453: Avoid getting component for local ClientId when intentionally reloading it for another ClientId If an InstanceHolder was created for a component under the local ClientId, it was returned in ComponentManagerImpl.doGetService. However, in ComponentManagerImpl.reloadPerClientState we intentionally want to get the component for another ClientId. GitOrigin-RevId: 121a95e104ef4d84e47a3b7c394680a98f9d5c58 --- platform/configuration-store-impl/src/ComponentStoreImpl.kt | 2 +- .../com/intellij/openapi/components/ComponentManager.java | 5 +++++ .../intellij/openapi/client/ClientAwareComponentManager.kt | 4 ++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/platform/configuration-store-impl/src/ComponentStoreImpl.kt b/platform/configuration-store-impl/src/ComponentStoreImpl.kt index 3817d2bcbc39..38140fd393a8 100644 --- a/platform/configuration-store-impl/src/ComponentStoreImpl.kt +++ b/platform/configuration-store-impl/src/ComponentStoreImpl.kt @@ -710,7 +710,7 @@ abstract class ComponentStoreImpl : IComponentStore { throw AssertionError("This method must be called under remote client id") } - val perClientComponent = (storageManager.componentManager ?: application).getService(componentClass) ?: return + val perClientComponent = (storageManager.componentManager ?: application).getServiceForClient(componentClass) ?: return if (perClientComponent === info.component) { LOG.error( "Failed to reload per-client component '${info.stateSpec?.name ?: componentClass.simpleName}': " + diff --git a/platform/extensions/src/com/intellij/openapi/components/ComponentManager.java b/platform/extensions/src/com/intellij/openapi/components/ComponentManager.java index 791ec95ed25e..f43c52b109c3 100644 --- a/platform/extensions/src/com/intellij/openapi/components/ComponentManager.java +++ b/platform/extensions/src/com/intellij/openapi/components/ComponentManager.java @@ -101,6 +101,11 @@ public interface ComponentManager extends UserDataHolder, Disposable, AreaInstan */ T getService(@NotNull Class serviceClass); + @ApiStatus.Internal + default T getServiceForClient(@NotNull Class serviceClass) { + return getService(serviceClass); + } + /** * Collects all services registered with matching client="..." attribute in xml. * Take a look at {@link com.intellij.openapi.client.ClientSession} diff --git a/platform/platform-impl/src/com/intellij/openapi/client/ClientAwareComponentManager.kt b/platform/platform-impl/src/com/intellij/openapi/client/ClientAwareComponentManager.kt index e8f6b969c943..f09c0b5b9fe4 100644 --- a/platform/platform-impl/src/com/intellij/openapi/client/ClientAwareComponentManager.kt +++ b/platform/platform-impl/src/com/intellij/openapi/client/ClientAwareComponentManager.kt @@ -20,6 +20,10 @@ abstract class ClientAwareComponentManager: ComponentManagerImpl { protected constructor(parentScope: CoroutineScope): super(parentScope) + override fun getServiceForClient(serviceClass: Class): T? { + return postGetService(serviceClass, createIfNeeded = true) + } + override fun getServices(serviceClass: Class, clientKind: ClientKind): List { val sessionsManager = super.getService(ClientSessionsManager::class.java)!! return sessionsManager.getSessions(clientKind).mapNotNull {