@@ -6,13 +6,15 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp
66import com.google.gson.Gson
77import com.intellij.diff.DiffContentFactory
88import com.intellij.diff.DiffManager
9+ import com.intellij.diff.DiffManagerEx
910import com.intellij.diff.requests.SimpleDiffRequest
1011import com.intellij.notification.NotificationType
1112import com.intellij.openapi.application.ApplicationManager
1213import com.intellij.openapi.fileChooser.FileChooserFactory
1314import com.intellij.openapi.fileChooser.FileSaverDescriptor
1415import com.intellij.openapi.fileEditor.FileEditorManager
1516import com.intellij.openapi.project.Project
17+ import com.intellij.openapi.vfs.LocalFileSystem
1618import com.intellij.openapi.vfs.VirtualFileManager
1719import migration.software.aws.toolkits.jetbrains.settings.AwsSettings
1820import org.eclipse.lsp4j.ConfigurationParams
@@ -48,6 +50,7 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.customization.Code
4850import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
4951import software.aws.toolkits.resources.message
5052import java.io.File
53+ import java.nio.file.Files
5154import java.nio.file.Paths
5255import java.util.UUID
5356import java.util.concurrent.CompletableFuture
@@ -269,40 +272,69 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
269272 return CompletableFuture .completedFuture(Unit )
270273 }
271274
275+ private fun File.toVirtualFile () = LocalFileSystem .getInstance().findFileByIoFile(this )
276+
272277 override fun openFileDiff (params : OpenFileDiffParams ): CompletableFuture <Unit > =
273278 CompletableFuture .supplyAsync(
274279 {
280+ var tempPath: java.nio.file.Path ? = null
275281 try {
276- val contentFactory = DiffContentFactory .getInstance()
277282 val fileName = Paths .get(params.originalFileUri).fileName.toString()
283+ // Create a temporary virtual file for syntax highlighting
284+ val fileExtension = fileName.substringAfterLast(' .' , " " )
285+ tempPath = Files .createTempFile(null , " .$fileExtension " )
286+ val virtualFile = tempPath.toFile()
287+ .also { it.setReadOnly() }
288+ .toVirtualFile()
278289
279290 val originalContent = params.originalFileContent ? : run {
280- val file = File (params.originalFileUri)
281- if (file .exists()) file .readText() else " "
291+ val sourceFile = File (params.originalFileUri)
292+ if (sourceFile .exists()) sourceFile .readText() else " "
282293 }
294+
295+ val contentFactory = DiffContentFactory .getInstance()
296+ var isNewFile = false
283297 val (leftContent, rightContent) = when {
284298 params.isDeleted -> {
285- // For deleted files, show original on left, empty on right
286- contentFactory.create(originalContent) to
299+ contentFactory.create(project, originalContent, virtualFile) to
287300 contentFactory.createEmpty()
288301 }
289302 else -> {
290- // For new or modified files
291303 val newContent = params.fileContent.orEmpty()
292- contentFactory.create(originalContent) to
293- contentFactory.create(newContent)
304+ isNewFile = newContent == originalContent
305+ when {
306+ isNewFile -> {
307+ contentFactory.createEmpty() to
308+ contentFactory.create(project, newContent, virtualFile)
309+ }
310+ else -> {
311+ contentFactory.create(project, originalContent, virtualFile) to
312+ contentFactory.create(project, newContent, virtualFile)
313+ }
314+ }
294315 }
295316 }
296317 val diffRequest = SimpleDiffRequest (
297318 " $fileName ${message(" aws.q.lsp.client.diff_message" )} " ,
298319 leftContent,
299320 rightContent,
300321 " Original" ,
301- if (params.isDeleted) " Deleted" else " Modified"
322+ when {
323+ params.isDeleted -> " Deleted"
324+ isNewFile -> " Created"
325+ else -> " Modified"
326+ }
302327 )
303- DiffManager .getInstance().showDiff (project, diffRequest)
328+ ( DiffManager .getInstance() as DiffManagerEx ).showDiffBuiltin (project, diffRequest)
304329 } catch (e: Exception ) {
305330 LOG .warn { " Failed to open file diff: ${e.message} " }
331+ } finally {
332+ // Clean up the temporary file
333+ try {
334+ tempPath?.let { Files .deleteIfExists(it) }
335+ } catch (e: Exception ) {
336+ LOG .warn { " Failed to delete temporary file: ${e.message} " }
337+ }
306338 }
307339 },
308340 ApplicationManager .getApplication()::invokeLater
0 commit comments