vcs: get rid of CombinedDiffModelRepository

Drop combined diff support in Space plugin.

GitOrigin-RevId: 6ddb91b164a9af38193fe206126a46bba10d1c9b
This commit is contained in:
Aleksey Pivovarov
2024-01-18 16:39:02 +01:00
committed by intellij-monorepo-bot
parent 7238b36862
commit 62228ac74c
14 changed files with 56 additions and 94 deletions

View File

@@ -3,7 +3,6 @@ package com.intellij.collaboration.file.codereview
import com.intellij.diff.editor.DiffFileType
import com.intellij.diff.editor.DiffVirtualFile
import com.intellij.diff.tools.combined.CombinedDiffModelBuilder
import com.intellij.diff.tools.combined.CombinedDiffVirtualFile
import com.intellij.ide.actions.SplitAction
import com.intellij.openapi.fileTypes.FileType
@@ -43,7 +42,6 @@ abstract class CodeReviewDiffVirtualFile(name: String)
@ApiStatus.Experimental
abstract class CodeReviewCombinedDiffVirtualFile(sourceId: String, name: String)
: CombinedDiffVirtualFile(sourceId, name),
CombinedDiffModelBuilder,
VirtualFilePathWrapper {
init {

View File

@@ -1,7 +1,9 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.diff.editor
import com.intellij.diff.tools.combined.*
import com.intellij.diff.tools.combined.CombinedDiffComponentFactoryProvider
import com.intellij.diff.tools.combined.CombinedDiffEditor
import com.intellij.diff.tools.combined.CombinedDiffVirtualFile
import com.intellij.ide.structureView.StructureViewBuilder
import com.intellij.openapi.components.service
import com.intellij.openapi.fileEditor.FileEditor
@@ -28,14 +30,7 @@ internal class DiffEditorProvider : DefaultPlatformFileEditorProvider, Structure
override fun createEditor(project: Project, file: VirtualFile): FileEditor {
if (file is CombinedDiffVirtualFile) {
val sourceId = file.sourceId
val modelRepository = project.service<CombinedDiffModelRepository>()
var combinedDiffModel = modelRepository.findModel(sourceId)
if (combinedDiffModel == null && file is CombinedDiffModelBuilder) {
combinedDiffModel = file.createModel(sourceId)
modelRepository.registerModel(sourceId, combinedDiffModel)
}
requireNotNull(combinedDiffModel) { "Combined diff model doesn't registered for $sourceId" }
val combinedDiffModel = file.createModel()
val factory = project.service<CombinedDiffComponentFactoryProvider>().create(combinedDiffModel)
val editor = CombinedDiffEditor(file, factory)
DiffRequestProcessorEditorCustomizer.customize(file, editor, factory.model.context)

View File

@@ -7,7 +7,7 @@ import com.intellij.openapi.fileEditor.FileEditorWithTextEditors
import com.intellij.openapi.util.Disposer
import javax.swing.JComponent
internal class CombinedDiffEditor(file: CombinedDiffVirtualFile, private val factory: CombinedDiffComponentFactory) :
class CombinedDiffEditor(file: CombinedDiffVirtualFile, val factory: CombinedDiffComponentFactory) :
DiffEditorBase(file, factory.getMainComponent(), factory.ourDisposable), FileEditorWithTextEditors {
override fun dispose() {

View File

@@ -1,32 +0,0 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.diff.tools.combined
import com.intellij.openapi.Disposable
import com.intellij.openapi.components.Service
import com.intellij.openapi.util.Disposer
@Service(Service.Level.PROJECT)
class CombinedDiffModelRepository : Disposable {
private val models: HashMap<String, CombinedDiffModel> = hashMapOf()
fun registerModel(sourceId: String, model: CombinedDiffModel) {
disposeIfRegistered(sourceId)
Disposer.register(model.ourDisposable) {
models.remove(sourceId)
}
models[sourceId] = model
}
fun findModel(sourceId: String): CombinedDiffModel? = models[sourceId]
private fun disposeIfRegistered(sourceId: String) {
val diffModel = models.remove(sourceId) ?: return
Disposer.dispose(diffModel.ourDisposable)
}
override fun dispose() {
models.clear() // TODO: why not dispose?
}
}

View File

@@ -2,13 +2,13 @@
package com.intellij.diff.tools.combined
import com.intellij.diff.editor.DiffVirtualFileBase
import org.jetbrains.annotations.ApiStatus
open class CombinedDiffVirtualFile(val sourceId: String, name: String, private val path: String? = null) : DiffVirtualFileBase(name) {
override fun getPath(): String = path ?: name
abstract class CombinedDiffVirtualFile(name: String, private val path: String = name) : DiffVirtualFileBase(name) {
override fun getPath(): String = path
abstract fun createModel(): CombinedDiffModel
}
@ApiStatus.Internal
interface CombinedDiffModelBuilder {
fun createModel(id: String): CombinedDiffModelImpl
class CombinedDiffVirtualFileImpl(val model: CombinedDiffModel, name: String, path: String = name)
: CombinedDiffVirtualFile(name, path) {
override fun createModel(): CombinedDiffModel = model
}

View File

@@ -24,14 +24,12 @@ import javax.swing.JComponent
internal open class CombinedActivityDiffPreview(project: Project, targetComponent: JComponent, val scope: ActivityScope, parentDisposable: Disposable) :
CombinedDiffPreview(project, targetComponent, true, parentDisposable) {
override val sourceId: String = targetComponent.id
override fun createModel(): CombinedDiffPreviewModel {
return CombinedActivityDiffPreviewModel(project, scope, parentDisposable)
}
override fun getCombinedDiffTabTitle(): String {
val filePath = model.selected?.filePath
val filePath = model?.selected?.filePath
if (filePath != null) return LocalHistoryBundle.message("activity.diff.tab.title.file", filePath.name)
if (scope == ActivityScope.Recent) return LocalHistoryBundle.message("activity.diff.tab.title.recent")
return LocalHistoryBundle.message("activity.diff.tab.title")

View File

@@ -2,11 +2,10 @@
package com.intellij.openapi.vcs.changes
import com.intellij.diff.editor.DiffRequestProcessorEditor
import com.intellij.diff.tools.combined.CombinedDiffModelRepository
import com.intellij.diff.tools.combined.CombinedDiffEditor
import com.intellij.openapi.application.EDT
import com.intellij.openapi.application.ModalityState
import com.intellij.openapi.application.asContextElement
import com.intellij.openapi.components.service
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.fileEditor.impl.EditorTabTitleProvider
import com.intellij.openapi.progress.blockingContext
@@ -38,15 +37,18 @@ private class VcsEditorTabTitleProvider : EditorTabTitleProvider, DumbAware {
}
val supplier = {
val editors = FileEditorManager.getInstance(project).getEditors(file)
val editor = ContainerUtil.findInstance(editors, DiffRequestProcessorEditor::class.java)
val processor = editor?.processor
if (file is PreviewDiffVirtualFile) {
file.provider.getEditorTabName(processor)
}
else {
val sourceId = (file as CombinedDiffPreviewVirtualFile).sourceId
val diffModel = project.service<CombinedDiffModelRepository>().findModel(sourceId)
diffModel?.context?.getUserData(COMBINED_DIFF_PREVIEW_TAB_NAME)?.invoke()
when (file) {
is PreviewDiffVirtualFile -> {
val editor = ContainerUtil.findInstance(editors, DiffRequestProcessorEditor::class.java)
val processor = editor?.processor
file.provider.getEditorTabName(processor)
}
is CombinedDiffPreviewVirtualFile -> {
val editor = ContainerUtil.findInstance(editors, CombinedDiffEditor::class.java)
val model = editor?.factory?.model
model?.context?.getUserData(COMBINED_DIFF_PREVIEW_TAB_NAME)?.invoke()
}
else -> null
}
}
if (EDT.isCurrentThreadEdt()) {

View File

@@ -6,7 +6,6 @@ import com.intellij.diff.tools.combined.*
import com.intellij.openapi.Disposable
import com.intellij.openapi.ListSelection
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.components.service
import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Key
@@ -19,13 +18,12 @@ import com.intellij.openapi.vcs.changes.actions.diff.CombinedDiffPreviewModel.Co
import com.intellij.openapi.vcs.changes.ui.ChangeDiffRequestChain
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.vcsUtil.Delegates
import org.jetbrains.annotations.NonNls
import javax.swing.JComponent
@JvmField
internal val COMBINED_DIFF_PREVIEW_TAB_NAME = Key.create<() -> @NlsContexts.TabTitle String>("combined_diff_preview_tab_name")
class CombinedDiffPreviewVirtualFile(sourceId: String) : CombinedDiffVirtualFile(sourceId, "")
abstract class CombinedDiffPreviewVirtualFile() : CombinedDiffVirtualFile("")
abstract class CombinedDiffPreview(project: Project,
targetComponent: JComponent,
@@ -33,17 +31,23 @@ abstract class CombinedDiffPreview(project: Project,
parentDisposable: Disposable) :
EditorTabPreviewBase(project, parentDisposable) {
protected abstract val sourceId: String
override val previewFile: VirtualFile by lazy {
object : CombinedDiffPreviewVirtualFile() {
override fun createModel(): CombinedDiffModel = this@CombinedDiffPreview.createModel()
}
}
override val previewFile: VirtualFile by lazy { CombinedDiffPreviewVirtualFile(sourceId) }
override val updatePreviewProcessor get() = getOrCreateModel()
override val updatePreviewProcessor get() = model
var model: CombinedDiffPreviewModel? = null
private set
protected open val model by lazy { createModel().also { model -> customizeModel(sourceId, model) } }
protected fun customizeModel(sourceId: String, model: CombinedDiffPreviewModel) {
model.context.putUserData(COMBINED_DIFF_PREVIEW_TAB_NAME, ::getCombinedDiffTabTitle)
project.service<CombinedDiffModelRepository>().registerModel(sourceId, model)
private fun getOrCreateModel(): CombinedDiffPreviewModel {
model?.let { return it }
model = createModel().also {
it.context.putUserData(COMBINED_DIFF_PREVIEW_TAB_NAME, ::getCombinedDiffTabTitle)
}
return model!!
}
override fun updatePreview(fromModelRefresh: Boolean) {
@@ -65,6 +69,7 @@ abstract class CombinedDiffPreview(project: Project,
}
protected open fun updatePreview() {
val model = model ?: return
if (model.ourDisposable.isDisposed) return
model.context.putUserData(COMBINED_DIFF_VIEWER_KEY, null)
val changes = model.iterateAllChanges().toList()
@@ -87,12 +92,10 @@ abstract class CombinedDiffPreview(project: Project,
event.presentation.isVisible = event.isFromActionToolbar || event.presentation.isEnabled
}
override fun getCurrentName(): String? = model.selected?.presentableName
override fun hasContent(): Boolean = model.requests.isNotEmpty()
override fun getCurrentName(): String? = model?.selected?.presentableName
override fun hasContent(): Boolean = !model?.requests.isNullOrEmpty()
internal fun getFileSize(): Int = model.requests.size
protected val JComponent.id: @NonNls String get() = javaClass.name + "@" + Integer.toHexString(hashCode())
internal fun getFileSize(): Int = model?.requests?.size ?: 0
}
abstract class CombinedDiffPreviewModel(project: Project, parentDisposable: Disposable) :

View File

@@ -17,8 +17,6 @@ abstract class CombinedTreeDiffPreview(protected val tree: ChangesTree,
parentDisposable: Disposable) :
CombinedDiffPreview(tree.project, targetComponent, needSetupOpenPreviewListeners, parentDisposable) {
override val sourceId: String get() = tree.id
constructor(tree: ChangesTree, parentDisposable: Disposable) :
this(tree, tree, false, true, parentDisposable)

View File

@@ -5,7 +5,6 @@ import com.intellij.diff.editor.DiffEditorTabFilesManager
import com.intellij.diff.tools.combined.*
import com.intellij.openapi.actionSystem.ActionUpdateThread
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.components.service
import com.intellij.openapi.project.DumbAwareAction
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Key
@@ -13,7 +12,6 @@ import com.intellij.openapi.vcs.VcsBundle
import com.intellij.openapi.vcs.VcsDataKeys
import com.intellij.openapi.vcs.changes.Change
import com.intellij.openapi.vcs.history.VcsDiffUtil
import java.util.*
class ShowCombinedDiffAction : DumbAwareAction() {
override fun update(e: AnActionEvent) {
@@ -45,11 +43,9 @@ class ShowCombinedDiffAction : DumbAwareAction() {
CombinedBlockProducer(id, producer)
}
val sourceId = UUID.randomUUID().toString()
val model = CombinedDiffModelImpl(project)
project.service<CombinedDiffModelRepository>().registerModel(sourceId, model)
model.setBlocks(producers)
val allInOneDiffFile = CombinedDiffVirtualFile(sourceId, VcsBundle.message("changes.combined.diff"))
val allInOneDiffFile = CombinedDiffVirtualFileImpl(model, VcsBundle.message("changes.combined.diff"))
DiffEditorTabFilesManager.getInstance(project).showDiffFile(allInOneDiffFile, true)
}

View File

@@ -19,7 +19,7 @@ class VcsLogCombinedDiffPreview(private val browser: VcsLogChangesBrowser) : Com
}
override fun getCombinedDiffTabTitle(): String {
val filePath = model.selected?.filePath
val filePath = model?.selected?.filePath
return if (filePath == null) VcsLogBundle.message("vcs.log.diff.preview.editor.empty.tab.name")
else VcsLogBundle.message("vcs.log.diff.preview.editor.tab.name", filePath.name)
}

View File

@@ -6,6 +6,7 @@ import com.intellij.collaboration.file.codereview.CodeReviewDiffVirtualFile
import com.intellij.diff.chains.DiffRequestChain
import com.intellij.diff.impl.DiffRequestProcessor
import com.intellij.diff.tools.combined.CombinedBlockProducer
import com.intellij.diff.tools.combined.CombinedDiffModel
import com.intellij.diff.tools.combined.CombinedDiffModelImpl
import com.intellij.diff.tools.combined.CombinedPathBlockId
import com.intellij.openapi.project.Project
@@ -51,7 +52,7 @@ internal data class GHNewPRCombinedDiffPreviewVirtualFile(private val fileManage
override fun isValid(): Boolean = isFileValid(fileManagerId, project, repository)
override fun createModel(id: String): CombinedDiffModelImpl {
override fun createModel(): CombinedDiffModel {
val model = CombinedDiffModelImpl(project)
val dataContext = GHPRDataContextRepository.getInstance(project).findContext(repository)!!
val diffModel: GHPRDiffRequestModel = dataContext.newPRDiffModel

View File

@@ -4,7 +4,7 @@ package org.jetbrains.plugins.github.pullrequest
import com.intellij.collaboration.file.codereview.CodeReviewCombinedDiffVirtualFile
import com.intellij.collaboration.file.codereview.CodeReviewDiffVirtualFile
import com.intellij.diff.impl.DiffRequestProcessor
import com.intellij.diff.tools.combined.CombinedDiffModelImpl
import com.intellij.diff.tools.combined.CombinedDiffModel
import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import com.intellij.vcs.editor.ComplexPathVirtualFileSystem
@@ -50,8 +50,9 @@ internal data class GHPRCombinedDiffPreviewVirtualFile(private val fileManagerId
override fun isValid(): Boolean = isFileValid(fileManagerId, project, repository)
override fun createModel(id: String): CombinedDiffModelImpl =
project.service<GHPRDiffService>().createCombinedDiffModel(repository, pullRequest)
override fun createModel(): CombinedDiffModel {
return project.service<GHPRDiffService>().createCombinedDiffModel(repository, pullRequest)
}
}
private fun createSourceId(fileManagerId: String, repository: GHRepositoryCoordinates, pullRequest: GHPRIdentifier) =

View File

@@ -6,6 +6,7 @@ import com.intellij.collaboration.file.codereview.CodeReviewDiffVirtualFile
import com.intellij.collaboration.ui.codereview.diff.CodeReviewDiffHandlerHelper
import com.intellij.collaboration.util.KeyValuePair
import com.intellij.diff.impl.DiffRequestProcessor
import com.intellij.diff.tools.combined.CombinedDiffModel
import com.intellij.diff.tools.combined.CombinedDiffModelImpl
import com.intellij.diff.util.DiffUserDataKeys
import com.intellij.openapi.actionSystem.ActionManager
@@ -66,8 +67,9 @@ internal data class GitLabMergeRequestCombinedDiffFile(
override fun isValid(): Boolean = isFileValid(project, connectionId)
override fun createModel(id: String): CombinedDiffModelImpl =
project.service<GitLabMergeRequestDiffService>().createGitLabCombinedDiffModel(connectionId, mergeRequestIid)
override fun createModel(): CombinedDiffModel {
return project.service<GitLabMergeRequestDiffService>().createGitLabCombinedDiffModel(connectionId, mergeRequestIid)
}
}
private fun createSourceId(connectionId: String, glProject: GitLabProjectCoordinates, mergeRequestIid: String) =