@@ -12,12 +12,15 @@ import com.intellij.diff.requests.SimpleDiffRequest
12
12
import com.intellij.diff.util.DiffUserDataKeys
13
13
import com.intellij.ide.BrowserUtil
14
14
import com.intellij.openapi.application.runInEdt
15
+ import com.intellij.openapi.fileEditor.FileEditorManager
15
16
import com.intellij.openapi.project.Project
16
17
import com.intellij.openapi.roots.ProjectRootManager
17
18
import com.intellij.openapi.vfs.LocalFileSystem
18
19
import com.intellij.openapi.vfs.VfsUtil
19
20
import com.intellij.openapi.wm.ToolWindowManager
21
+ import com.intellij.testFramework.LightVirtualFile
20
22
import kotlinx.coroutines.withContext
23
+ import org.intellij.images.fileTypes.impl.SvgFileType
21
24
import software.amazon.awssdk.services.codewhispererruntime.model.DocFolderLevel
22
25
import software.amazon.awssdk.services.codewhispererruntime.model.DocInteractionType
23
26
import software.amazon.awssdk.services.codewhispererruntime.model.DocUserDecision
@@ -33,6 +36,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.apps.AmazonQAppInitConte
33
36
import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController
34
37
import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindowFactory
35
38
import software.aws.toolkits.jetbrains.services.amazonqDoc.DEFAULT_RETRY_LIMIT
39
+ import software.aws.toolkits.jetbrains.services.amazonqDoc.DIAGRAM_SVG_EXT
36
40
import software.aws.toolkits.jetbrains.services.amazonqDoc.DocException
37
41
import software.aws.toolkits.jetbrains.services.amazonqDoc.FEATURE_NAME
38
42
import software.aws.toolkits.jetbrains.services.amazonqDoc.InboundAppMessagesHandler
@@ -374,45 +378,51 @@ class DocController(
374
378
375
379
override suspend fun processOpenDiff (message : IncomingDocMessage .OpenDiff ) {
376
380
val session = getSessionInfo(message.tabId)
377
-
378
- val project = context.project
379
381
val sessionState = session.sessionState
380
382
381
- when (sessionState) {
382
- is PrepareDocGenerationState -> {
383
- runInEdt {
384
- val existingFile = VfsUtil .findRelativeFile(message.filePath, session.context.selectedSourceFolder)
385
-
386
- val leftDiffContent = if (existingFile == null ) {
387
- EmptyContent ()
388
- } else {
389
- DiffContentFactory .getInstance().create(project, existingFile)
390
- }
391
-
392
- val newFileContent = sessionState.filePaths.find { it.zipFilePath == message.filePath }?.fileContent
383
+ if (sessionState !is PrepareDocGenerationState ) {
384
+ logger.error { " $FEATURE_NAME : OpenDiff event is received for a conversation that has ${session.sessionState.phase} phase" }
385
+ messenger.sendError(
386
+ tabId = message.tabId,
387
+ errMessage = message(" amazonqFeatureDev.exception.open_diff_failed" ),
388
+ retries = 0 ,
389
+ conversationId = session.conversationIdUnsafe
390
+ )
391
+ return
392
+ }
393
393
394
- val rightDiffContent = if (message.deleted || newFileContent == null ) {
395
- EmptyContent ()
396
- } else {
397
- DiffContentFactory .getInstance().create(newFileContent)
398
- }
394
+ runInEdt {
395
+ val newFileContent = sessionState.filePaths.find { it.zipFilePath == message.filePath }?.fileContent
399
396
400
- val request = SimpleDiffRequest (message.filePath, leftDiffContent, rightDiffContent, null , null )
401
- request.putUserData(DiffUserDataKeys .FORCE_READ_ONLY , true )
397
+ val isSvgFile = message.filePath.lowercase().endsWith(" ." .plus(DIAGRAM_SVG_EXT ))
398
+ if (isSvgFile && newFileContent != null ) {
399
+ // instead of diff display generated svg in edit/preview window
400
+ val inMemoryFile = LightVirtualFile (
401
+ message.filePath,
402
+ SvgFileType .INSTANCE ,
403
+ newFileContent
404
+ )
405
+ inMemoryFile.isWritable = false
406
+ FileEditorManager .getInstance(context.project).openFile(inMemoryFile, true )
407
+ } else {
408
+ val existingFile = VfsUtil .findRelativeFile(message.filePath, session.context.selectedSourceFolder)
409
+ val leftDiffContent = if (existingFile == null ) {
410
+ EmptyContent ()
411
+ } else {
412
+ DiffContentFactory .getInstance().create(context.project, existingFile)
413
+ }
402
414
403
- val newDiff = ChainDiffVirtualFile (SimpleDiffRequestChain (request), message.filePath)
404
- DiffEditorTabFilesManager .getInstance(context.project).showDiffFile(newDiff, true )
415
+ val rightDiffContent = if (message.deleted || newFileContent == null ) {
416
+ EmptyContent ()
417
+ } else {
418
+ DiffContentFactory .getInstance().create(newFileContent)
405
419
}
406
- }
407
420
408
- else -> {
409
- logger.error { " $FEATURE_NAME : OpenDiff event is received for a conversation that has ${session.sessionState.phase} phase" }
410
- messenger.sendError(
411
- tabId = message.tabId,
412
- errMessage = message(" amazonqFeatureDev.exception.open_diff_failed" ),
413
- retries = 0 ,
414
- conversationId = session.conversationIdUnsafe
415
- )
421
+ val request = SimpleDiffRequest (message.filePath, leftDiffContent, rightDiffContent, null , null )
422
+ request.putUserData(DiffUserDataKeys .FORCE_READ_ONLY , true )
423
+
424
+ val newDiff = ChainDiffVirtualFile (SimpleDiffRequestChain (request), message.filePath)
425
+ DiffEditorTabFilesManager .getInstance(context.project).showDiffFile(newDiff, true )
416
426
}
417
427
}
418
428
}
@@ -738,6 +748,7 @@ class DocController(
738
748
SessionStatePhase .CODEGEN -> {
739
749
onCodeGeneration(session, message, tabId, mode)
740
750
}
751
+
741
752
else -> null
742
753
}
743
754
0 commit comments