Skip to content

Commit 0d31e2c

Browse files
authored
Merge branch 'feature/q-lsp-chat' into featCfg
2 parents f4d75d4 + d46f890 commit 0d31e2c

File tree

1 file changed

+42
-10
lines changed

1 file changed

+42
-10
lines changed

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

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp
66
import com.google.gson.Gson
77
import com.intellij.diff.DiffContentFactory
88
import com.intellij.diff.DiffManager
9+
import com.intellij.diff.DiffManagerEx
910
import com.intellij.diff.requests.SimpleDiffRequest
1011
import com.intellij.notification.NotificationType
1112
import com.intellij.openapi.application.ApplicationManager
1213
import com.intellij.openapi.fileChooser.FileChooserFactory
1314
import com.intellij.openapi.fileChooser.FileSaverDescriptor
1415
import com.intellij.openapi.fileEditor.FileEditorManager
1516
import com.intellij.openapi.project.Project
17+
import com.intellij.openapi.vfs.LocalFileSystem
1618
import com.intellij.openapi.vfs.VirtualFileManager
1719
import migration.software.aws.toolkits.jetbrains.settings.AwsSettings
1820
import org.eclipse.lsp4j.ConfigurationParams
@@ -48,6 +50,7 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.customization.Code
4850
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
4951
import software.aws.toolkits.resources.message
5052
import java.io.File
53+
import java.nio.file.Files
5154
import java.nio.file.Paths
5255
import java.util.UUID
5356
import 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

Comments
 (0)