Skip to content

Commit a84a7c1

Browse files
authored
refactor(codewhisperer): onAccept command (#2901)
1 parent a535688 commit a84a7c1

File tree

5 files changed

+92
-58
lines changed

5 files changed

+92
-58
lines changed

src/codewhisperer/activation.ts

Lines changed: 8 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ import { getCompletionItems } from './service/completionProvider'
1212
import { vsCodeState, ConfigurationEntry } from './models/model'
1313
import { InlineCompletion } from './service/inlineCompletion'
1414
import { invokeRecommendation } from './commands/invokeRecommendation'
15-
import { onAcceptance } from './commands/onAcceptance'
16-
import { onInlineAcceptance } from './commands/onInlineAcceptance'
15+
import { acceptSuggestion } from './commands/onInlineAcceptance'
1716
import { resetIntelliSenseState } from './util/globalStateUtil'
1817
import { CodeWhispererSettings } from './util/codewhispererSettings'
1918
import { ExtContext } from '../shared/extensions'
@@ -48,11 +47,6 @@ import { InlineCompletionService } from './service/inlineCompletionService'
4847
import { isInlineCompletionEnabled } from './util/commonUtil'
4948
import { HoverConfigUtil } from './util/hoverConfigUtil'
5049
import { CodeWhispererCodeCoverageTracker } from './tracker/codewhispererCodeCoverageTracker'
51-
import {
52-
CodewhispererCompletionType,
53-
CodewhispererLanguage,
54-
CodewhispererTriggerType,
55-
} from '../shared/telemetry/telemetry'
5650

5751
const performance = globalThis.performance ?? require('perf_hooks').performance
5852

@@ -85,12 +79,6 @@ export async function activate(context: ExtContext): Promise<void> {
8579
*/
8680
const client = new codewhispererClient.DefaultCodeWhispererClient()
8781

88-
const referenceHoverProvider = new ReferenceHoverProvider()
89-
const referenceLogViewProvider = new ReferenceLogViewProvider(
90-
context.extensionContext.extensionUri,
91-
codewhispererSettings
92-
)
93-
9482
context.extensionContext.subscriptions.push(
9583
/**
9684
* Configuration change
@@ -111,7 +99,7 @@ export async function activate(context: ExtContext): Promise<void> {
11199
vscode.commands.executeCommand('aws.codeWhisperer.refresh')
112100
}
113101
if (configurationChangeEvent.affectsConfiguration('aws.codeWhisperer')) {
114-
referenceLogViewProvider.update()
102+
ReferenceLogViewProvider.instance.update()
115103
}
116104
if (configurationChangeEvent.affectsConfiguration('editor.inlineSuggest.enabled')) {
117105
await vscode.window
@@ -183,51 +171,18 @@ export async function activate(context: ExtContext): Promise<void> {
183171
/**
184172
* On recommendation acceptance
185173
*/
186-
Commands.register(
187-
'aws.codeWhisperer.accept',
188-
async (
189-
range: vscode.Range,
190-
acceptIndex: number,
191-
recommendation: string,
192-
requestId: string,
193-
sessionId: string,
194-
triggerType: CodewhispererTriggerType,
195-
completionType: CodewhispererCompletionType,
196-
language: CodewhispererLanguage,
197-
references: codewhispererClient.References
198-
) => {
199-
const editor = vscode.window.activeTextEditor
200-
const onAcceptanceFunc = isInlineCompletionEnabled() ? onInlineAcceptance : onAcceptance
201-
await onAcceptanceFunc(
202-
{
203-
editor,
204-
range,
205-
acceptIndex,
206-
recommendation,
207-
requestId,
208-
sessionId,
209-
triggerType,
210-
completionType,
211-
language,
212-
references,
213-
},
214-
context.extensionContext.globalState
215-
)
216-
if (references != undefined && editor != undefined) {
217-
const referenceLog = ReferenceLogViewProvider.getReferenceLog(recommendation, references, editor)
218-
referenceLogViewProvider.addReferenceLog(referenceLog)
219-
referenceHoverProvider.addCodeReferences(recommendation, references)
220-
}
221-
}
222-
),
174+
acceptSuggestion.register(context),
223175
// on text document close.
224176
vscode.workspace.onDidCloseTextDocument(e => {
225177
RecommendationHandler.instance.reportUserDecisionOfCurrentRecommendation(vscode.window.activeTextEditor, -1)
226178
RecommendationHandler.instance.clearRecommendations()
227179
}),
228180

229-
vscode.languages.registerHoverProvider([...CodeWhispererConstants.supportedLanguages], referenceHoverProvider),
230-
vscode.window.registerWebviewViewProvider(ReferenceLogViewProvider.viewType, referenceLogViewProvider),
181+
vscode.languages.registerHoverProvider(
182+
[...CodeWhispererConstants.supportedLanguages],
183+
ReferenceHoverProvider.instance
184+
),
185+
vscode.window.registerWebviewViewProvider(ReferenceLogViewProvider.viewType, ReferenceLogViewProvider.instance),
231186
showReferenceLog.register(context),
232187
vscode.languages.registerCodeLensProvider(
233188
[...CodeWhispererConstants.supportedLanguages],

src/codewhisperer/commands/onAcceptance.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import { isCloud9 } from '../../shared/extensionUtilities'
1616
import { handleExtraBrackets } from '../util/closingBracketUtil'
1717
import { RecommendationHandler } from '../service/recommendationHandler'
1818
import { InlineCompletion } from '../service/inlineCompletion'
19+
import { ReferenceLogViewProvider } from '../service/referenceLogViewProvider'
20+
import { ReferenceHoverProvider } from '../service/referenceHoverProvider'
1921

2022
/**
2123
* This function is called when user accepts a intelliSense suggestion or an inline suggestion
@@ -100,6 +102,18 @@ export async function onAcceptance(acceptanceEntry: OnRecommendationAcceptanceEn
100102
acceptanceEntry.editor.document.getText(codeRangeAfterFormat),
101103
acceptanceEntry.editor.document.fileName
102104
)
105+
if (acceptanceEntry.references !== undefined) {
106+
const referenceLog = ReferenceLogViewProvider.getReferenceLog(
107+
acceptanceEntry.recommendation,
108+
acceptanceEntry.references,
109+
acceptanceEntry.editor
110+
)
111+
ReferenceLogViewProvider.instance.addReferenceLog(referenceLog)
112+
ReferenceHoverProvider.instance.addCodeReferences(
113+
acceptanceEntry.recommendation,
114+
acceptanceEntry.references
115+
)
116+
}
103117
}
104118

105119
// at the end of recommendation acceptance, clear recommendations.

src/codewhisperer/commands/onInlineAcceptance.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,52 @@ import { RecommendationHandler } from '../service/recommendationHandler'
1616
import { InlineCompletionService } from '../service/inlineCompletionService'
1717
import { sleep } from '../../shared/utilities/timeoutUtils'
1818
import { handleExtraBrackets } from '../util/closingBracketUtil'
19+
import { Commands } from '../../shared/vscode/commands2'
20+
import { isInlineCompletionEnabled } from '../util/commonUtil'
21+
import { ExtContext } from '../../shared/extensions'
22+
import { onAcceptance } from './onAcceptance'
23+
import * as codewhispererClient from '../client/codewhisperer'
24+
import {
25+
CodewhispererCompletionType,
26+
CodewhispererLanguage,
27+
CodewhispererTriggerType,
28+
} from '../../shared/telemetry/telemetry.gen'
29+
import { ReferenceLogViewProvider } from '../service/referenceLogViewProvider'
30+
import { ReferenceHoverProvider } from '../service/referenceHoverProvider'
1931

32+
export const acceptSuggestion = Commands.declare(
33+
'aws.codeWhisperer.accept',
34+
(context: ExtContext) =>
35+
async (
36+
range: vscode.Range,
37+
acceptIndex: number,
38+
recommendation: string,
39+
requestId: string,
40+
sessionId: string,
41+
triggerType: CodewhispererTriggerType,
42+
completionType: CodewhispererCompletionType,
43+
language: CodewhispererLanguage,
44+
references: codewhispererClient.References
45+
) => {
46+
const editor = vscode.window.activeTextEditor
47+
const onAcceptanceFunc = isInlineCompletionEnabled() ? onInlineAcceptance : onAcceptance
48+
await onAcceptanceFunc(
49+
{
50+
editor,
51+
range,
52+
acceptIndex,
53+
recommendation,
54+
requestId,
55+
sessionId,
56+
triggerType,
57+
completionType,
58+
language,
59+
references,
60+
},
61+
context.extensionContext.globalState
62+
)
63+
}
64+
)
2065
/**
2166
* This function is called when user accepts a intelliSense suggestion or an inline suggestion
2267
*/
@@ -91,6 +136,18 @@ export async function onInlineAcceptance(
91136
acceptanceEntry.editor.document.getText(codeRangeAfterFormat),
92137
acceptanceEntry.editor.document.fileName
93138
)
139+
if (acceptanceEntry.references !== undefined) {
140+
const referenceLog = ReferenceLogViewProvider.getReferenceLog(
141+
acceptanceEntry.recommendation,
142+
acceptanceEntry.references,
143+
acceptanceEntry.editor
144+
)
145+
ReferenceLogViewProvider.instance.addReferenceLog(referenceLog)
146+
ReferenceHoverProvider.instance.addCodeReferences(
147+
acceptanceEntry.recommendation,
148+
acceptanceEntry.references
149+
)
150+
}
94151
}
95152

96153
// at the end of recommendation acceptance, clear recommendations.

src/codewhisperer/service/referenceHoverProvider.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ interface CodeReference {
1515

1616
export class ReferenceHoverProvider implements vscode.HoverProvider {
1717
private _codeReferenceCache: CodeReference[] = []
18+
static #instance: ReferenceHoverProvider
1819

20+
public static get instance() {
21+
return (this.#instance ??= new this())
22+
}
1923
public provideHover(
2024
document: vscode.TextDocument,
2125
position: vscode.Position,

src/codewhisperer/service/referenceLogViewProvider.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,20 @@ import { References } from '../client/codewhisperer'
88
import { LicenseUtil } from '../util/licenseUtil'
99
import * as CodeWhispererConstants from '../models/constants'
1010
import { CodeWhispererSettings } from '../util/codewhispererSettings'
11+
import globals from '../../shared/extensionGlobals'
1112
import { isCloud9 } from '../../shared/extensionUtilities'
1213
import { TelemetryHelper } from '../util/telemetryHelper'
1314

1415
export class ReferenceLogViewProvider implements vscode.WebviewViewProvider {
1516
public static readonly viewType = 'aws.codeWhisperer.referenceLog'
1617
private _view?: vscode.WebviewView
1718
private _referenceLogs: string[] = []
18-
private _settings: CodeWhispererSettings
19-
constructor(private readonly _extensionUri: vscode.Uri, settings: CodeWhispererSettings) {
20-
this._settings = settings
19+
private _extensionUri: vscode.Uri = globals.context.extensionUri
20+
constructor() {}
21+
static #instance: ReferenceLogViewProvider
22+
23+
public static get instance() {
24+
return (this.#instance ??= new this())
2125
}
2226

2327
public resolveWebviewView(
@@ -34,7 +38,7 @@ export class ReferenceLogViewProvider implements vscode.WebviewViewProvider {
3438
}
3539
this._view.webview.html = this.getHtml(
3640
webviewView.webview,
37-
this._settings.isIncludeSuggestionsWithCodeReferencesEnabled()
41+
CodeWhispererSettings.instance.isIncludeSuggestionsWithCodeReferencesEnabled()
3842
)
3943
this._view.webview.onDidReceiveMessage(data => {
4044
vscode.commands.executeCommand('aws.codeWhisperer.configure', 'codewhisperer')
@@ -43,7 +47,7 @@ export class ReferenceLogViewProvider implements vscode.WebviewViewProvider {
4347

4448
public async update() {
4549
if (this._view) {
46-
const showPrompt = this._settings.isIncludeSuggestionsWithCodeReferencesEnabled()
50+
const showPrompt = CodeWhispererSettings.instance.isIncludeSuggestionsWithCodeReferencesEnabled()
4751
this._view.webview.html = this.getHtml(this._view.webview, showPrompt)
4852
}
4953
}

0 commit comments

Comments
 (0)