Skip to content

Commit 9648809

Browse files
committed
feat(amazonq): discard edits suggestion when the cursor is too far away
1 parent b488df4 commit 9648809

File tree

2 files changed

+98
-16
lines changed

2 files changed

+98
-16
lines changed

packages/amazonq/src/app/inline/EditRendering/displayImage.ts

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import type { AmazonQInlineCompletionItemProvider } from '../completion'
1717
import { vsCodeState } from 'aws-core-vscode/codewhisperer'
1818

1919
const autoRejectEditCursorDistance = 25
20+
const autoDiscardEditCursorDistance = 10
2021

2122
export class EditDecorationManager {
2223
private imageDecorationType: vscode.TextEditorDecorationType
@@ -312,6 +313,18 @@ export async function displaySvgDecoration(
312313
item: InlineCompletionItemWithReferences,
313314
inlineCompletionProvider?: AmazonQInlineCompletionItemProvider
314315
) {
316+
// Check if edit is too far from current cursor position
317+
const currentCursorLine = editor.selection.active.line
318+
if (Math.abs(startLine - currentCursorLine) >= autoDiscardEditCursorDistance) {
319+
// Emit DISCARD telemetry for edit suggestion that can't be shown because the suggestion is too far away
320+
const params = createDiscardTelemetryParams(session, item)
321+
languageClient.sendNotification('aws/logInlineCompletionSessionResults', params)
322+
getLogger('nextEditPrediction').debug(
323+
`Auto discarded edit suggestion for suggestion that is too far away: ${item.insertText as string}`
324+
)
325+
return
326+
}
327+
315328
const originalCode = editor.document.getText()
316329

317330
// Set edit state immediately to prevent race condition with completion requests
@@ -399,9 +412,6 @@ export async function displaySvgDecoration(
399412
const endPosition = getEndOfEditPosition(originalCode, newCode)
400413
editor.selection = new vscode.Selection(endPosition, endPosition)
401414

402-
// Move cursor to end of the actual changed content
403-
editor.selection = new vscode.Selection(endPosition, endPosition)
404-
405415
await decorationManager.clearDecorations(editor)
406416
documentChangeListener.dispose()
407417
cursorChangeListener.dispose()
@@ -420,19 +430,6 @@ export async function displaySvgDecoration(
420430
}
421431
languageClient.sendNotification('aws/logInlineCompletionSessionResults', params)
422432
session.triggerOnAcceptance = true
423-
// VS Code triggers suggestion on every keystroke, temporarily disable trigger on acceptance
424-
// if (inlineCompletionProvider && session.editsStreakPartialResultToken) {
425-
// await inlineCompletionProvider.provideInlineCompletionItems(
426-
// editor.document,
427-
// endPosition,
428-
// {
429-
// triggerKind: vscode.InlineCompletionTriggerKind.Automatic,
430-
// selectedCompletionInfo: undefined,
431-
// },
432-
// new vscode.CancellationTokenSource().token,
433-
// { emitTelemetry: false, showUi: false, editsStreakToken: session.editsStreakPartialResultToken }
434-
// )
435-
// }
436433
},
437434
async (isDiscard: boolean) => {
438435
// Handle reject

packages/amazonq/test/unit/app/inline/EditRendering/displayImage.test.ts

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,91 @@ describe('EditDecorationManager', function () {
188188
})
189189
})
190190

191+
describe('displaySvgDecoration cursor distance auto-discard', function () {
192+
let sandbox: sinon.SinonSandbox
193+
let editorStub: sinon.SinonStubbedInstance<vscode.TextEditor>
194+
let languageClientStub: any
195+
let sessionStub: any
196+
let itemStub: any
197+
198+
beforeEach(function () {
199+
sandbox = sinon.createSandbox()
200+
const commonStubs = createCommonStubs(sandbox)
201+
editorStub = commonStubs.editorStub
202+
203+
languageClientStub = {
204+
sendNotification: sandbox.stub(),
205+
}
206+
207+
sessionStub = {
208+
sessionId: 'test-session',
209+
requestStartTime: Date.now(),
210+
firstCompletionDisplayLatency: 100,
211+
}
212+
213+
itemStub = {
214+
itemId: 'test-item',
215+
insertText: 'test content',
216+
}
217+
})
218+
219+
afterEach(function () {
220+
sandbox.restore()
221+
})
222+
223+
it('should send discard telemetry and return early when edit is 10+ lines away from cursor', async function () {
224+
// Set cursor at line 5
225+
editorStub.selection = {
226+
active: new vscode.Position(5, 0),
227+
} as any
228+
229+
// Try to display edit at line 20 (15 lines away)
230+
await displaySvgDecoration(
231+
editorStub as unknown as vscode.TextEditor,
232+
vscode.Uri.parse('data:image/svg+xml;base64,test'),
233+
20,
234+
'new code',
235+
[],
236+
sessionStub,
237+
languageClientStub,
238+
itemStub
239+
)
240+
241+
// Verify discard telemetry was sent
242+
sinon.assert.calledOnce(languageClientStub.sendNotification)
243+
const call = languageClientStub.sendNotification.getCall(0)
244+
assert.strictEqual(call.args[0], 'aws/logInlineCompletionSessionResults')
245+
assert.strictEqual(call.args[1].sessionId, 'test-session')
246+
assert.strictEqual(call.args[1].completionSessionResult['test-item'].discarded, true)
247+
})
248+
249+
it('should proceed normally when edit is within 10 lines of cursor', async function () {
250+
// Set cursor at line 5
251+
editorStub.selection = {
252+
active: new vscode.Position(5, 0),
253+
} as any
254+
255+
// Mock required dependencies for normal flow
256+
sandbox.stub(vscode.workspace, 'onDidChangeTextDocument').returns({ dispose: sandbox.stub() })
257+
sandbox.stub(vscode.window, 'onDidChangeTextEditorSelection').returns({ dispose: sandbox.stub() })
258+
259+
// Try to display edit at line 10 (5 lines away)
260+
await displaySvgDecoration(
261+
editorStub as unknown as vscode.TextEditor,
262+
vscode.Uri.parse('data:image/svg+xml;base64,test'),
263+
10,
264+
'new code',
265+
[],
266+
sessionStub,
267+
languageClientStub,
268+
itemStub
269+
)
270+
271+
// Verify no discard telemetry was sent (function should proceed normally)
272+
sinon.assert.notCalled(languageClientStub.sendNotification)
273+
})
274+
})
275+
191276
describe('displaySvgDecoration cursor distance auto-reject', function () {
192277
let sandbox: sinon.SinonSandbox
193278
let editorStub: sinon.SinonStubbedInstance<vscode.TextEditor>

0 commit comments

Comments
 (0)