Skip to content

Commit f93a6bf

Browse files
committed
refactor(amazonq): Move codewhisperer activation from core to amazonq
1 parent bdc49eb commit f93a6bf

File tree

4 files changed

+127
-114
lines changed

4 files changed

+127
-114
lines changed

packages/amazonq/src/extension.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,7 @@
44
*/
55

66
import { AuthUtils, CredentialsStore, LoginManager, initializeAuth } from 'aws-core-vscode/auth'
7-
import {
8-
activate as activateCodeWhisperer,
9-
shutdown as shutdownCodeWhisperer,
10-
activateInlineCompletion,
11-
} from 'aws-core-vscode/codewhisperer'
7+
import { activate as activateCodeWhisperer, shutdown as shutdownCodeWhisperer } from 'aws-core-vscode/codewhisperer'
128
import { makeEndpointsProvider, registerGenericCommands } from 'aws-core-vscode'
139
import { CommonAuthWebview } from 'aws-core-vscode/login'
1410
import {
@@ -45,6 +41,7 @@ import * as vscode from 'vscode'
4541
import { registerCommands } from './commands'
4642
import { focusAmazonQPanel } from 'aws-core-vscode/codewhispererChat'
4743
import { activate as activateAmazonqLsp } from './lsp/activation'
44+
import { activate as activateInlineCompletion } from './inline/activation'
4845

4946
export const amazonQContextPrefix = 'amazonq'
5047

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
/*!
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
import vscode from 'vscode'
7+
import {
8+
AuthUtil,
9+
CodeSuggestionsState,
10+
CodeWhispererCodeCoverageTracker,
11+
CodeWhispererConstants,
12+
CodeWhispererSettings,
13+
ConfigurationEntry,
14+
DefaultCodeWhispererClient,
15+
invokeRecommendation,
16+
isInlineCompletionEnabled,
17+
KeyStrokeHandler,
18+
RecommendationHandler,
19+
runtimeLanguageContext,
20+
TelemetryHelper,
21+
UserWrittenCodeTracker,
22+
vsCodeState,
23+
} from 'aws-core-vscode/codewhisperer'
24+
import { Commands, getLogger, globals, sleep } from 'aws-core-vscode/shared'
25+
26+
export async function activate() {
27+
const codewhispererSettings = CodeWhispererSettings.instance
28+
const client = new DefaultCodeWhispererClient()
29+
30+
if (isInlineCompletionEnabled()) {
31+
await setSubscriptionsforInlineCompletion()
32+
await AuthUtil.instance.setVscodeContextProps()
33+
}
34+
35+
function getAutoTriggerStatus(): boolean {
36+
return CodeSuggestionsState.instance.isSuggestionsEnabled()
37+
}
38+
39+
async function getConfigEntry(): Promise<ConfigurationEntry> {
40+
const isShowMethodsEnabled: boolean =
41+
vscode.workspace.getConfiguration('editor').get('suggest.showMethods') || false
42+
const isAutomatedTriggerEnabled: boolean = getAutoTriggerStatus()
43+
const isManualTriggerEnabled: boolean = true
44+
const isSuggestionsWithCodeReferencesEnabled = codewhispererSettings.isSuggestionsWithCodeReferencesEnabled()
45+
46+
// TODO:remove isManualTriggerEnabled
47+
return {
48+
isShowMethodsEnabled,
49+
isManualTriggerEnabled,
50+
isAutomatedTriggerEnabled,
51+
isSuggestionsWithCodeReferencesEnabled,
52+
}
53+
}
54+
55+
async function setSubscriptionsforInlineCompletion() {
56+
RecommendationHandler.instance.subscribeSuggestionCommands()
57+
58+
/**
59+
* Automated trigger
60+
*/
61+
globals.context.subscriptions.push(
62+
vscode.window.onDidChangeActiveTextEditor(async (editor) => {
63+
await RecommendationHandler.instance.onEditorChange()
64+
}),
65+
vscode.window.onDidChangeWindowState(async (e) => {
66+
await RecommendationHandler.instance.onFocusChange()
67+
}),
68+
vscode.window.onDidChangeTextEditorSelection(async (e) => {
69+
await RecommendationHandler.instance.onCursorChange(e)
70+
}),
71+
vscode.workspace.onDidChangeTextDocument(async (e) => {
72+
const editor = vscode.window.activeTextEditor
73+
if (!editor) {
74+
return
75+
}
76+
if (e.document !== editor.document) {
77+
return
78+
}
79+
if (!runtimeLanguageContext.isLanguageSupported(e.document)) {
80+
return
81+
}
82+
83+
CodeWhispererCodeCoverageTracker.getTracker(e.document.languageId)?.countTotalTokens(e)
84+
UserWrittenCodeTracker.instance.onTextDocumentChange(e)
85+
/**
86+
* Handle this keystroke event only when
87+
* 1. It is not a backspace
88+
* 2. It is not caused by CodeWhisperer editing
89+
* 3. It is not from undo/redo.
90+
*/
91+
if (e.contentChanges.length === 0 || vsCodeState.isCodeWhispererEditing) {
92+
return
93+
}
94+
95+
if (vsCodeState.lastUserModificationTime) {
96+
TelemetryHelper.instance.setTimeSinceLastModification(
97+
performance.now() - vsCodeState.lastUserModificationTime
98+
)
99+
}
100+
vsCodeState.lastUserModificationTime = performance.now()
101+
/**
102+
* Important: Doing this sleep(10) is to make sure
103+
* 1. this event is processed by vs code first
104+
* 2. editor.selection.active has been successfully updated by VS Code
105+
* Then this event can be processed by our code.
106+
*/
107+
await sleep(CodeWhispererConstants.vsCodeCursorUpdateDelay)
108+
if (!RecommendationHandler.instance.isSuggestionVisible()) {
109+
await KeyStrokeHandler.instance.processKeyStroke(e, editor, client, await getConfigEntry())
110+
}
111+
}),
112+
// manual trigger
113+
Commands.register({ id: 'aws.amazonq.invokeInlineCompletion', autoconnect: true }, async () => {
114+
invokeRecommendation(
115+
vscode.window.activeTextEditor as vscode.TextEditor,
116+
client,
117+
await getConfigEntry()
118+
).catch((e) => {
119+
getLogger().error('invokeRecommendation failed: %s', (e as Error).message)
120+
})
121+
})
122+
)
123+
}
124+
}

