Skip to content

Commit 94f66f0

Browse files
committed
fix: block completion before active edit is accepted/rejected
1 parent fc8242b commit 94f66f0

File tree

2 files changed

+18
-5
lines changed

2 files changed

+18
-5
lines changed

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

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,11 @@ export class EditDecorationManager {
136136
newCode: string,
137137
originalCodeHighlightRanges: Array<{ line: number; start: number; end: number }>
138138
): Promise<void> {
139-
await this.clearDecorations(editor)
140-
141-
await setContext('aws.amazonq.editSuggestionActive' as any, true)
142-
EditSuggestionState.setEditSuggestionActive(true)
139+
// Clear old decorations but don't reset state (state is already set in displaySvgDecoration)
140+
editor.setDecorations(this.imageDecorationType, [])
141+
editor.setDecorations(this.removedCodeDecorationType, [])
142+
this.currentImageDecoration = undefined
143+
this.currentRemovedCodeDecorations = []
143144

144145
this.acceptHandler = onAccept
145146
this.rejectHandler = onReject
@@ -313,8 +314,16 @@ export async function displaySvgDecoration(
313314
) {
314315
const originalCode = editor.document.getText()
315316

317+
// Set edit state immediately to prevent race condition with completion requests
318+
await setContext('aws.amazonq.editSuggestionActive' as any, true)
319+
EditSuggestionState.setEditSuggestionActive(true)
320+
316321
// Check if a completion suggestion is currently active - if so, discard edit suggestion
317322
if (inlineCompletionProvider && (await inlineCompletionProvider.isCompletionActive())) {
323+
// Clean up state since we're not showing the edit
324+
await setContext('aws.amazonq.editSuggestionActive' as any, false)
325+
EditSuggestionState.setEditSuggestionActive(false)
326+
318327
// Emit DISCARD telemetry for edit suggestion that can't be shown due to active completion
319328
const params = createDiscardTelemetryParams(session, item)
320329
languageClient.sendNotification('aws/logInlineCompletionSessionResults', params)
@@ -326,6 +335,10 @@ export async function displaySvgDecoration(
326335

327336
const isPatchValid = applyPatch(editor.document.getText(), item.insertText as string)
328337
if (!isPatchValid) {
338+
// Clean up state since we're not showing the edit
339+
await setContext('aws.amazonq.editSuggestionActive' as any, false)
340+
EditSuggestionState.setEditSuggestionActive(false)
341+
329342
const params = createDiscardTelemetryParams(session, item)
330343
// TODO: this session is closed on flare side hence discarded is not emitted in flare
331344
languageClient.sendNotification('aws/logInlineCompletionSessionResults', params)

packages/amazonq/src/app/inline/recommendationService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ export class RecommendationService {
138138
* Completions use PartialResultToken with single 1 call of [getAllRecommendations].
139139
* Edits leverage partialResultToken to achieve EditStreak such that clients can pull all continuous suggestions generated by the model within 1 EOS block.
140140
*/
141-
if (!isTriggerByDeletion && !request.partialResultToken) {
141+
if (!isTriggerByDeletion && !request.partialResultToken && !EditSuggestionState.isEditSuggestionActive()) {
142142
const completionPromise: Promise<InlineCompletionListWithReferences> = languageClient.sendRequest(
143143
inlineCompletionWithReferencesRequestType.method,
144144
request,

0 commit comments

Comments
 (0)