Skip to content

Commit e3082d2

Browse files
feat(amazonq): clicking on changed file in Q chat opens up file diff in editor (#5675)
* clicking q chat diff opens diff view in editor * feedback * detekt
1 parent fdcae23 commit e3082d2

File tree

5 files changed

+64
-0
lines changed

5 files changed

+64
-0
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatU
1111
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD
1212
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatParams
1313
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult
14+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OPEN_FILE_DIFF
15+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenFileDiffParams
1416
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabParams
1517
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabResult
1618
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.SHOW_SAVE_FILE_DIALOG_REQUEST_METHOD
@@ -38,4 +40,7 @@ interface AmazonQLanguageClient : LanguageClient {
3840

3941
@JsonNotification(CHAT_SEND_UPDATE)
4042
fun sendChatUpdate(params: ChatUpdateParams): CompletableFuture<Unit>
43+
44+
@JsonNotification(OPEN_FILE_DIFF)
45+
fun openFileDiff(params: OpenFileDiffParams): CompletableFuture<Unit>
4146
}

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

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

66
import com.google.gson.Gson
7+
import com.intellij.diff.DiffContentFactory
8+
import com.intellij.diff.DiffManager
9+
import com.intellij.diff.requests.SimpleDiffRequest
710
import com.intellij.notification.NotificationType
811
import com.intellij.openapi.application.ApplicationManager
912
import com.intellij.openapi.fileChooser.FileChooserFactory
@@ -34,6 +37,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ChatU
3437
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GET_SERIALIZED_CHAT_REQUEST_METHOD
3538
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatParams
3639
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.GetSerializedChatResult
40+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenFileDiffParams
3741
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabParams
3842
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.OpenTabResult
3943
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ShowSaveFileDialogParams
@@ -42,6 +46,9 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credential
4246
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.SsoProfileData
4347
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator
4448
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
49+
import software.aws.toolkits.resources.message
50+
import java.io.File
51+
import java.nio.file.Paths
4552
import java.util.UUID
4653
import java.util.concurrent.CompletableFuture
4754
import java.util.concurrent.TimeUnit
@@ -262,6 +269,45 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC
262269
return CompletableFuture.completedFuture(Unit)
263270
}
264271

272+
override fun openFileDiff(params: OpenFileDiffParams): CompletableFuture<Unit> =
273+
CompletableFuture.supplyAsync(
274+
{
275+
try {
276+
val contentFactory = DiffContentFactory.getInstance()
277+
val fileName = Paths.get(params.originalFileUri).fileName.toString()
278+
279+
val originalContent = params.originalFileContent ?: run {
280+
val file = File(params.originalFileUri)
281+
if (file.exists()) file.readText() else ""
282+
}
283+
val (leftContent, rightContent) = when {
284+
params.isDeleted -> {
285+
// For deleted files, show original on left, empty on right
286+
contentFactory.create(originalContent) to
287+
contentFactory.createEmpty()
288+
}
289+
else -> {
290+
// For new or modified files
291+
val newContent = params.fileContent.orEmpty()
292+
contentFactory.create(originalContent) to
293+
contentFactory.create(newContent)
294+
}
295+
}
296+
val diffRequest = SimpleDiffRequest(
297+
"$fileName ${message("aws.q.lsp.client.diff_message")}",
298+
leftContent,
299+
rightContent,
300+
"Original",
301+
if (params.isDeleted) "Deleted" else "Modified"
302+
)
303+
DiffManager.getInstance().showDiff(project, diffRequest)
304+
} catch (e: Exception) {
305+
LOG.warn { "Failed to open file diff: ${e.message}" }
306+
}
307+
},
308+
ApplicationManager.getApplication()::invokeLater
309+
)
310+
265311
companion object {
266312
private val LOG = getLogger<AmazonQLanguageClientImpl>()
267313
}

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/FlareChatCommands.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,5 @@ const val CHAT_SEND_UPDATE = "aws/chat/sendChatUpdate"
3131
const val CHAT_CREATE_PROMPT = "aws/chat/createPrompt"
3232
const val SHOW_SAVE_FILE_DIALOG_REQUEST_METHOD = "aws/showSaveFileDialog"
3333
const val GET_SERIALIZED_CHAT_REQUEST_METHOD = "aws/chat/getSerializedChat"
34+
const val OPEN_FILE_DIFF = "aws/openFileDiff"
3435
const val STOP_CHAT_RESPONSE = "stopChatResponse"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
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.model.aws.chat
5+
6+
data class OpenFileDiffParams(
7+
val originalFileUri: String,
8+
val originalFileContent: String? = null,
9+
val isDeleted: Boolean,
10+
val fileContent: String? = null,
11+
)

plugins/core/resources/resources/software/aws/toolkits/resources/MessagesBundle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ aws.onboarding.getstarted.panel.login_with_iam=<a>Use Professional License</a>
253253
aws.onboarding.getstarted.panel.share_feedback=<a>Share Feedback</a>
254254
aws.onboarding.getstarted.panel.signup_iam_text=Sign up for free
255255
aws.onboarding.getstarted.panel.title=Authenticate with AWS Toolkit
256+
aws.q.lsp.client.diff_message=(Generated by Amazon Q)
256257
aws.q.migration.action.install.text=Install
257258
aws.q.migration.action.manage_plugins.text=Manage plugins
258259
aws.q.migration.action.read_more.text=Read more

0 commit comments

Comments
 (0)