Skip to content

Commit a5b6c10

Browse files
Merge master into feature/ui-e2e-tests
2 parents 16fb9d8 + 01850cd commit a5b6c10

File tree

8 files changed

+31
-178
lines changed

8 files changed

+31
-178
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type": "Removal",
3+
"description": "Deprecate \"amazon q is generating...\" UI for inline suggestion"
4+
}

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -122,19 +122,19 @@ export class EditDecorationManager {
122122
/**
123123
* Displays an edit suggestion as an SVG image in the editor and highlights removed code
124124
*/
125-
public displayEditSuggestion(
125+
public async displayEditSuggestion(
126126
editor: vscode.TextEditor,
127127
svgImage: vscode.Uri,
128128
startLine: number,
129-
onAccept: () => void,
130-
onReject: () => void,
129+
onAccept: () => Promise<void>,
130+
onReject: () => Promise<void>,
131131
originalCode: string,
132132
newCode: string,
133133
originalCodeHighlightRanges: Array<{ line: number; start: number; end: number }>
134-
): void {
135-
this.clearDecorations(editor)
134+
): Promise<void> {
135+
await this.clearDecorations(editor)
136136

137-
void setContext('aws.amazonq.editSuggestionActive' as any, true)
137+
await setContext('aws.amazonq.editSuggestionActive' as any, true)
138138

139139
this.acceptHandler = onAccept
140140
this.rejectHandler = onReject
@@ -157,14 +157,14 @@ export class EditDecorationManager {
157157
/**
158158
* Clears all edit suggestion decorations
159159
*/
160-
public clearDecorations(editor: vscode.TextEditor): void {
160+
public async clearDecorations(editor: vscode.TextEditor): Promise<void> {
161161
editor.setDecorations(this.imageDecorationType, [])
162162
editor.setDecorations(this.removedCodeDecorationType, [])
163163
this.currentImageDecoration = undefined
164164
this.currentRemovedCodeDecorations = []
165165
this.acceptHandler = undefined
166166
this.rejectHandler = undefined
167-
void setContext('aws.amazonq.editSuggestionActive' as any, false)
167+
await setContext('aws.amazonq.editSuggestionActive' as any, false)
168168
}
169169

170170
/**
@@ -285,7 +285,7 @@ export async function displaySvgDecoration(
285285
) {
286286
const originalCode = editor.document.getText()
287287

288-
decorationManager.displayEditSuggestion(
288+
await decorationManager.displayEditSuggestion(
289289
editor,
290290
svgImage,
291291
startLine,
@@ -303,7 +303,7 @@ export async function displaySvgDecoration(
303303
// Move cursor to end of the actual changed content
304304
editor.selection = new vscode.Selection(endPosition, endPosition)
305305

306-
decorationManager.clearDecorations(editor)
306+
await decorationManager.clearDecorations(editor)
307307
const params: LogInlineCompletionSessionResultsParams = {
308308
sessionId: session.sessionId,
309309
completionSessionResult: {
@@ -330,10 +330,10 @@ export async function displaySvgDecoration(
330330
)
331331
}
332332
},
333-
() => {
333+
async () => {
334334
// Handle reject
335335
getLogger().info('Edit suggestion rejected')
336-
decorationManager.clearDecorations(editor)
336+
await decorationManager.clearDecorations(editor)
337337
const params: LogInlineCompletionSessionResultsParams = {
338338
sessionId: session.sessionId,
339339
completionSessionResult: {

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

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ import {
3636
noInlineSuggestionsMsg,
3737
ReferenceInlineProvider,
3838
} from 'aws-core-vscode/codewhisperer'
39-
import { InlineGeneratingMessage } from './inlineGeneratingMessage'
4039
import { LineTracker } from './stateTracker/lineTracker'
4140
import { InlineTutorialAnnotation } from './tutorials/inlineTutorialAnnotation'
4241
import { TelemetryHelper } from './telemetryHelper'
@@ -55,7 +54,7 @@ export class InlineCompletionManager implements Disposable {
5554
private sessionManager: SessionManager
5655
private recommendationService: RecommendationService
5756
private lineTracker: LineTracker
58-
private incomingGeneratingMessage: InlineGeneratingMessage
57+
5958
private inlineTutorialAnnotation: InlineTutorialAnnotation
6059
private readonly logSessionResultMessageName = 'aws/logInlineCompletionSessionResults'
6160
private documentChangeListener: Disposable
@@ -70,12 +69,7 @@ export class InlineCompletionManager implements Disposable {
7069
this.languageClient = languageClient
7170
this.sessionManager = sessionManager
7271
this.lineTracker = lineTracker
73-
this.incomingGeneratingMessage = new InlineGeneratingMessage(this.lineTracker)
74-
this.recommendationService = new RecommendationService(
75-
this.sessionManager,
76-
this.incomingGeneratingMessage,
77-
cursorUpdateRecorder
78-
)
72+
this.recommendationService = new RecommendationService(this.sessionManager, cursorUpdateRecorder)
7973
this.inlineTutorialAnnotation = inlineTutorialAnnotation
8074
this.inlineCompletionProvider = new AmazonQInlineCompletionItemProvider(
8175
languageClient,
@@ -105,7 +99,6 @@ export class InlineCompletionManager implements Disposable {
10599
public dispose(): void {
106100
if (this.disposable) {
107101
this.disposable.dispose()
108-
this.incomingGeneratingMessage.dispose()
109102
this.lineTracker.dispose()
110103
}
111104
if (this.documentChangeListener) {

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

Lines changed: 0 additions & 98 deletions
This file was deleted.

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
import { CancellationToken, InlineCompletionContext, Position, TextDocument } from 'vscode'
1212
import { LanguageClient } from 'vscode-languageclient'
1313
import { SessionManager } from './sessionManager'
14-
import { InlineGeneratingMessage } from './inlineGeneratingMessage'
1514
import { AuthUtil, CodeWhispererStatusBarManager } from 'aws-core-vscode/codewhisperer'
1615
import { TelemetryHelper } from './telemetryHelper'
1716
import { ICursorUpdateRecorder } from './cursorUpdateManager'
@@ -26,7 +25,6 @@ export interface GetAllRecommendationsOptions {
2625
export class RecommendationService {
2726
constructor(
2827
private readonly sessionManager: SessionManager,
29-
private readonly inlineGeneratingMessage: InlineGeneratingMessage,
3028
private cursorUpdateRecorder?: ICursorUpdateRecorder
3129
) {}
3230
/**
@@ -69,7 +67,6 @@ export class RecommendationService {
6967
try {
7068
// Show UI indicators only if UI is enabled
7169
if (options.showUi) {
72-
await this.inlineGeneratingMessage.showGenerating(context.triggerKind)
7370
await statusBar.setLoading()
7471
}
7572

@@ -165,7 +162,6 @@ export class RecommendationService {
165162
} finally {
166163
// Remove all UI indicators if UI is enabled
167164
if (options.showUi) {
168-
this.inlineGeneratingMessage.hideGenerating()
169165
void statusBar.refreshStatusBar() // effectively "stop loading"
170166
}
171167
}

packages/amazonq/test/unit/amazonq/apps/inline/completion.test.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import {
2626
ReferenceLogViewProvider,
2727
vsCodeState,
2828
} from 'aws-core-vscode/codewhisperer'
29-
import { InlineGeneratingMessage } from '../../../../../src/app/inline/inlineGeneratingMessage'
3029
import { LineTracker } from '../../../../../src/app/inline/stateTracker/lineTracker'
3130
import { InlineTutorialAnnotation } from '../../../../../src/app/inline/tutorials/inlineTutorialAnnotation'
3231

@@ -247,9 +246,8 @@ describe('InlineCompletionManager', () => {
247246

248247
beforeEach(() => {
249248
const lineTracker = new LineTracker()
250-
const activeStateController = new InlineGeneratingMessage(lineTracker)
251249
inlineTutorialAnnotation = new InlineTutorialAnnotation(lineTracker, mockSessionManager)
252-
recommendationService = new RecommendationService(mockSessionManager, activeStateController)
250+
recommendationService = new RecommendationService(mockSessionManager)
253251
vsCodeState.isRecommendationsActive = false
254252
mockSessionManager = {
255253
getActiveSession: getActiveSessionStub,

packages/amazonq/test/unit/amazonq/apps/inline/recommendationService.test.ts

Lines changed: 2 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import assert from 'assert'
1010
import { RecommendationService } from '../../../../../src/app/inline/recommendationService'
1111
import { SessionManager } from '../../../../../src/app/inline/sessionManager'
1212
import { createMockDocument } from 'aws-core-vscode/test'
13-
import { LineTracker } from '../../../../../src/app/inline/stateTracker/lineTracker'
14-
import { InlineGeneratingMessage } from '../../../../../src/app/inline/inlineGeneratingMessage'
1513
// Import CursorUpdateManager directly instead of the interface
1614
import { CursorUpdateManager } from '../../../../../src/app/inline/cursorUpdateManager'
1715
import { CodeWhispererStatusBarManager } from 'aws-core-vscode/codewhisperer'
@@ -22,8 +20,6 @@ describe('RecommendationService', () => {
2220
let sendRequestStub: sinon.SinonStub
2321
let sandbox: sinon.SinonSandbox
2422
let sessionManager: SessionManager
25-
let lineTracker: LineTracker
26-
let activeStateController: InlineGeneratingMessage
2723
let service: RecommendationService
2824
let cursorUpdateManager: CursorUpdateManager
2925
let statusBarStub: any
@@ -69,8 +65,6 @@ describe('RecommendationService', () => {
6965
} as unknown as LanguageClient
7066

7167
sessionManager = new SessionManager()
72-
lineTracker = new LineTracker()
73-
activeStateController = new InlineGeneratingMessage(lineTracker)
7468

7569
// Create cursor update manager mock
7670
cursorUpdateManager = {
@@ -94,7 +88,7 @@ describe('RecommendationService', () => {
9488
sandbox.stub(CodeWhispererStatusBarManager, 'instance').get(() => statusBarStub)
9589

9690
// Create the service without cursor update recorder initially
97-
service = new RecommendationService(sessionManager, activeStateController)
91+
service = new RecommendationService(sessionManager)
9892
})
9993

10094
afterEach(() => {
@@ -104,11 +98,7 @@ describe('RecommendationService', () => {
10498

10599
describe('constructor', () => {
106100
it('should initialize with optional cursorUpdateRecorder', () => {
107-
const serviceWithRecorder = new RecommendationService(
108-
sessionManager,
109-
activeStateController,
110-
cursorUpdateManager
111-
)
101+
const serviceWithRecorder = new RecommendationService(sessionManager, cursorUpdateManager)
112102

113103
// Verify the service was created with the recorder
114104
assert.strictEqual(serviceWithRecorder['cursorUpdateRecorder'], cursorUpdateManager)
@@ -232,26 +222,7 @@ describe('RecommendationService', () => {
232222
sinon.assert.calledOnce(cursorUpdateManager.recordCompletionRequest as sinon.SinonStub)
233223
})
234224

235-
// Helper function to setup UI test
236-
function setupUITest() {
237-
const mockFirstResult = {
238-
sessionId: 'test-session',
239-
items: [mockInlineCompletionItemOne],
240-
partialResultToken: undefined,
241-
}
242-
243-
sendRequestStub.resolves(mockFirstResult)
244-
245-
// Spy on the UI methods
246-
const showGeneratingStub = sandbox.stub(activeStateController, 'showGenerating').resolves()
247-
const hideGeneratingStub = sandbox.stub(activeStateController, 'hideGenerating')
248-
249-
return { showGeneratingStub, hideGeneratingStub }
250-
}
251-
252225
it('should not show UI indicators when showUi option is false', async () => {
253-
const { showGeneratingStub, hideGeneratingStub } = setupUITest()
254-
255226
// Call with showUi: false option
256227
await service.getAllRecommendations(
257228
languageClient,
@@ -267,15 +238,11 @@ describe('RecommendationService', () => {
267238
)
268239

269240
// Verify UI methods were not called
270-
sinon.assert.notCalled(showGeneratingStub)
271-
sinon.assert.notCalled(hideGeneratingStub)
272241
sinon.assert.notCalled(statusBarStub.setLoading)
273242
sinon.assert.notCalled(statusBarStub.refreshStatusBar)
274243
})
275244

276245
it('should show UI indicators when showUi option is true (default)', async () => {
277-
const { showGeneratingStub, hideGeneratingStub } = setupUITest()
278-
279246
// Call with default options (showUi: true)
280247
await service.getAllRecommendations(
281248
languageClient,
@@ -287,8 +254,6 @@ describe('RecommendationService', () => {
287254
)
288255

289256
// Verify UI methods were called
290-
sinon.assert.calledOnce(showGeneratingStub)
291-
sinon.assert.calledOnce(hideGeneratingStub)
292257
sinon.assert.calledOnce(statusBarStub.setLoading)
293258
sinon.assert.calledOnce(statusBarStub.refreshStatusBar)
294259
})
@@ -304,10 +269,6 @@ describe('RecommendationService', () => {
304269
// Set up UI options
305270
const options = { showUi: true }
306271

307-
// Stub the UI methods to avoid errors
308-
// const showGeneratingStub = sandbox.stub(activeStateController, 'showGenerating').resolves()
309-
const hideGeneratingStub = sandbox.stub(activeStateController, 'hideGenerating')
310-
311272
// Temporarily replace console.error with a no-op function to prevent test failure
312273
const originalConsoleError = console.error
313274
console.error = () => {}
@@ -328,7 +289,6 @@ describe('RecommendationService', () => {
328289
assert.deepStrictEqual(result, [])
329290

330291
// Verify the UI indicators were hidden even when an error occurs
331-
sinon.assert.calledOnce(hideGeneratingStub)
332292
sinon.assert.calledOnce(statusBarStub.refreshStatusBar)
333293
} finally {
334294
// Restore the original console.error function

0 commit comments

Comments
 (0)