Skip to content

Commit 69db397

Browse files
authored
fix(amazonq): auto-review doesn't populate treeview (#6502)
## Problem Issues detected by auto-review feature are not populating the code issues treeview list unless you run a manual `/review` first. <img width="1594" alt="Screenshot 2025-02-04 at 3 00 08 PM" src="https://github.com/user-attachments/assets/4b817fad-a17e-4ce6-8374-fb81634f18b1" /> This issue is happening because `vscode.window.createTreeView` is hidden inside `SecurityIssuesTree` class which only gets invoked when you call `SecurityIssuesTree.instance.focus()`. Since we don't want to focus the tree view for auto-reviews, the treeview itself is never created. ## Solution Move the treeview creation to activation so that it always gets created when the extension is activated --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent 0cc411a commit 69db397

File tree

6 files changed

+19
-33
lines changed

6 files changed

+19
-33
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type": "Bug Fix",
3+
"description": "/review: Auto-review issues did not populate code issues list"
4+
}

packages/core/src/codewhisperer/activation.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,9 @@ export async function activate(context: ExtContext): Promise<void> {
596596
CodeWhispererConstants.amazonqIgnoreNextLine
597597
)
598598
)
599+
}),
600+
vscode.window.createTreeView(SecurityIssueTreeViewProvider.viewType, {
601+
treeDataProvider: SecurityIssueTreeViewProvider.instance,
599602
})
600603
)
601604
}

packages/core/src/codewhisperer/commands/startSecurityScan.ts

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ import {
4747
MaximumProjectScanReachedError,
4848
SecurityScanError,
4949
} from '../models/errors'
50-
import { SecurityIssuesTree } from '../service/securityIssueTreeViewProvider'
50+
import { SecurityIssueTreeViewProvider } from '../service/securityIssueTreeViewProvider'
5151
import { ChatSessionManager } from '../../amazonqScan/chat/storages/chatSession'
5252
import { TelemetryHelper } from '../util/telemetryHelper'
5353

@@ -385,13 +385,6 @@ export function showSecurityScanResults(
385385
totalIssues: number
386386
) {
387387
initSecurityScanRender(securityRecommendationCollection, context, editor, scope)
388-
if (
389-
totalIssues > 0 &&
390-
(scope === CodeWhispererConstants.CodeAnalysisScope.PROJECT ||
391-
scope === CodeWhispererConstants.CodeAnalysisScope.FILE_ON_DEMAND)
392-
) {
393-
SecurityIssuesTree.instance.focus()
394-
}
395388

396389
if (scope === CodeWhispererConstants.CodeAnalysisScope.PROJECT) {
397390
populateCodeScanLogStream(zipMetadata.scannedFiles)
@@ -431,7 +424,7 @@ export function showScanResultsInChat(
431424

432425
initSecurityScanRender(securityRecommendationCollection, context, editor, scope)
433426
if (totalIssues > 0) {
434-
SecurityIssuesTree.instance.focus()
427+
SecurityIssueTreeViewProvider.focus()
435428
}
436429

437430
populateCodeScanLogStream(zipMetadata.scannedFiles)
@@ -531,7 +524,7 @@ function showScanCompletedNotification(total: number, scannedFiles: Set<string>)
531524
const items = [CodeWhispererConstants.showScannedFilesMessage]
532525
void vscode.window.showInformationMessage(`Code Review Completed`, ...items).then((value) => {
533526
if (total > 0 && value === CodeWhispererConstants.showScannedFilesMessage) {
534-
SecurityIssuesTree.instance.focus()
527+
SecurityIssueTreeViewProvider.focus()
535528
}
536529
})
537530
}

packages/core/src/codewhisperer/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ export { SecurityIssueCodeActionProvider } from './service/securityIssueCodeActi
4949
export {
5050
SecurityIssueTreeViewProvider,
5151
SecurityViewTreeItem,
52-
SecurityIssuesTree,
5352
FileItem,
5453
IssueItem,
5554
SeverityItem,

packages/core/src/codewhisperer/service/securityIssueTreeViewProvider.ts

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,12 @@ export class SecurityIssueTreeViewProvider implements vscode.TreeDataProvider<Se
106106
public refresh(): void {
107107
this._onDidChangeTreeData.fire()
108108
}
109+
110+
public static focus() {
111+
void vscode.commands.executeCommand('aws.amazonq.SecurityIssuesTree.focus').then(undefined, (e) => {
112+
getLogger().error('SecurityIssuesTree focus failed: %s', e.message)
113+
})
114+
}
109115
}
110116

111117
enum ContextValue {
@@ -205,22 +211,3 @@ export class IssueItem extends vscode.TreeItem {
205211
return markdown
206212
}
207213
}
208-
209-
export class SecurityIssuesTree {
210-
static #instance: SecurityIssuesTree
211-
public static get instance() {
212-
return (this.#instance ??= new this())
213-
}
214-
215-
constructor() {
216-
vscode.window.createTreeView(SecurityIssueTreeViewProvider.viewType, {
217-
treeDataProvider: SecurityIssueTreeViewProvider.instance,
218-
})
219-
}
220-
221-
public focus() {
222-
void vscode.commands.executeCommand('aws.amazonq.SecurityIssuesTree.focus').then(undefined, (e) => {
223-
getLogger().error('SecurityIssuesTree focus failed: %s', e.message)
224-
})
225-
}
226-
}

packages/core/src/test/codewhisperer/startSecurityScan.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import {
2828
import * as model from '../../codewhisperer/models/model'
2929
import * as errors from '../../shared/errors'
3030
import * as timeoutUtils from '../../shared/utilities/timeoutUtils'
31-
import { SecurityIssuesTree } from '../../codewhisperer'
31+
import { SecurityIssueTreeViewProvider } from '../../codewhisperer'
3232
import { createClient, mockGetCodeScanResponse } from './testUtil'
3333

3434
let extensionContext: FakeExtensionContext
@@ -48,7 +48,7 @@ describe('startSecurityScan', function () {
4848
editor = await openTestFile(appCodePath)
4949
await model.CodeScansState.instance.setScansEnabled(false)
5050
sinon.stub(timeoutUtils, 'sleep')
51-
focusStub = sinon.stub(SecurityIssuesTree.instance, 'focus')
51+
focusStub = sinon.stub(SecurityIssueTreeViewProvider, 'focus')
5252
})
5353
afterEach(function () {
5454
sinon.restore()
@@ -74,7 +74,7 @@ describe('startSecurityScan', function () {
7474
createClient(),
7575
extensionContext,
7676
CodeAnalysisScope.PROJECT,
77-
false
77+
true
7878
)
7979
assert.ok(focusStub.calledOnce)
8080
assert.ok(securityScanRenderSpy.calledOnce)

0 commit comments

Comments
 (0)