packages/core/src/codewhisperer/activation.ts

Lines changed: 0 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,21 @@
66
import * as vscode from 'vscode'
77
import * as nls from 'vscode-nls'
88
import { getTabSizeSetting } from '../shared/utilities/editorUtilities'
9-
import { KeyStrokeHandler } from './service/keyStrokeHandler'
109
import * as EditorContext from './util/editorContext'
1110
import * as CodeWhispererConstants from './models/constants'
1211
import {
13-
vsCodeState,
14-
ConfigurationEntry,
1512
CodeSuggestionsState,
1613
CodeScansState,
1714
SecurityTreeViewFilterState,
1815
AggregatedCodeScanIssue,
1916
CodeScanIssue,
2017
CodeIssueGroupingStrategyState,
2118
} from './models/model'
22-
import { invokeRecommendation } from './commands/invokeRecommendation'
2319
import { acceptSuggestion } from './commands/onInlineAcceptance'
2420
import { CodeWhispererSettings } from './util/codewhispererSettings'
2521
import { ExtContext } from '../shared/extensions'
2622
import { CodeWhispererTracker } from './tracker/codewhispererTracker'
2723
import * as codewhispererClient from './client/codewhisperer'
28-
import { runtimeLanguageContext } from './util/runtimeLanguageContext'
2924
import { getLogger } from '../shared/logger'
3025
import {
3126
enableCodeSuggestions,
@@ -59,7 +54,6 @@ import {
5954
showExploreAgentsView,
6055
showCodeIssueGroupingQuickPick,
6156
} from './commands/basicCommands'
62-
import { sleep } from '../shared/utilities/timeoutUtils'
6357
import { ReferenceLogViewProvider } from './service/referenceLogViewProvider'
6458
import { ReferenceHoverProvider } from './service/referenceHoverProvider'
6559
import { ReferenceInlineProvider } from './service/referenceInlineProvider'
@@ -73,7 +67,6 @@ import { RecommendationHandler } from './service/recommendationHandler'
7367
import { Commands, registerCommandErrorHandler, registerDeclaredCommands } from '../shared/vscode/commands2'
7468
import { InlineCompletionService, refreshStatusBar } from './service/inlineCompletionService'
7569
import { isInlineCompletionEnabled } from './util/commonUtil'
76-
import { CodeWhispererCodeCoverageTracker } from './tracker/codewhispererCodeCoverageTracker'
7770
import { AuthUtil } from './util/authUtil'
7871
import { ImportAdderProvider } from './service/importAdderProvider'
7972
import { TelemetryHelper } from './util/telemetryHelper'
@@ -97,8 +90,6 @@ import { SecurityIssueTreeViewProvider } from './service/securityIssueTreeViewPr
9790
import { setContext } from '../shared/vscode/setContext'
9891
import { syncSecurityIssueWebview } from './views/securityIssue/securityIssueWebview'
9992
import { detectCommentAboveLine } from '../shared/utilities/commentUtils'
100-
import { UserWrittenCodeTracker } from './tracker/userWrittenCodeTracker'
101-
import globals from '../shared/extensionGlobals'
10293

10394
let localize: nls.LocalizeFunc
10495

@@ -507,105 +498,6 @@ export async function activate(context: ExtContext): Promise<void> {
507498
}
508499
}
509500

