diff --git a/platform/workspaceModel-ide/src/com/intellij/workspace/legacyBridge/intellij/LegacyBridgeModifiableModelCommitterService.kt b/platform/workspaceModel-ide/src/com/intellij/workspace/legacyBridge/intellij/LegacyBridgeModifiableModelCommitterService.kt index 1c4e2177b243..cd2c039f90ff 100644 --- a/platform/workspaceModel-ide/src/com/intellij/workspace/legacyBridge/intellij/LegacyBridgeModifiableModelCommitterService.kt +++ b/platform/workspaceModel-ide/src/com/intellij/workspace/legacyBridge/intellij/LegacyBridgeModifiableModelCommitterService.kt @@ -3,16 +3,25 @@ package com.intellij.workspace.legacyBridge.intellij import com.intellij.openapi.module.ModifiableModuleModel import com.intellij.openapi.roots.ModifiableRootModel import com.intellij.openapi.roots.impl.ModifiableModelCommitterService +import com.intellij.workspace.api.TypedEntityStorageBuilder +import com.intellij.workspace.ide.WorkspaceModel import org.jetbrains.annotations.ApiStatus @ApiStatus.Internal internal class LegacyBridgeModifiableModelCommitterService : ModifiableModelCommitterService { override fun multiCommit(rootModels: MutableCollection, moduleModel: ModifiableModuleModel) { - // TODO Add all diffs at once // TODO Naive impl, check for existing contact in com.intellij.openapi.module.impl.ModuleManagerImpl.commitModelWithRunnable + val diffs = mutableSetOf() for (rootModel in rootModels) { - if (rootModel.isChanged) rootModel.commit() else rootModel.dispose() + if (rootModel.isChanged) { + diffs += (rootModel as LegacyBridgeModifiableRootModel).collectChanges() ?: continue + } + else rootModel.dispose() + } + diffs += (moduleModel as LegacyBridgeModifiableModuleModel).collectChanges() + + WorkspaceModel.getInstance(moduleModel.project).updateProjectModel { + diffs.forEach(it::addDiff) } - moduleModel.commit() } } \ No newline at end of file diff --git a/platform/workspaceModel-ide/src/com/intellij/workspace/legacyBridge/intellij/LegacyBridgeModifiableModuleModel.kt b/platform/workspaceModel-ide/src/com/intellij/workspace/legacyBridge/intellij/LegacyBridgeModifiableModuleModel.kt index be04a4d998ec..764343798d75 100644 --- a/platform/workspaceModel-ide/src/com/intellij/workspace/legacyBridge/intellij/LegacyBridgeModifiableModuleModel.kt +++ b/platform/workspaceModel-ide/src/com/intellij/workspace/legacyBridge/intellij/LegacyBridgeModifiableModuleModel.kt @@ -164,6 +164,14 @@ internal class LegacyBridgeModifiableModuleModel( myNewNameToModule.isNotEmpty() override fun commit() { + val diff = collectChanges() + + WorkspaceModel.getInstance(project).updateProjectModel { + it.addDiff(diff) + } + } + + fun collectChanges(): TypedEntityStorageBuilder { ApplicationManager.getApplication().assertWriteAccessAllowed() val storage = entityStoreOnDiff.current @@ -184,9 +192,7 @@ internal class LegacyBridgeModifiableModuleModel( } } - WorkspaceModel.getInstance(project).updateProjectModel { - it.addDiff(diff) - } + return diff } override fun renameModule(module: Module, newName: String) { diff --git a/platform/workspaceModel-ide/src/com/intellij/workspace/legacyBridge/intellij/LegacyBridgeModifiableRootModel.kt b/platform/workspaceModel-ide/src/com/intellij/workspace/legacyBridge/intellij/LegacyBridgeModifiableRootModel.kt index 7ef1eb0b8ba0..0bbbaedb5e25 100644 --- a/platform/workspaceModel-ide/src/com/intellij/workspace/legacyBridge/intellij/LegacyBridgeModifiableRootModel.kt +++ b/platform/workspaceModel-ide/src/com/intellij/workspace/legacyBridge/intellij/LegacyBridgeModifiableRootModel.kt @@ -20,11 +20,9 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.util.isEmpty import com.intellij.workspace.api.* import com.intellij.workspace.ide.WorkspaceModel -import com.intellij.workspace.legacyBridge.libraries.libraries.LegacyBridgeLibrary -import com.intellij.workspace.legacyBridge.libraries.libraries.LegacyBridgeLibraryImpl -import com.intellij.workspace.legacyBridge.libraries.libraries.LegacyBridgeLibraryModifiableModelImpl -import com.intellij.workspace.legacyBridge.libraries.libraries.LegacyBridgeModifiableBase +import com.intellij.workspace.legacyBridge.libraries.libraries.* import com.intellij.workspace.legacyBridge.roots.LegacyBridgeModifiableContentEntryImpl +import com.intellij.workspace.legacyBridge.typedModel.library.LibraryViaTypedEntity import com.intellij.workspace.legacyBridge.typedModel.module.LibraryOrderEntryViaTypedEntity import com.intellij.workspace.legacyBridge.typedModel.module.OrderEntryViaTypedEntity import com.intellij.workspace.legacyBridge.typedModel.module.RootModelViaTypedEntityImpl @@ -293,9 +291,9 @@ class LegacyBridgeModifiableRootModel( } } - override fun commit() { + fun collectChanges(): TypedEntityStorageBuilder? { assertModelIsLive() - if (!isChanged) return + if (!isChanged) return null if (extensionsDelegate.isInitialized() && extensions.any { it.isChanged }) { val element = Element("component") @@ -343,6 +341,12 @@ class LegacyBridgeModifiableRootModel( disposeSkippingLibraries() + return diff + } + + override fun commit() { + val diff = collectChanges() ?: return + val moduleDiff = module.diff if (moduleDiff != null) {