diff --git a/platform/ide-core/src/com/intellij/openapi/application/PreloadingActivity.kt b/platform/ide-core/src/com/intellij/openapi/application/PreloadingActivity.kt index 96d11695e749..d749d4def9d6 100644 --- a/platform/ide-core/src/com/intellij/openapi/application/PreloadingActivity.kt +++ b/platform/ide-core/src/com/intellij/openapi/application/PreloadingActivity.kt @@ -1,11 +1,11 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.openapi.application import com.intellij.openapi.progress.ProgressIndicator import com.intellij.openapi.progress.blockingContext import org.jetbrains.annotations.ApiStatus.Internal -@Deprecated("Do not use") +@Deprecated("Use ApplicationInitializedListener (asyncScope)") @Internal abstract class PreloadingActivity { open fun preload() {} diff --git a/platform/platform-impl/src/com/intellij/platform/ide/bootstrap/appServicePreloading.kt b/platform/platform-impl/src/com/intellij/platform/ide/bootstrap/appServicePreloading.kt index 1c04dfce7b6f..0cc44649d6b5 100644 --- a/platform/platform-impl/src/com/intellij/platform/ide/bootstrap/appServicePreloading.kt +++ b/platform/platform-impl/src/com/intellij/platform/ide/bootstrap/appServicePreloading.kt @@ -2,6 +2,7 @@ package com.intellij.platform.ide.bootstrap import com.intellij.diagnostic.PerformanceWatcher +import com.intellij.diagnostic.PluginException import com.intellij.history.LocalHistory import com.intellij.ide.plugins.PluginManagerCore import com.intellij.ide.util.PropertiesComponent @@ -9,6 +10,9 @@ import com.intellij.openapi.application.PathMacros import com.intellij.openapi.application.impl.ApplicationImpl import com.intellij.openapi.application.impl.RawSwingDispatcher import com.intellij.openapi.components.serviceAsync +import com.intellij.openapi.diagnostic.logger +import com.intellij.openapi.extensions.ExtensionPointName +import com.intellij.openapi.extensions.PluginDescriptor import com.intellij.openapi.fileTypes.FileTypeManager import com.intellij.openapi.projectRoots.ProjectJdkTable import com.intellij.openapi.util.registry.RegistryManager @@ -19,6 +23,7 @@ import com.intellij.platform.diagnostic.telemetry.impl.span import com.intellij.platform.util.coroutines.childScope import com.intellij.util.indexing.FileBasedIndex import kotlinx.coroutines.* +import java.util.concurrent.CancellationException fun CoroutineScope.preloadCriticalServices( app: ApplicationImpl, @@ -141,4 +146,34 @@ private fun CoroutineScope.postAppRegistered(app: ApplicationImpl, } } } + + if (!app.isHeadlessEnvironment && !app.isUnitTestMode && System.getProperty("enable.activity.preloading", "true").toBoolean()) { + asyncScope.launch(CoroutineName("preloadingActivity executing")) { + @Suppress("DEPRECATION") + val extensionPoint = app.extensionArea.getExtensionPoint("com.intellij.preloadingActivity") + @Suppress("DEPRECATION") + for (item in ExtensionPointName(extensionPoint.name).filterableLazySequence()) { + launch(CoroutineName(item.implementationClassName)) { + item.instance?.let { + executePreloadActivity(activity = it, descriptor = item.pluginDescriptor) + } + } + } + extensionPoint.reset() + } + } +} + +@Suppress("DEPRECATION") +private suspend fun executePreloadActivity(activity: com.intellij.openapi.application.PreloadingActivity, descriptor: PluginDescriptor) { + try { + activity.execute() + } + catch (e: CancellationException) { + throw e + } + catch (e: Throwable) { + logger() + .error(PluginException("cannot execute preloading activity ${activity.javaClass.name}", e, descriptor.pluginId)) + } } \ No newline at end of file