diff --git a/platform/platform-impl/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectModelSynchronizer.kt b/platform/platform-impl/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectModelSynchronizer.kt index eab70133906d..e05c4e97b137 100644 --- a/platform/platform-impl/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectModelSynchronizer.kt +++ b/platform/platform-impl/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectModelSynchronizer.kt @@ -191,7 +191,8 @@ class JpsProjectModelSynchronizer(private val project: Project) : Disposable { val tmpBuilder = WorkspaceEntityStorageBuilder.create() val unloaded = unloadedModulePaths.map { modulePath -> - serializers.findModuleSerializer(modulePath)!!.loadEntities(tmpBuilder, fileContentReader, errorReporter, virtualFileManager) + serializers.findModuleSerializer(modulePath)!!.loadEntities(tmpBuilder, fileContentReader, errorReporter, virtualFileManager, + HashMap()) val moduleEntity = tmpBuilder.resolve(ModuleId(modulePath.moduleName)) ?: return@map null val pointerManager = VirtualFilePointerManager.getInstance() diff --git a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/ExternalModuleImlFileEntitiesSerializer.kt b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/ExternalModuleImlFileEntitiesSerializer.kt index 188e2051fd9c..328e5bd8160b 100644 --- a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/ExternalModuleImlFileEntitiesSerializer.kt +++ b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/ExternalModuleImlFileEntitiesSerializer.kt @@ -29,7 +29,8 @@ internal class ExternalModuleImlFileEntitiesSerializer(modulePath: ModulePath, override fun loadEntities(builder: WorkspaceEntityStorageBuilder, reader: JpsFileContentReader, errorReporter: ErrorReporter, - virtualFileManager: VirtualFileUrlManager) { + virtualFileManager: VirtualFileUrlManager, + entitiesTrack: MutableMap) { } override fun acceptsSource(entitySource: EntitySource): Boolean { diff --git a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsArtifactEntitiesSerializer.kt b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsArtifactEntitiesSerializer.kt index 9b2ff5d59c91..ce87c0e9d5f9 100644 --- a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsArtifactEntitiesSerializer.kt +++ b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsArtifactEntitiesSerializer.kt @@ -76,7 +76,8 @@ internal open class JpsArtifactEntitiesSerializer(override val fileUrl: VirtualF override fun loadEntities(builder: WorkspaceEntityStorageBuilder, reader: JpsFileContentReader, errorReporter: ErrorReporter, - virtualFileManager: VirtualFileUrlManager) { + virtualFileManager: VirtualFileUrlManager, + entitiesTrack: MutableMap) { val artifactListElement = reader.loadComponent(fileUrl.url, ARTIFACT_MANAGER_COMPONENT_NAME) if (artifactListElement == null) return diff --git a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsLibraryEntitiesSerializer.kt b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsLibraryEntitiesSerializer.kt index b34df0db6373..67c68b770eae 100644 --- a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsLibraryEntitiesSerializer.kt +++ b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsLibraryEntitiesSerializer.kt @@ -77,7 +77,10 @@ internal open class JpsLibraryEntitiesSerializer(override val fileUrl: VirtualFi get() = LibraryEntity::class.java override fun loadEntities(builder: WorkspaceEntityStorageBuilder, - reader: JpsFileContentReader, errorReporter: ErrorReporter, virtualFileManager: VirtualFileUrlManager) { + reader: JpsFileContentReader, + errorReporter: ErrorReporter, + virtualFileManager: VirtualFileUrlManager, + entitiesTrack: MutableMap) { val libraryTableTag = reader.loadComponent(fileUrl.url, LIBRARY_TABLE_COMPONENT_NAME) ?: return for (libraryTag in libraryTableTag.getChildren(LIBRARY_TAG)) { val source = createEntitySource(libraryTag) ?: continue @@ -90,11 +93,14 @@ internal open class JpsLibraryEntitiesSerializer(override val fileUrl: VirtualFi |Entity with this library id already exists. |Library id: $libraryId |fileUrl: ${fileUrl.presentableUrl} + |Previous file url: ${entitiesTrack[libraryId]} |library table id: $libraryTableId |internal entity source: $internalEntitySource """.trimMargin()) } + entitiesTrack[libraryId] = fileUrl.presentableUrl + loadLibrary(name, libraryTag, libraryTableId, builder, source, virtualFileManager) } } diff --git a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectEntitiesLoader.kt b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectEntitiesLoader.kt index 73569b88099e..359d76adfd98 100644 --- a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectEntitiesLoader.kt +++ b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectEntitiesLoader.kt @@ -59,7 +59,7 @@ object JpsProjectEntitiesLoader { val reader = CachingJpsFileContentReader(configLocation.baseDirectoryUrlString) val serializer = ModuleListSerializerImpl.createModuleEntitiesSerializer(moduleFile.toVirtualFileUrl(virtualFileManager), null, source, virtualFileManager) - serializer.loadEntities(builder, reader, errorReporter, virtualFileManager) + serializer.loadEntities(builder, reader, errorReporter, virtualFileManager, HashMap()) } private fun createProjectEntitiesSerializers(configLocation: JpsProjectConfigLocation, diff --git a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectSerializersImpl.kt b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectSerializersImpl.kt index 70d236b61844..d4cd49e85443 100644 --- a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectSerializersImpl.kt +++ b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/JpsProjectSerializersImpl.kt @@ -186,8 +186,9 @@ class JpsProjectSerializersImpl(directorySerializersFactories: List() affectedFileLoaders.forEach { - it.loadEntities(builder, reader, errorReporter, virtualFileManager) + it.loadEntities(builder, reader, errorReporter, virtualFileManager, entitiesTrack) } return Pair(changedSources, builder) } @@ -198,7 +199,7 @@ class JpsProjectSerializersImpl(directorySerializersFactories: List Callable { val myBuilder = WorkspaceEntityStorageBuilder.create() - serializer.loadEntities(myBuilder, reader, errorReporter, virtualFileManager) + serializer.loadEntities(myBuilder, reader, errorReporter, virtualFileManager, HashMap()) myBuilder } } diff --git a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/ModuleImlFileEntitiesSerializer.kt b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/ModuleImlFileEntitiesSerializer.kt index 18b306e11834..a7ca94658dd2 100644 --- a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/ModuleImlFileEntitiesSerializer.kt +++ b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/ModuleImlFileEntitiesSerializer.kt @@ -36,7 +36,6 @@ import java.nio.file.Paths import java.util.* import kotlin.Comparator import kotlin.collections.ArrayList -import kotlin.collections.HashMap private const val MODULE_ROOT_MANAGER_COMPONENT_NAME = "NewModuleRootManager" private const val URL_ATTRIBUTE = "url" @@ -64,7 +63,10 @@ internal open class ModuleImlFileEntitiesSerializer(internal val modulePath: Mod override fun hashCode() = modulePath.hashCode() override fun loadEntities(builder: WorkspaceEntityStorageBuilder, - reader: JpsFileContentReader, errorReporter: ErrorReporter, virtualFileManager: VirtualFileUrlManager) { + reader: JpsFileContentReader, + errorReporter: ErrorReporter, + virtualFileManager: VirtualFileUrlManager, + entitiesTrack: MutableMap) { val externalStorageEnabled = externalStorageConfigurationManager?.isEnabled ?: false if (!externalStorageEnabled) { val moduleEntity = loadModuleEntity(reader, builder, errorReporter, virtualFileManager) diff --git a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/jpsFormatEntitiesSerialization.kt b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/jpsFormatEntitiesSerialization.kt index f137189cf58d..e6d4934ba905 100644 --- a/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/jpsFormatEntitiesSerialization.kt +++ b/platform/workspaceModel/ide/src/com/intellij/workspaceModel/ide/impl/jps/serialization/jpsFormatEntitiesSerialization.kt @@ -4,10 +4,13 @@ package com.intellij.workspaceModel.ide.impl.jps.serialization import com.intellij.openapi.components.ExpandMacroToPathMap import com.intellij.openapi.components.PathMacroMap import com.intellij.openapi.module.impl.ModulePath -import com.intellij.workspaceModel.storage.bridgeEntities.ModuleEntity import com.intellij.workspaceModel.ide.JpsFileEntitySource import com.intellij.workspaceModel.ide.JpsProjectConfigLocation -import com.intellij.workspaceModel.storage.* +import com.intellij.workspaceModel.storage.EntitySource +import com.intellij.workspaceModel.storage.WorkspaceEntity +import com.intellij.workspaceModel.storage.WorkspaceEntityStorage +import com.intellij.workspaceModel.storage.WorkspaceEntityStorageBuilder +import com.intellij.workspaceModel.storage.bridgeEntities.ModuleEntity import com.intellij.workspaceModel.storage.url.VirtualFileUrl import com.intellij.workspaceModel.storage.url.VirtualFileUrlManager import org.jdom.Element @@ -34,8 +37,13 @@ interface JpsFileEntitiesSerializer { val internalEntitySource: JpsFileEntitySource val fileUrl: VirtualFileUrl val mainEntityClass: Class + + /** + * TODO: 02.11.2020 [entitiesTrack] is a temporal solution to find the root cause of IDEA-246753. It should be removed after the fix. + */ fun loadEntities(builder: WorkspaceEntityStorageBuilder, reader: JpsFileContentReader, errorReporter: ErrorReporter, - virtualFileManager: VirtualFileUrlManager) + virtualFileManager: VirtualFileUrlManager, + entitiesTrack: MutableMap) fun saveEntities(mainEntities: Collection, entities: Map, List>, storage: WorkspaceEntityStorage,