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)
+ }
}
}
}