510-
export async function activateInlineCompletion() {
511-
const codewhispererSettings = CodeWhispererSettings.instance
512-
const client = new codewhispererClient.DefaultCodeWhispererClient()
513-
514-
if (isInlineCompletionEnabled()) {
515-
await setSubscriptionsforInlineCompletion()
516-
await AuthUtil.instance.setVscodeContextProps()
517-
}
518-
519-
function getAutoTriggerStatus(): boolean {
520-
return CodeSuggestionsState.instance.isSuggestionsEnabled()
521-
}
522-
523-
async function getConfigEntry(): Promise<ConfigurationEntry> {
524-
const isShowMethodsEnabled: boolean =
525-
vscode.workspace.getConfiguration('editor').get('suggest.showMethods') || false
526-
const isAutomatedTriggerEnabled: boolean = getAutoTriggerStatus()
527-
const isManualTriggerEnabled: boolean = true
528-
const isSuggestionsWithCodeReferencesEnabled = codewhispererSettings.isSuggestionsWithCodeReferencesEnabled()
529-
530-
// TODO:remove isManualTriggerEnabled
531-
return {
532-
isShowMethodsEnabled,
533-
isManualTriggerEnabled,
534-
isAutomatedTriggerEnabled,
535-
isSuggestionsWithCodeReferencesEnabled,
536-
}
537-
}
538-
539-
async function setSubscriptionsforInlineCompletion() {
540-
RecommendationHandler.instance.subscribeSuggestionCommands()
541-
/**
542-
* Automated trigger
543-
*/
544-
globals.context.subscriptions.push(
545-
vscode.window.onDidChangeActiveTextEditor(async (editor) => {
546-
await RecommendationHandler.instance.onEditorChange()
547-
}),
548-
vscode.window.onDidChangeWindowState(async (e) => {
549-
await RecommendationHandler.instance.onFocusChange()
550-
}),
551-
vscode.window.onDidChangeTextEditorSelection(async (e) => {
552-
await RecommendationHandler.instance.onCursorChange(e)
553-
}),
554-
vscode.workspace.onDidChangeTextDocument(async (e) => {
555-
const editor = vscode.window.activeTextEditor
556-
if (!editor) {
557-
return
558-
}
559-
if (e.document !== editor.document) {
560-
return
561-
}
562-
if (!runtimeLanguageContext.isLanguageSupported(e.document)) {
563-
return
564-
}
565-
566-
CodeWhispererCodeCoverageTracker.getTracker(e.document.languageId)?.countTotalTokens(e)
567-
UserWrittenCodeTracker.instance.onTextDocumentChange(e)
568-
/**
569-
* Handle this keystroke event only when
570-
* 1. It is not a backspace
571-
* 2. It is not caused by CodeWhisperer editing
572-
* 3. It is not from undo/redo.
573-
*/
574-
if (e.contentChanges.length === 0 || vsCodeState.isCodeWhispererEditing) {
575-
return
576-
}
577-
578-
if (vsCodeState.lastUserModificationTime) {
579-
TelemetryHelper.instance.setTimeSinceLastModification(
580-
performance.now() - vsCodeState.lastUserModificationTime
581-
)
582-
}
583-
vsCodeState.lastUserModificationTime = performance.now()
584-
/**
585-
* Important: Doing this sleep(10) is to make sure
586-
* 1. this event is processed by vs code first
587-
* 2. editor.selection.active has been successfully updated by VS Code
588-
* Then this event can be processed by our code.
589-
*/
590-
await sleep(CodeWhispererConstants.vsCodeCursorUpdateDelay)
591-
if (!RecommendationHandler.instance.isSuggestionVisible()) {
592-
await KeyStrokeHandler.instance.processKeyStroke(e, editor, client, await getConfigEntry())
593-
}
594-
}),
595-
// manual trigger
596-
Commands.register({ id: 'aws.amazonq.invokeInlineCompletion', autoconnect: true }, async () => {
597-
invokeRecommendation(
598-
vscode.window.activeTextEditor as vscode.TextEditor,
599-
client,
600-
await getConfigEntry()
601-
).catch((e) => {
602-
getLogger().error('invokeRecommendation failed: %s', (e as Error).message)
603-
})
604-
})
605-
)
606-
}
607-
}
608-
609501
export async function shutdown() {
610502
RecommendationHandler.instance.reportUserDecisions(-1)
611503
await CodeWhispererTracker.getTracker().shutdown()

packages/core/src/codewhisperer/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
export { activate, shutdown, activateInlineCompletion } from './activation'
6+
export { activate, shutdown } from './activation'
77
export * from './util/authUtil'
88
export * from './models/model'
99
export * from './models/constants'

0 commit comments

Comments
 (0)