Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 38 additions & 40 deletions packages/amazonq/src/lsp/chat/messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ import {
} from '@aws/language-server-runtimes/protocol'
import { v4 as uuidv4 } from 'uuid'
import * as vscode from 'vscode'
import * as path from 'path'
import { Disposable, LanguageClient, Position, TextDocumentIdentifier } from 'vscode-languageclient'
import { AmazonQChatViewProvider } from './webviewProvider'
import {
Expand All @@ -81,22 +82,8 @@ import {
SecurityIssueTreeViewProvider,
CodeWhispererConstants,
} from 'aws-core-vscode/codewhisperer'
import {
amazonQDiffScheme,
AmazonQPromptSettings,
messages,
openUrl,
isTextEditor,
globals,
setContext,
} from 'aws-core-vscode/shared'
import {
DefaultAmazonQAppInitContext,
messageDispatcher,
EditorContentController,
ViewDiffMessage,
referenceLogText,
} from 'aws-core-vscode/amazonq'
import { AmazonQPromptSettings, messages, openUrl, isTextEditor, globals, setContext } from 'aws-core-vscode/shared'
import { DefaultAmazonQAppInitContext, messageDispatcher, referenceLogText } from 'aws-core-vscode/amazonq'
import { telemetry } from 'aws-core-vscode/telemetry'
import { isValidResponseError } from './error'
import { decryptResponse, encryptRequest } from '../encryption'
Expand Down Expand Up @@ -664,31 +651,42 @@ export function registerMessageListeners(
)

languageClient.onNotification(openFileDiffNotificationType.method, async (params: OpenFileDiffParams) => {
const ecc = new EditorContentController()
const uri = params.originalFileUri
const doc = await vscode.workspace.openTextDocument(uri)
const entireDocumentSelection = new vscode.Selection(
new vscode.Position(0, 0),
new vscode.Position(doc.lineCount - 1, doc.lineAt(doc.lineCount - 1).text.length)
)
const viewDiffMessage: ViewDiffMessage = {
context: {
activeFileContext: {
filePath: params.originalFileUri,
fileText: params.originalFileContent ?? '',
fileLanguage: undefined,
matchPolicy: undefined,
},
focusAreaContext: {
selectionInsideExtendedCodeBlock: entireDocumentSelection,
codeBlock: '',
extendedCodeBlock: '',
names: undefined,
},
},
code: params.fileContent ?? '',
const currentFileUri = vscode.Uri.parse(params.originalFileUri)
const originalContent = params.originalFileContent ?? ''
const fileName = path.basename(currentFileUri.fsPath)

// Use custom scheme to avoid adding to recent files
const originalFileUri = vscode.Uri.parse(`amazonq-diff:${fileName}_original_${Date.now()}`)

// Register content provider for the custom scheme
const disposable = vscode.workspace.registerTextDocumentContentProvider('amazonq-diff', {
provideTextDocumentContent: () => originalContent,
})

try {
// Open diff view with custom scheme URI (left) vs current file (right)
await vscode.commands.executeCommand(
'vscode.diff',
originalFileUri,
currentFileUri,
`${vscode.workspace.asRelativePath(currentFileUri)} (Original ↔ Current, Editable)`,
{ preview: false }
)

// Clean up content provider when diff view is closed
const cleanupDisposable = vscode.window.onDidChangeVisibleTextEditors(() => {
const isDiffViewOpen = vscode.window.visibleTextEditors.some(
(editor) => editor.document.uri.toString() === originalFileUri.toString()
)
if (!isDiffViewOpen) {
disposable.dispose()
cleanupDisposable.dispose()
}
})
} catch (error) {
disposable.dispose()
languageClient.error(`[VSCode Client] Failed to open diff view: ${error}`)
}
await ecc.viewDiff(viewDiffMessage, amazonQDiffScheme)
})

languageClient.onNotification(chatUpdateNotificationType.method, (params: ChatUpdateParams) => {
Expand Down
Loading