mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-10-02 10:14:57 +07:00
[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:
committed by
intellij-monorepo-bot
parent
697066076b
commit
f9ca4fbe60
@@ -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> {
|
||||
|
||||
+10
-1
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user