Skip to content

Commit 38aed6e

Browse files
authored
feat(amazonq): Enable users to edit code files directly on the diff view (aws#8019)
## Problem Currently users couldn't edit code files on the diff view provided by Amazon Q. Users have to open those files in the workspace to edit them. This is very inconvenient. ## Solution Copy of aws#7886 Enable users to edit code files directly on the diff view. https://github.com/user-attachments/assets/464d9757-cb6f-4f0f-aa6f-de4f3104cdb5 --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent ebbf2eb commit 38aed6e

File tree

1 file changed

+38
-40
lines changed

1 file changed

+38
-40
lines changed

packages/amazonq/src/lsp/chat/messages.ts

Lines changed: 38 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ import {
6969
} from '@aws/language-server-runtimes/protocol'
7070
import { v4 as uuidv4 } from 'uuid'
7171
import * as vscode from 'vscode'
72+
import * as path from 'path'
7273
import { Disposable, LanguageClient, Position, TextDocumentIdentifier } from 'vscode-languageclient'
7374
import { AmazonQChatViewProvider } from './webviewProvider'
7475
import {
@@ -81,22 +82,8 @@ import {
8182
SecurityIssueTreeViewProvider,
8283
CodeWhispererConstants,
8384
} from 'aws-core-vscode/codewhisperer'
84-
import {
85-
amazonQDiffScheme,
86-
AmazonQPromptSettings,
87-
messages,
88-
openUrl,
89-
isTextEditor,
90-
globals,
91-
setContext,
92-
} from 'aws-core-vscode/shared'
93-
import {
94-
DefaultAmazonQAppInitContext,
95-
messageDispatcher,
96-
EditorContentController,
97-
ViewDiffMessage,
98-
referenceLogText,
99-
} from 'aws-core-vscode/amazonq'
85+
import { AmazonQPromptSettings, messages, openUrl, isTextEditor, globals, setContext } from 'aws-core-vscode/shared'
86+
import { DefaultAmazonQAppInitContext, messageDispatcher, referenceLogText } from 'aws-core-vscode/amazonq'
10087
import { telemetry } from 'aws-core-vscode/telemetry'
10188
import { isValidResponseError } from './error'
10289
import { decryptResponse, encryptRequest } from '../encryption'
@@ -664,31 +651,42 @@ export function registerMessageListeners(
664651
)
665652

666653
languageClient.onNotification(openFileDiffNotificationType.method, async (params: OpenFileDiffParams) => {
667-
const ecc = new EditorContentController()
668-
const uri = params.originalFileUri
669-
const doc = await vscode.workspace.openTextDocument(uri)
670-
const entireDocumentSelection = new vscode.Selection(
671-
new vscode.Position(0, 0),
672-
new vscode.Position(doc.lineCount - 1, doc.lineAt(doc.lineCount - 1).text.length)
673-
)
674-
const viewDiffMessage: ViewDiffMessage = {
675-
context: {
676-
activeFileContext: {
677-
filePath: params.originalFileUri,
678-
fileText: params.originalFileContent ?? '',
679-
fileLanguage: undefined,
680-
matchPolicy: undefined,
681-
},
682-
focusAreaContext: {
683-
selectionInsideExtendedCodeBlock: entireDocumentSelection,
684-
codeBlock: '',
685-
extendedCodeBlock: '',
686-
names: undefined,
687-
},
688-
},
689-
code: params.fileContent ?? '',
654+
const currentFileUri = vscode.Uri.parse(params.originalFileUri)
655+
const originalContent = params.originalFileContent ?? ''
656+
const fileName = path.basename(currentFileUri.fsPath)
657+
658+
// Use custom scheme to avoid adding to recent files
659+
const originalFileUri = vscode.Uri.parse(`amazonq-diff:${fileName}_original_${Date.now()}`)
660+
661+
// Register content provider for the custom scheme
662+
const disposable = vscode.workspace.registerTextDocumentContentProvider('amazonq-diff', {
663+
provideTextDocumentContent: () => originalContent,
664+
})
665+
666+
try {
667+
// Open diff view with custom scheme URI (left) vs current file (right)
668+
await vscode.commands.executeCommand(
669+
'vscode.diff',
670+
originalFileUri,
671+
currentFileUri,
672+
`${vscode.workspace.asRelativePath(currentFileUri)} (Original ↔ Current, Editable)`,
673+
{ preview: false }
674+
)
675+
676+
// Clean up content provider when diff view is closed
677+
const cleanupDisposable = vscode.window.onDidChangeVisibleTextEditors(() => {
678+
const isDiffViewOpen = vscode.window.visibleTextEditors.some(
679+
(editor) => editor.document.uri.toString() === originalFileUri.toString()
680+
)
681+
if (!isDiffViewOpen) {
682+
disposable.dispose()
683+
cleanupDisposable.dispose()
684+
}
685+
})
686+
} catch (error) {
687+
disposable.dispose()
688+
languageClient.error(`[VSCode Client] Failed to open diff view: ${error}`)
690689
}
691-
await ecc.viewDiff(viewDiffMessage, amazonQDiffScheme)
692690
})
693691

694692
languageClient.onNotification(chatUpdateNotificationType.method, (params: ChatUpdateParams) => {

0 commit comments

Comments
 (0)