[Workspace Model] [IJPL-583] Hide addEntity function that automatically copies and adds entities

GitOrigin-RevId: bea2eff41b7c2b80f9a5861ead5043420f2f63ba
This commit is contained in:
Alex Plate
2024-03-25 13:27:42 +00:00
committed by intellij-monorepo-bot
parent 341f1672cc
commit ca8622cf86
10 changed files with 29 additions and 18 deletions
@@ -19,6 +19,8 @@ import com.intellij.platform.workspace.jps.entities.ModuleEntity
import com.intellij.platform.workspace.jps.entities.ModuleId
import com.intellij.platform.workspace.storage.EntityStorage
import com.intellij.platform.workspace.storage.MutableEntityStorage
import com.intellij.platform.workspace.storage.instrumentation.EntityStorageInstrumentationApi
import com.intellij.platform.workspace.storage.instrumentation.MutableEntityStorageInstrumentation
import com.intellij.util.xmlb.annotations.XCollection
import com.intellij.workspaceModel.ide.impl.legacyBridge.module.getModuleLevelLibraries
import com.intellij.xml.util.XmlStringUtil
@@ -31,6 +33,7 @@ import kotlinx.coroutines.launch
@State(name = "AutomaticModuleUnloader", storages = [(Storage(StoragePathMacros.WORKSPACE_FILE))])
internal class AutomaticModuleUnloaderImpl(private val project: Project) : SimplePersistentStateComponent<LoadedModulesListStorage>(LoadedModulesListStorage()),
AutomaticModuleUnloader {
@OptIn(EntityStorageInstrumentationApi::class)
override fun calculateNewModules(currentModules: Set<String>, builder: MutableEntityStorage, unloadedEntityBuilder: MutableEntityStorage): Pair<List<String>, List<String>> {
val defaultResult = Pair(emptyList<String>(), emptyList<String>())
@@ -78,7 +81,7 @@ internal class AutomaticModuleUnloaderImpl(private val project: Project) : Simpl
val moduleEntitiesToAdd = snapshot.entities(ModuleEntity::class.java).filter { it.name in toUnloadSet }.toList()
val moduleEntitiesToRemove = builder.entities(ModuleEntity::class.java).filter { it.name in toUnloadSet }.toList()
for (moduleEntity in moduleEntitiesToAdd) {
unloadedEntityBuilder.addEntity(moduleEntity)
(unloadedEntityBuilder as MutableEntityStorageInstrumentation).addEntity(moduleEntity)
moduleEntity.getModuleLevelLibraries(snapshot).forEach { libraryEntity ->
unloadedEntityBuilder.addEntity(libraryEntity)
}
@@ -35,6 +35,8 @@ import com.intellij.platform.workspace.jps.JpsProjectFileEntitySource
import com.intellij.platform.workspace.jps.entities.*
import com.intellij.platform.workspace.jps.serialization.impl.ModulePath
import com.intellij.platform.workspace.storage.*
import com.intellij.platform.workspace.storage.instrumentation.EntityStorageInstrumentationApi
import com.intellij.platform.workspace.storage.instrumentation.MutableEntityStorageInstrumentation
import com.intellij.platform.workspace.storage.query.entities
import com.intellij.platform.workspace.storage.query.map
import com.intellij.platform.workspace.storage.url.VirtualFileUrl
@@ -399,6 +401,7 @@ abstract class ModuleManagerBridgeImpl(private val project: Project,
}
}
@OptIn(EntityStorageInstrumentationApi::class)
private fun addAndRemoveModules(builder: MutableEntityStorage,
entitiesToAdd: List<ModuleEntity>,
entitiesToRemove: List<ModuleEntity>,
@@ -407,7 +410,7 @@ abstract class ModuleManagerBridgeImpl(private val project: Project,
builder.removeEntity(entity)
}
for (entity in entitiesToAdd) {
builder.addEntity(entity)
(builder as MutableEntityStorageInstrumentation).addEntity(entity)
entity.getModuleLevelLibraries(storageContainingEntitiesToAdd).forEach { libraryEntity ->
builder.addEntity(libraryEntity)
}
@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.platform.workspace.jps.serialization.impl
import com.intellij.openapi.diagnostic.logger
@@ -35,7 +35,7 @@ internal class ExternalModuleImlFileEntitiesSerializer(modulePath: ModulePath,
override fun loadEntities(reader: JpsFileContentReader,
errorReporter: ErrorReporter,
virtualFileManager: VirtualFileUrlManager): LoadingResult<Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity>>> {
virtualFileManager: VirtualFileUrlManager): LoadingResult<Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity.Builder<out WorkspaceEntity>>>> {
return LoadingResult(emptyMap(), null)
}
@@ -154,7 +154,7 @@ internal open class JpsArtifactEntitiesSerializer(override val fileUrl: VirtualF
reader: JpsFileContentReader,
errorReporter: ErrorReporter,
virtualFileManager: VirtualFileUrlManager
): LoadingResult<Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity>>> = loadEntitiesTimeMs.addMeasuredTime {
): LoadingResult<Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity.Builder<out WorkspaceEntity>>>> = loadEntitiesTimeMs.addMeasuredTime {
val artifactListElement = runCatchingXmlIssues { reader.loadComponent(fileUrl.url, ARTIFACT_MANAGER_COMPONENT_NAME) }
.onFailure { return@addMeasuredTime LoadingResult(emptyMap(), it) }
.getOrThrow()
@@ -200,7 +200,7 @@ internal open class JpsArtifactEntitiesSerializer(override val fileUrl: VirtualF
override fun checkAndAddToBuilder(builder: MutableEntityStorage,
orphanage: MutableEntityStorage,
newEntities: Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity>>) {
newEntities: Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity.Builder<out WorkspaceEntity>>>) {
if (preserveOrder) {
val order = newEntities[ArtifactsOrderEntity::class.java]?.singleOrNull() as? ArtifactsOrderEntity.Builder
if (order != null) {
@@ -135,7 +135,7 @@ open class JpsLibraryEntitiesSerializer(override val fileUrl: VirtualFileUrl,
reader: JpsFileContentReader,
errorReporter: ErrorReporter,
virtualFileManager: VirtualFileUrlManager
): LoadingResult<Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity>>> = loadEntitiesTimeMs.addMeasuredTime {
): LoadingResult<Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity.Builder<out WorkspaceEntity>>>> = loadEntitiesTimeMs.addMeasuredTime {
val libraryTableTag = runCatchingXmlIssues { reader.loadComponent(fileUrl.url, LIBRARY_TABLE_COMPONENT_NAME) }
.onFailure { return@addMeasuredTime LoadingResult(emptyMap(), null) }
.getOrThrow() ?: return@addMeasuredTime LoadingResult(emptyMap(), null)
@@ -159,7 +159,7 @@ open class JpsLibraryEntitiesSerializer(override val fileUrl: VirtualFileUrl,
@Suppress("UNCHECKED_CAST")
override fun checkAndAddToBuilder(builder: MutableEntityStorage,
orphanage: MutableEntityStorage,
newEntities: Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity>>) {
newEntities: Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity.Builder<out WorkspaceEntity>>>) {
val libraries = (newEntities[LibraryEntity::class.java] as? List<LibraryEntity.Builder>) ?: emptyList()
libraries.forEach {
val symbolicId = LibraryId(it.name, it.tableId)
@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.platform.workspace.jps.serialization.impl
import com.intellij.openapi.diagnostic.logger
@@ -65,8 +65,11 @@ class JpsSdkEntitySerializer(val entitySource: JpsGlobalFileEntitySource, privat
get() = SdkEntity::class.java
override fun loadEntities(reader: JpsFileContentReader, errorReporter: ErrorReporter,
virtualFileManager: VirtualFileUrlManager): LoadingResult<Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity>>> {
override fun loadEntities(
reader: JpsFileContentReader,
errorReporter: ErrorReporter,
virtualFileManager: VirtualFileUrlManager,
): LoadingResult<Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity.Builder<out WorkspaceEntity>>>> {
val sdkTag = reader.loadComponent(entitySource.file.url, SDK_TABLE_COMPONENT_NAME) ?: return LoadingResult(emptyMap(), null)
val sdkEntities = sdkTag.getChildren(ELEMENT_JDK).map { sdkElement -> loadSdkEntity(sdkElement, virtualFileManager) }
return LoadingResult(mapOf(SdkEntity::class.java to sdkEntities))
@@ -121,8 +124,9 @@ class JpsSdkEntitySerializer(val entitySource: JpsGlobalFileEntitySource, privat
return result
}
override fun checkAndAddToBuilder(builder: MutableEntityStorage, orphanage: MutableEntityStorage,
newEntities: Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity>>) {
override fun checkAndAddToBuilder(builder: MutableEntityStorage,
orphanage: MutableEntityStorage,
newEntities: Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity.Builder<out WorkspaceEntity>>>) {
newEntities.values.flatten().forEach { builder addEntity it }
}
@@ -67,7 +67,7 @@ internal open class ModuleImlFileEntitiesSerializer(internal val modulePath: Mod
reader: JpsFileContentReader,
errorReporter: ErrorReporter,
virtualFileManager: VirtualFileUrlManager
): LoadingResult<Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity>>> = loadEntitiesTimeMs.addMeasuredTime {
): LoadingResult<Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity.Builder<out WorkspaceEntity>>>> = loadEntitiesTimeMs.addMeasuredTime {
val moduleLibrariesCollector: MutableMap<LibraryId, LibraryEntity.Builder> = HashMap()
val newModuleEntity: ModuleEntity.Builder?
@@ -174,7 +174,7 @@ internal open class ModuleImlFileEntitiesSerializer(internal val modulePath: Mod
override fun checkAndAddToBuilder(builder: MutableEntityStorage,
orphanage: MutableEntityStorage,
newEntities: Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity>>) {
newEntities: Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity.Builder<out WorkspaceEntity>>>) {
val (orphans, elements) = newEntities.values.asSequence().flatten().partition { it.entitySource is OrphanageWorkerEntitySource }
@@ -53,8 +53,8 @@ interface JpsFileEntitiesSerializer<E : WorkspaceEntity> {
*/
fun loadEntities(reader: JpsFileContentReader,
errorReporter: ErrorReporter,
virtualFileManager: VirtualFileUrlManager): LoadingResult<Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity>>>
fun checkAndAddToBuilder(builder: MutableEntityStorage, orphanage: MutableEntityStorage, newEntities: Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity>>)
virtualFileManager: VirtualFileUrlManager): LoadingResult<Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity.Builder<out WorkspaceEntity>>>>
fun checkAndAddToBuilder(builder: MutableEntityStorage, orphanage: MutableEntityStorage, newEntities: Map<Class<out WorkspaceEntity>, Collection<WorkspaceEntity.Builder<out WorkspaceEntity>>>)
fun saveEntities(mainEntities: Collection<E>,
entities: Map<Class<out WorkspaceEntity>, List<WorkspaceEntity>>,
@@ -138,7 +138,6 @@ public interface MutableEntityStorage : EntityStorage {
* If any of the children exists in `this` storage, the reference to this child will be added instead of creating a new child entity.
*/
public infix fun <M: WorkspaceEntity.Builder<T>, T : WorkspaceEntity> addEntity(entity: M): T
public infix fun <T : WorkspaceEntity> addEntity(entity: T): T
/**
* Modifies the given entity [e] by passing a builder interface for it to [change].
@@ -128,6 +128,8 @@ public interface MutableEntityStorageInstrumentation : MutableEntityStorage, Ent
public fun getManyChildrenBuilders(connectionId: ConnectionId, parent: WorkspaceEntity.Builder<*>): Sequence<WorkspaceEntity.Builder<*>>
public fun getParentBuilder(connectionId: ConnectionId, child: WorkspaceEntity.Builder<*>): WorkspaceEntity.Builder<*>?
public infix fun <T : WorkspaceEntity> addEntity(entity: T): T
}
/**