diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQDiffVirtualFile.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQDiffVirtualFile.kt new file mode 100644 index 00000000000..5a59499b286 --- /dev/null +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQDiffVirtualFile.kt @@ -0,0 +1,37 @@ +// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.aws.toolkits.jetbrains.services.amazonq.lsp + +import com.intellij.diff.chains.SimpleDiffRequestChain +import com.intellij.diff.editor.ChainDiffVirtualFile +import com.intellij.diff.editor.DiffEditorTabFilesManager +import com.intellij.diff.requests.SimpleDiffRequest +import com.intellij.openapi.fileEditor.FileEditorManager +import com.intellij.openapi.project.Project +import software.aws.toolkits.resources.message + +/** + * A virtual file that represents an AmazonQ diff view. + * This class allows us to identify diff files created by AmazonQ. + */ +class AmazonQDiffVirtualFile( + diffChain: SimpleDiffRequestChain, + name: String, +) : ChainDiffVirtualFile(diffChain, name) { + companion object { + fun openDiff(project: Project, diffRequest: SimpleDiffRequest) { + // Find any existing AmazonQ diff files + val fileEditorManager = FileEditorManager.getInstance(project) + val existingDiffFiles = fileEditorManager.openFiles.filterIsInstance() + + // Close existing diff files + existingDiffFiles.forEach { fileEditorManager.closeFile(it) } + + // Create and open the new diff file + val diffChain = SimpleDiffRequestChain(diffRequest) + val diffVirtualFile = AmazonQDiffVirtualFile(diffChain, diffRequest.title ?: message("aws.q.lsp.client.diff_message")) + DiffEditorTabFilesManager.getInstance(project).showDiffFile(diffVirtualFile, true) + } + } +} diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt index b67e3d0cb76..17f32e5bbf4 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt @@ -4,8 +4,6 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp import com.intellij.diff.DiffContentFactory -import com.intellij.diff.DiffManager -import com.intellij.diff.DiffManagerEx import com.intellij.diff.requests.SimpleDiffRequest import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.fileChooser.FileChooserFactory @@ -363,11 +361,12 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC else -> "Modified" } ) - (DiffManager.getInstance() as DiffManagerEx).showDiffBuiltin(project, diffRequest) + + AmazonQDiffVirtualFile.openDiff(project, diffRequest) } catch (e: Exception) { LOG.warn { "Failed to open file diff: ${e.message}" } } finally { - // Clean up the temporary file + // Clean up the temporary file used for syntax highlight try { tempPath?.let { Files.deleteIfExists(it) } } catch (e: Exception) {