Skip to content

Commit f82944e

Browse files
authored
refactor(codewhisperer): Simplify pagination (#2904)
1 parent c3880f0 commit f82944e

File tree

2 files changed

+33
-31
lines changed

2 files changed

+33
-31
lines changed

src/codewhisperer/service/inlineCompletionService.ts

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -174,11 +174,15 @@ export class InlineCompletionService {
174174
private hide: vscode.Disposable
175175
private next: vscode.Disposable
176176
private prev: vscode.Disposable
177+
private _isPaginationRunning = false
177178

178179
constructor() {
179180
this.prev = prevCommand.register(this)
180181
this.next = nextCommand.register(this)
181182
this.hide = hideCommand.register(this)
183+
RecommendationHandler.instance.onDidReceiveRecommendation(e => {
184+
this.tryShowRecommendation()
185+
})
182186
}
183187

184188
static #instance: InlineCompletionService
@@ -196,7 +200,7 @@ export class InlineCompletionService {
196200
this.hide = hideCommand.register(this)
197201
}
198202

199-
subscribeCommands() {
203+
subscribeSuggestionCommands() {
200204
this.disposeCommandOverrides()
201205
this.registerCommandOverrides()
202206
globals.context.subscriptions.push(this.prev)
@@ -244,18 +248,38 @@ export class InlineCompletionService {
244248
this.clearRejectionTimer()
245249
}
246250

251+
async tryShowRecommendation() {
252+
const editor = vscode.window.activeTextEditor
253+
if (this.isSuggestionVisible() || editor === undefined) return
254+
if (
255+
editor.selection.active.isBefore(RecommendationHandler.instance.startPos) ||
256+
editor.document.uri.fsPath !== this.documentUri?.fsPath
257+
) {
258+
RecommendationHandler.instance.cancelPaginatedRequest()
259+
RecommendationHandler.instance.recommendations.forEach((r, i) => {
260+
RecommendationHandler.instance.setSuggestionState(i, 'Discard')
261+
})
262+
RecommendationHandler.instance.reportUserDecisionOfCurrentRecommendation(editor, -1)
263+
RecommendationHandler.instance.clearRecommendations()
264+
} else if (RecommendationHandler.instance.recommendations.length > 0) {
265+
RecommendationHandler.instance.moveStartPositionToSkipSpaces(editor)
266+
await HoverConfigUtil.instance.overwriteHoverConfig()
267+
this.subscribeSuggestionCommands()
268+
this.startRejectionTimer(editor)
269+
await this.showRecommendation(0, true)
270+
}
271+
}
272+
247273
async getPaginatedRecommendation(
248274
client: DefaultCodeWhispererClient,
249275
editor: vscode.TextEditor,
250276
triggerType: CodewhispererTriggerType,
251277
config: ConfigurationEntry,
252278
autoTriggerType?: CodewhispererAutomatedTriggerType
253279
) {
254-
if (vsCodeState.isCodeWhispererEditing || this.isPaginationRunning()) return
280+
if (vsCodeState.isCodeWhispererEditing || this._isPaginationRunning) return
255281
await this.clearInlineCompletionStates(editor)
256282
this.setCodeWhispererStatusBarLoading()
257-
await HoverConfigUtil.instance.overwriteHoverConfig()
258-
this.subscribeCommands()
259283
RecommendationHandler.instance.checkAndResetCancellationTokens()
260284
this.documentUri = editor.document.uri
261285
try {
@@ -270,32 +294,12 @@ export class InlineCompletionService {
270294
true,
271295
page
272296
)
273-
274297
if (RecommendationHandler.instance.checkAndResetCancellationTokens()) {
275298
RecommendationHandler.instance.reportUserDecisionOfCurrentRecommendation(editor, -1)
276299
RecommendationHandler.instance.clearRecommendations()
277300
this.setCodeWhispererStatusBarOk()
278301
return
279302
}
280-
281-
if (!this.isSuggestionVisible()) {
282-
if (
283-
editor.selection.active.isBefore(RecommendationHandler.instance.startPos) ||
284-
editor.document.uri.fsPath !== this.documentUri?.fsPath
285-
) {
286-
RecommendationHandler.instance.cancelPaginatedRequest()
287-
RecommendationHandler.instance.recommendations.forEach((r, i) => {
288-
RecommendationHandler.instance.setSuggestionState(i, 'Discard')
289-
})
290-
RecommendationHandler.instance.reportUserDecisionOfCurrentRecommendation(editor, -1)
291-
RecommendationHandler.instance.clearRecommendations()
292-
} else if (RecommendationHandler.instance.recommendations.length > 0) {
293-
RecommendationHandler.instance.moveStartPositionToSkipSpaces(editor)
294-
this.startRejectionTimer(editor)
295-
await this.showRecommendation(0, true)
296-
}
297-
}
298-
299303
if (!RecommendationHandler.instance.hasNextToken()) break
300304
page++
301305
}
@@ -310,9 +314,6 @@ export class InlineCompletionService {
310314
showTimedMessage(CodeWhispererConstants.noSuggestions, 2000)
311315
}
312316
}
313-
if (RecommendationHandler.instance.recommendations.length === 0) {
314-
await HoverConfigUtil.instance.restoreHoverConfig()
315-
}
316317
}
317318

318319
async showRecommendation(indexShift: number, isFirstRecommendation: boolean = false) {
@@ -349,11 +350,13 @@ export class InlineCompletionService {
349350
}
350351

351352
setCodeWhispererStatusBarLoading() {
353+
this._isPaginationRunning = true
352354
this.statusBar.text = ` $(loading~spin)CodeWhisperer`
353355
this.statusBar.show()
354356
}
355357

356358
setCodeWhispererStatusBarOk() {
359+
this._isPaginationRunning = false
357360
this.statusBar.text = ` $(check)CodeWhisperer`
358361
this.statusBar.show()
359362
}
@@ -366,10 +369,6 @@ export class InlineCompletionService {
366369
return this.inlineCompletionProvider?.getActiveItemIndex !== undefined
367370
}
368371

369-
isPaginationRunning() {
370-
return this.statusBar.text === ` $(loading~spin)CodeWhisperer`
371-
}
372-
373372
private clearRejectionTimer() {
374373
if (this._timer !== undefined) {
375374
clearTimeout(this._timer)

src/codewhisperer/service/recommendationHandler.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ export class RecommendationHandler {
4545
private cancellationToken: vscode.CancellationTokenSource
4646
public errorMessagePrompt: string
4747
public isGenerateRecommendationInProgress: boolean
48+
private _onDidReceiveRecommendation: vscode.EventEmitter<void> = new vscode.EventEmitter<void>()
49+
public readonly onDidReceiveRecommendation: vscode.Event<void> = this._onDidReceiveRecommendation.event
4850

4951
constructor() {
5052
this.requestId = ''
@@ -279,6 +281,7 @@ export class RecommendationHandler {
279281
}
280282
})
281283
this.recommendations = isCloud9() ? recommendation : this.recommendations.concat(recommendation)
284+
this._onDidReceiveRecommendation.fire()
282285
} else {
283286
TelemetryHelper.instance.recordUserDecisionTelemetryForEmptyList(
284287
requestId,

0 commit comments

Comments
 (0)