[qodana] QD-11615 Subscribe to workspace library changes and track activity. Track workspace sync as project activity.

(cherry picked from commit a8df7bb0ba4415b82bbe3d3d5be3e5c362c90db2)

GitOrigin-RevId: 5392358fb17c361050903baf66da331e9e52d3f4
This commit is contained in:
alexey.afanasiev
2025-05-22 10:36:48 +00:00
committed by intellij-monorepo-bot
parent 697066076b
commit f9ca4fbe60
3 changed files with 35 additions and 5 deletions
@@ -10,6 +10,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.impl.libraries.LibraryEx
import com.intellij.openapi.roots.impl.libraries.LibraryTableImplUtil
import com.intellij.openapi.util.Computable
import com.intellij.platform.backend.observation.ActivityKey
import com.intellij.platform.backend.workspace.WorkspaceModel
import com.intellij.platform.workspace.jps.entities.LibraryId
import com.intellij.workspaceModel.ide.impl.legacyBridge.library.LibraryBridge
@@ -20,7 +20,10 @@ import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar
import com.intellij.openapi.startup.ProjectActivity
import com.intellij.platform.backend.observation.ActivityKey
import com.intellij.platform.backend.observation.trackActivity
import com.intellij.platform.backend.workspace.WorkspaceModel
import com.intellij.platform.backend.workspace.WorkspaceModelTopics
import com.intellij.platform.workspace.jps.entities.LibraryEntity
import com.intellij.platform.workspace.jps.entities.LibraryPropertiesEntity
import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet
import org.jetbrains.idea.maven.utils.library.RepositoryLibraryDescription
@@ -41,11 +44,15 @@ private class RepositoryLibrarySynchronizer : ProjectActivity {
override suspend fun execute(project: Project) {
if (ApplicationManager.getApplication().isHeadlessEnvironment && !CoreProgressManager.shouldKeepTasksAsynchronousInHeadlessMode()) {
project.trackActivity(LoadDependenciesActivityKey) {
val libs = collectLibrariesToSync(project)
if (!libs.isEmpty()) {
loadDependenciesSyncImpl(project, libs)}
project.serviceAsync<WorkspaceModel>().eventLog.collect { event ->
val libraryChanges = event.getChanges(LibraryEntity::class.java)
val libraryPropertiesChanges = event.getChanges(LibraryPropertiesEntity::class.java)
if (libraryChanges.isNotEmpty() || libraryPropertiesChanges.isNotEmpty()) {
loadDependenciesSync(project)
}
}
loadDependenciesSync(project)
return
}
@@ -60,6 +67,19 @@ private class RepositoryLibrarySynchronizer : ProjectActivity {
project.messageBus.connect(disposable).subscribe(WorkspaceModelTopics.CHANGED, synchronizer)
synchronizationQueue.requestAllLibrariesSynchronization()
}
/**
* Load libraries in a synchronized way.
*/
private suspend fun loadDependenciesSync(project: Project) {
project.trackActivity(LoadDependenciesActivityKey) {
val libs = collectLibrariesToSync(project)
if (!libs.isEmpty()) {
loadDependenciesSyncImpl(project, libs)
}
}
}
}
internal fun collectLibraries(project: Project, predicate: (Library) -> Boolean): Set<Library> {
@@ -5,6 +5,8 @@ import com.intellij.openapi.diagnostic.thisLogger
import com.intellij.openapi.project.Project
import com.intellij.openapi.startup.ProjectActivity
import com.intellij.openapi.startup.StartupManager
import com.intellij.platform.backend.observation.trackActivity
import com.intellij.platform.backend.observation.ActivityKey
import com.intellij.platform.backend.workspace.WorkspaceModel
import com.intellij.platform.diagnostic.telemetry.helpers.MillisecondsMeasurer
import com.intellij.platform.workspace.jps.JpsMetrics
@@ -28,8 +30,15 @@ import kotlin.system.measureTimeMillis
@ApiStatus.Internal
@VisibleForTesting
class DelayedProjectSynchronizer : ProjectActivity {
private object ProjectSynchronizerActivityKey : ActivityKey {
override val presentableName: String
get() = "sync-project-model"
}
override suspend fun execute(project: Project) {
Util.doSync(project)
project.trackActivity(ProjectSynchronizerActivityKey) {
Util.doSync(project)
}
}
object Util {