Skip to content

Commit 0ca11d6

Browse files
committed
use wrapper to properly show one diff tab
1 parent 04aa717 commit 0ca11d6

File tree

2 files changed

+42
-19
lines changed

2 files changed

+42
-19
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package software.aws.toolkits.jetbrains.services.amazonq.lsp
5+
6+
import com.intellij.diff.chains.SimpleDiffRequestChain
7+
import com.intellij.diff.editor.ChainDiffVirtualFile
8+
import com.intellij.diff.editor.DiffEditorTabFilesManager
9+
import com.intellij.diff.requests.SimpleDiffRequest
10+
import com.intellij.openapi.fileEditor.FileEditorManager
11+
import com.intellij.openapi.project.Project
12+
13+
/**
14+
* A virtual file that represents an AmazonQ diff view.
15+
* This class allows us to identify diff files created by AmazonQ.
16+
*/
17+
class AmazonQDiffVirtualFile(
18+
diffChain: SimpleDiffRequestChain,
19+
name: String,
20+
) : ChainDiffVirtualFile(diffChain, name) {
21+
companion object {
22+
fun openDiff(project: Project, diffRequest: SimpleDiffRequest, tabName: String) {
23+
// Find any existing AmazonQ diff files
24+
val fileEditorManager = FileEditorManager.getInstance(project)
25+
val existingDiffFiles = fileEditorManager.openFiles.filterIsInstance<AmazonQDiffVirtualFile>()
26+
27+
// Close existing diff files
28+
existingDiffFiles.forEach { fileEditorManager.closeFile(it) }
29+
30+
// Create and open the new diff file
31+
val diffChain = SimpleDiffRequestChain(diffRequest)
32+
val diffVirtualFile = AmazonQDiffVirtualFile(diffChain, tabName)
33+
DiffEditorTabFilesManager.getInstance(project).showDiffFile(diffVirtualFile, true)
34+
}
35+
}
36+
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@
44
package software.aws.toolkits.jetbrains.services.amazonq.lsp
55

66
import com.intellij.diff.DiffContentFactory
7-
import com.intellij.diff.chains.SimpleDiffRequestChain
8-
import com.intellij.diff.editor.ChainDiffVirtualFile
9-
import com.intellij.diff.editor.DiffEditorTabFilesManager
107
import com.intellij.diff.requests.SimpleDiffRequest
118
import com.intellij.openapi.application.ApplicationManager
129
import com.intellij.openapi.fileChooser.FileChooserFactory
@@ -61,7 +58,7 @@ import java.util.concurrent.TimeUnit
6158
* Concrete implementation of [AmazonQLanguageClient] to handle messages sent from server
6259
*/
6360
class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageClient {
64-
private val openFileDiffs = mutableMapOf<String, ChainDiffVirtualFile>()
61+
// No longer need to track open file diffs as we're using AmazonQDiffVirtualFile to manage this
6562

6663
override fun telemetryEvent(`object`: Any) {
6764
println(`object`)
@@ -287,33 +284,26 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
287284
{
288285
var tempPath: java.nio.file.Path? = null
289286
try {
290-
val diffId = "${params.originalFileUri}:${params.originalFileContent.hashCode()}:${params.fileContent.hashCode()}"
291-
292-
val existingDiff = openFileDiffs[diffId]
293-
if (existingDiff != null) {
294-
FileEditorManager.getInstance(project).openFile(existingDiff, true)
295-
return@supplyAsync
296-
}
297-
298287
val fileName = Paths.get(params.originalFileUri).fileName.toString()
299288
// Create a temporary virtual file for syntax highlighting
300289
val fileExtension = fileName.substringAfterLast('.', "")
301290
tempPath = Files.createTempFile(null, ".$fileExtension")
302291
val virtualFile = tempPath.toFile()
303292
.also { it.setReadOnly() }
304293
.toVirtualFile()
294+
305295
val originalContent = params.originalFileContent ?: run {
306296
val sourceFile = File(params.originalFileUri)
307297
if (sourceFile.exists()) sourceFile.readText() else ""
308298
}
299+
309300
val contentFactory = DiffContentFactory.getInstance()
310301
var isNewFile = false
311302
val (leftContent, rightContent) = when {
312303
params.isDeleted -> {
313304
contentFactory.create(project, originalContent, virtualFile) to
314305
contentFactory.createEmpty()
315306
}
316-
317307
else -> {
318308
val newContent = params.fileContent.orEmpty()
319309
isNewFile = newContent == originalContent
@@ -322,16 +312,16 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
322312
contentFactory.createEmpty() to
323313
contentFactory.create(project, newContent, virtualFile)
324314
}
325-
326315
else -> {
327316
contentFactory.create(project, originalContent, virtualFile) to
328317
contentFactory.create(project, newContent, virtualFile)
329318
}
330319
}
331320
}
332321
}
322+
val title = "$fileName ${message("aws.q.lsp.client.diff_message")}"
333323
val diffRequest = SimpleDiffRequest(
334-
"$fileName ${message("aws.q.lsp.client.diff_message")}",
324+
title,
335325
leftContent,
336326
rightContent,
337327
"Original",
@@ -342,10 +332,7 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
342332
}
343333
)
344334

345-
val diffChain = SimpleDiffRequestChain(diffRequest)
346-
val diffVirtualFile = ChainDiffVirtualFile(diffChain, fileName)
347-
DiffEditorTabFilesManager.getInstance(project).showDiffFile(diffVirtualFile, true)
348-
openFileDiffs[diffId] = diffVirtualFile
335+
AmazonQDiffVirtualFile.openDiff(project, diffRequest, title)
349336
} catch (e: Exception) {
350337
LOG.warn { "Failed to open file diff: ${e.message}" }
351338
} finally {

0 commit comments

Comments
 (0)