From 5bb885f0e6f2fa1b204f26e66be87b6e051a784a Mon Sep 17 00:00:00 2001 From: Nikolay Chashnikov Date: Tue, 22 Dec 2020 12:41:07 +0300 Subject: [PATCH] [workspace model] save changes in module groups to modules.xml file (IDEA-257045) Module groups are saved in .idea/modules.xml so we need to run the corresponding serializer if module groups are changed for some module. GitOrigin-RevId: 856be00ee4d586efac29cfa6c93cb025324ad0db --- .../module-in-sub-group/.idea/modules.xml | 8 +++++ .../module-in-sub-group/foo/foo.iml | 7 +++++ .../configurationStore/SaveProjectTest.kt | 20 +++++++++---- .../JpsProjectSerializersImpl.kt | 29 ++++++++++++++----- 4 files changed, 51 insertions(+), 13 deletions(-) create mode 100644 java/java-tests/testData/configurationStore/module-in-sub-group/.idea/modules.xml create mode 100644 java/java-tests/testData/configurationStore/module-in-sub-group/foo/foo.iml diff --git a/java/java-tests/testData/configurationStore/module-in-sub-group/.idea/modules.xml b/java/java-tests/testData/configurationStore/module-in-sub-group/.idea/modules.xml new file mode 100644 index 000000000000..0aba3e2aca56 --- /dev/null +++ b/java/java-tests/testData/configurationStore/module-in-sub-group/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testData/configurationStore/module-in-sub-group/foo/foo.iml b/java/java-tests/testData/configurationStore/module-in-sub-group/foo/foo.iml new file mode 100644 index 000000000000..70ec6cce375a --- /dev/null +++ b/java/java-tests/testData/configurationStore/module-in-sub-group/foo/foo.iml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/configurationStore/SaveProjectTest.kt b/java/java-tests/testSrc/com/intellij/java/configurationStore/SaveProjectTest.kt index b1c49e75cfc2..bac5a2f411c5 100644 --- a/java/java-tests/testSrc/com/intellij/java/configurationStore/SaveProjectTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/configurationStore/SaveProjectTest.kt @@ -10,7 +10,6 @@ import com.intellij.testFramework.rules.ProjectModelRule import com.intellij.util.io.assertMatches import com.intellij.util.io.directoryContentOf import com.intellij.util.io.systemIndependentPath -import kotlinx.coroutines.runBlocking import org.junit.ClassRule import org.junit.Rule import org.junit.Test @@ -41,14 +40,25 @@ class SaveProjectTest { @Test fun `save module with group`() { val module = projectModel.createModule("foo") - runWriteActionAndWait { - val model = projectModel.moduleManager.modifiableModel - model.setModuleGroupPath(module, arrayOf("group")) - model.commit() + fun setGroupPath(path: Array?) { + runWriteActionAndWait { + val model = projectModel.moduleManager.modifiableModel + model.setModuleGroupPath(module, path) + model.commit() + } } + setGroupPath(arrayOf("group")) projectModel.saveProjectState() projectModel.baseProjectDir.root.assertMatches(directoryContentOf(configurationStoreTestDataRoot.resolve("module-in-group"))) + + setGroupPath(arrayOf("group", "subGroup")) + projectModel.saveProjectState() + projectModel.baseProjectDir.root.assertMatches(directoryContentOf(configurationStoreTestDataRoot.resolve("module-in-sub-group"))) + + setGroupPath(null) + projectModel.saveProjectState() + projectModel.baseProjectDir.root.assertMatches(directoryContentOf(configurationStoreTestDataRoot.resolve("single-module"))) } @Test 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 e4a550c91e6a..16152dddf4da 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 @@ -23,6 +23,7 @@ import com.intellij.workspaceModel.storage.WorkspaceEntityStorage import com.intellij.workspaceModel.storage.WorkspaceEntityStorageBuilder import com.intellij.workspaceModel.storage.bridgeEntities.FacetEntity import com.intellij.workspaceModel.storage.bridgeEntities.ModuleEntity +import com.intellij.workspaceModel.storage.bridgeEntities.ModuleGroupPathEntity import com.intellij.workspaceModel.storage.url.VirtualFileUrl import com.intellij.workspaceModel.storage.url.VirtualFileUrlManager import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap @@ -396,14 +397,26 @@ class JpsProjectSerializersImpl(directorySerializersFactories: List - if (moduleListSerializer.entitySourceFilter(source)) { - val newSerializer = moduleListSerializer.createSerializer(internalSource, virtualFileManager.fromUrl(url), null) - fileSerializersByUrl.put(url, newSerializer) - moduleSerializers[newSerializer] = moduleListSerializer - affectedFileFactories.add(moduleListSerializer) + if (url != null && internalSource != null + && (ModuleEntity::class.java in entities || FacetEntity::class.java in entities || ModuleGroupPathEntity::class.java in entities)) { + val existingSerializers = fileSerializersByUrl.getValues(url) + val moduleGroup = (entities[ModuleGroupPathEntity::class.java]?.first() as? ModuleGroupPathEntity)?.path?.joinToString("/") + if (existingSerializers.isEmpty() || existingSerializers.any { it is ModuleImlFileEntitiesSerializer && it.modulePath.group != moduleGroup }) { + moduleListSerializersByUrl.values.forEach { moduleListSerializer -> + if (moduleListSerializer.entitySourceFilter(source)) { + if (existingSerializers.isNotEmpty()) { + existingSerializers.forEach { + if (it is ModuleImlFileEntitiesSerializer) { + moduleSerializers.remove(it) + fileSerializersByUrl.remove(url, it) + } + } + } + val newSerializer = moduleListSerializer.createSerializer(internalSource, virtualFileManager.fromUrl(url), moduleGroup) + fileSerializersByUrl.put(url, newSerializer) + moduleSerializers[newSerializer] = moduleListSerializer + affectedFileFactories.add(moduleListSerializer) + } } } }