IJPL-233642 wrap deferred listener calls, remember original EP

GitOrigin-RevId: ea43db34b2dc41965283b6d37155523042a88cc3
This commit is contained in:
Vadim Salavatov
2026-02-06 18:14:49 +00:00
committed by intellij-monorepo-bot
parent 1aa3bba927
commit 9818fc3698
7 changed files with 38 additions and 9 deletions
@@ -0,0 +1,13 @@
// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.openapi.extensions.impl
import com.intellij.openapi.extensions.ExtensionPoint
import com.intellij.openapi.util.IntellijInternalApi
import org.jetbrains.annotations.ApiStatus
@IntellijInternalApi
@ApiStatus.Internal
class ExtensionPointDeferredListenersNotification(
val ep: ExtensionPointImpl<*>,
val notify: Runnable,
)
@@ -847,7 +847,7 @@ sealed class ExtensionPointImpl<T : Any>(@JvmField val name: String,
@Synchronized
fun registerExtensions(descriptors: List<ExtensionDescriptor>,
pluginDescriptor: PluginDescriptor,
listenerCallbacks: MutableList<in Runnable>?) {
listenerCallbacks: MutableList<ExtensionPointDeferredListenersNotification>?) {
adaptersAreSorted = false
val oldAdapters = adapters
@@ -891,7 +891,9 @@ sealed class ExtensionPointImpl<T : Any>(@JvmField val name: String,
break
}
listenerCallbacks.add { notifyListeners(isRemoved = false, adapters = addedAdapters, listeners = listeners) }
listenerCallbacks.add(ExtensionPointDeferredListenersNotification(this) {
notifyListeners(isRemoved = false, adapters = addedAdapters, listeners = listeners)
})
}
@TestOnly
@@ -133,7 +133,11 @@ class ExtensionsAreaImpl(private val componentManager: ComponentManager) : Exten
}
}
fun registerExtensions(extensions: Map<String, List<ExtensionDescriptor>>, pluginDescriptor: PluginDescriptor, listenerCallbacks: MutableList<in Runnable>?) {
fun registerExtensions(
extensions: Map<String, List<ExtensionDescriptor>>,
pluginDescriptor: PluginDescriptor,
listenerCallbacks: MutableList<ExtensionPointDeferredListenersNotification>?,
) {
for ((descriptors, point) in intersectMaps(extensions, nameToPointMap)) {
point.registerExtensions(descriptors, pluginDescriptor = pluginDescriptor, listenerCallbacks)
}
@@ -49,6 +49,7 @@ import com.intellij.openapi.extensions.ExtensionDescriptor
import com.intellij.openapi.extensions.ExtensionPointDescriptor
import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.openapi.extensions.PluginId
import com.intellij.openapi.extensions.impl.ExtensionPointDeferredListenersNotification
import com.intellij.openapi.extensions.impl.ExtensionsAreaImpl
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.keymap.impl.BundledKeymapBean
@@ -1070,7 +1071,7 @@ object DynamicPlugins {
app.messageBus.syncPublisher(DynamicPluginListener.TOPIC).beforePluginLoaded(pluginDescriptor)
app.runWriteAction {
try {
val listenerCallbacks = mutableListOf<Runnable>()
val listenerCallbacks = mutableListOf<ExtensionPointDeferredListenersNotification>()
// 4. load into service container
loadModules(modules = pluginWithContentModules, app = app, listenerCallbacks = listenerCallbacks)
@@ -1093,7 +1094,9 @@ object DynamicPlugins {
PluginManagerCore.setPluginSet(pluginSet)
listenerCallbacks.forEach(Runnable::run)
listenerCallbacks.forEach {
it.notify.run()
}
DynamicPluginsUsagesCollector.logDescriptorLoad(pluginDescriptor)
PluginManagerCore.clearPluginNonLoadReasonFor(pluginDescriptor.pluginId)
@@ -1278,7 +1281,11 @@ private fun optionalDependenciesOnPlugin(
.toSet()
}
private fun loadModules(modules: List<IdeaPluginDescriptorImpl>, app: ApplicationImpl, listenerCallbacks: MutableList<in Runnable>) {
private fun loadModules(
modules: List<IdeaPluginDescriptorImpl>,
app: ApplicationImpl,
listenerCallbacks: MutableList<ExtensionPointDeferredListenersNotification>,
) {
app.registerComponents(modules = modules, app = app, listenerCallbacks = listenerCallbacks)
for (openProject in getOpenedProjects()) {
openProject.getComponentManagerImpl().registerComponents(modules = modules, app = app, listenerCallbacks = listenerCallbacks)
@@ -7,6 +7,7 @@ import com.intellij.ide.plugins.IdeaPluginDescriptorImpl
import com.intellij.openapi.application.Application
import com.intellij.openapi.components.ServiceDescriptor
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.extensions.impl.ExtensionPointDeferredListenersNotification
import com.intellij.serviceContainer.ComponentManagerImpl
import com.intellij.serviceContainer.throwAlreadyDisposedError
import kotlinx.coroutines.CoroutineScope
@@ -64,7 +65,7 @@ abstract class ClientAwareComponentManager: ComponentManagerImpl {
final override fun registerComponents(
modules: List<IdeaPluginDescriptorImpl>,
app: Application?,
listenerCallbacks: MutableList<in Runnable>?
listenerCallbacks: MutableList<ExtensionPointDeferredListenersNotification>?
) {
super.registerComponents(modules = modules,
app = app,
@@ -15,6 +15,7 @@ import com.intellij.openapi.components.impl.stores.IComponentStore
import com.intellij.openapi.components.service
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.extensions.impl.ExtensionPointDeferredListenersNotification
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.ProjectManager
import com.intellij.openapi.project.impl.ProjectImpl
@@ -99,7 +100,7 @@ abstract class ClientSessionImpl(
final override fun registerComponents(
modules: List<IdeaPluginDescriptorImpl>,
app: Application?,
listenerCallbacks: MutableList<in Runnable>?
listenerCallbacks: MutableList<ExtensionPointDeferredListenersNotification>?
) {
for (rootModule in modules) {
registerServices(getContainerDescriptor(rootModule).services, rootModule)
@@ -25,6 +25,7 @@ import com.intellij.openapi.components.impl.stores.ComponentStoreOwner
import com.intellij.openapi.components.impl.stores.IComponentStore
import com.intellij.openapi.diagnostic.*
import com.intellij.openapi.extensions.*
import com.intellij.openapi.extensions.impl.ExtensionPointDeferredListenersNotification
import com.intellij.openapi.extensions.impl.ExtensionPointImpl
import com.intellij.openapi.extensions.impl.ExtensionsAreaImpl
import com.intellij.openapi.extensions.impl.createExtensionPoints
@@ -316,7 +317,7 @@ abstract class ComponentManagerImpl(
open fun registerComponents(
modules: List<IdeaPluginDescriptorImpl>,
app: Application?,
listenerCallbacks: MutableList<in Runnable>? = null,
listenerCallbacks: MutableList<ExtensionPointDeferredListenersNotification>? = null,
) {
val activityNamePrefix = activityNamePrefix()