[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
This commit is contained in:
Nikolay Chashnikov
2020-12-23 16:50:54 +00:00
committed by intellij-monorepo-bot
parent 0c979af35c
commit 5bb885f0e6
4 changed files with 51 additions and 13 deletions
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/foo/foo.iml" filepath="$PROJECT_DIR$/foo/foo.iml" group="group/subGroup" />
</modules>
</component>
</project>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="EMPTY_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
@@ -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<String>?) {
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
@@ -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<JpsDirectory
}
val url = actualFileSource?.let { getActualFileUrl(it) }
val internalSource = getInternalFileSource(source)
if (url != null && internalSource != null && url !in fileSerializersByUrl.keys
&& (ModuleEntity::class.java in entities || FacetEntity::class.java in entities)) {
moduleListSerializersByUrl.values.forEach { moduleListSerializer ->
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)
}
}
}
}