[Workspace Model] Perform multicommit as a one change

GitOrigin-RevId: 15dde20aef72a9ffc3a71e8fcd8a3901b426a269
This commit is contained in:
Alex Plate
2020-01-30 11:36:57 +00:00
committed by intellij-monorepo-bot
parent 9f65cf8164
commit f1df512064
3 changed files with 31 additions and 12 deletions
@@ -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<out ModifiableRootModel>, 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<TypedEntityStorageBuilder>()
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()
}
}
@@ -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) {
@@ -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) {