Skip to content

Commit

Permalink
refactor(codewhisperer): remove duplicate code #4033
Browse files Browse the repository at this point in the history
  • Loading branch information
Will-ShaoHua authored Jan 4, 2024
1 parent 4bdcca3 commit 1e48a31
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 113 deletions.
61 changes: 3 additions & 58 deletions src/codewhisperer/commands/invokeRecommendation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,13 @@
*/

import * as vscode from 'vscode'
import { vsCodeState, ConfigurationEntry, GetRecommendationsResponse } from '../models/model'
import { vsCodeState, ConfigurationEntry } from '../models/model'
import { resetIntelliSenseState } from '../util/globalStateUtil'
import { DefaultCodeWhispererClient } from '../client/codewhisperer'
import { isCloud9 } from '../../shared/extensionUtilities'
import { RecommendationHandler } from '../service/recommendationHandler'
import { isInlineCompletionEnabled } from '../util/commonUtil'
import { InlineCompletionService } from '../service/inlineCompletionService'
import { AuthUtil } from '../util/authUtil'
import { ClassifierTrigger } from '../service/classifierTrigger'
import { isIamConnection } from '../../auth/connection'
import { session } from '../util/codeWhispererSession'
import { RecommendationService } from '../service/recommendationService'

/**
* This function is for manual trigger CodeWhisperer
Expand Down Expand Up @@ -56,56 +52,5 @@ export async function invokeRecommendation(
)
}

if (isCloud9('any')) {
// C9 manual trigger key alt/option + C is ALWAYS enabled because the VSC version C9 is on doesn't support setContextKey which is used for aws.codewhisperer.connected
// therefore we need a connection check if there is ANY connection(regardless of the connection's state) connected to CodeWhisperer on C9
if (!AuthUtil.instance.isConnected()) {
return
}

if (RecommendationHandler.instance.isGenerateRecommendationInProgress) {
return
}
RecommendationHandler.instance.checkAndResetCancellationTokens()
vsCodeState.isIntelliSenseActive = false
RecommendationHandler.instance.isGenerateRecommendationInProgress = true
try {
let response: GetRecommendationsResponse = {
result: 'Failed',
errorMessage: undefined,
}
if (isCloud9('classic') || isIamConnection(AuthUtil.instance.conn)) {
response = await RecommendationHandler.instance.getRecommendations(
client,
editor,
'OnDemand',
config,
undefined,
false
)
} else {
if (AuthUtil.instance.isConnectionExpired()) {
await AuthUtil.instance.showReauthenticatePrompt()
}
response = await RecommendationHandler.instance.getRecommendations(
client,
editor,
'OnDemand',
config,
undefined,
true
)
}
if (RecommendationHandler.instance.canShowRecommendationInIntelliSense(editor, true, response)) {
await vscode.commands.executeCommand('editor.action.triggerSuggest').then(() => {
vsCodeState.isIntelliSenseActive = true
})
}
} finally {
RecommendationHandler.instance.isGenerateRecommendationInProgress = false
}
} else if (isInlineCompletionEnabled()) {
ClassifierTrigger.instance.recordClassifierResultForManualTrigger(editor)
await InlineCompletionService.instance.getPaginatedRecommendation(client, editor, 'OnDemand', config)
}
await RecommendationService.instance.generateRecommendation(client, editor, 'OnDemand', config, undefined)
}
64 changes: 9 additions & 55 deletions src/codewhisperer/service/keyStrokeHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,17 @@
import * as vscode from 'vscode'
import { DefaultCodeWhispererClient } from '../client/codewhisperer'
import * as CodeWhispererConstants from '../models/constants'
import { vsCodeState, ConfigurationEntry, GetRecommendationsResponse } from '../models/model'
import { ConfigurationEntry } from '../models/model'
import { getLogger } from '../../shared/logger'
import { isCloud9 } from '../../shared/extensionUtilities'
import { RecommendationHandler } from './recommendationHandler'
import { CodewhispererAutomatedTriggerType } from '../../shared/telemetry/telemetry'
import { getTabSizeSetting } from '../../shared/utilities/editorUtilities'
import { isInlineCompletionEnabled } from '../util/commonUtil'
import { InlineCompletionService } from './inlineCompletionService'
import { AuthUtil } from '../util/authUtil'
import { ClassifierTrigger } from './classifierTrigger'
import { isIamConnection } from '../../auth/connection'
import { extractContextForCodeWhisperer } from '../util/editorContext'
import { RecommendationService } from './recommendationService'

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

Expand Down Expand Up @@ -169,58 +168,13 @@ export class KeyStrokeHandler {
return
}
// RecommendationHandler.instance.reportUserDecisionOfRecommendation(editor, -1)
if (isCloud9('any')) {
if (RecommendationHandler.instance.isGenerateRecommendationInProgress) {
return
}
RecommendationHandler.instance.checkAndResetCancellationTokens()
vsCodeState.isIntelliSenseActive = false
RecommendationHandler.instance.isGenerateRecommendationInProgress = true
try {
let response: GetRecommendationsResponse = {
result: 'Failed',
errorMessage: undefined,
}
if (isCloud9('classic') || isIamConnection(AuthUtil.instance.conn)) {
response = await RecommendationHandler.instance.getRecommendations(
client,
editor,
'AutoTrigger',
config,
autoTriggerType,
false
)
} else {
if (AuthUtil.instance.isConnectionExpired()) {
await AuthUtil.instance.showReauthenticatePrompt()
}
response = await RecommendationHandler.instance.getRecommendations(
client,
editor,
'AutoTrigger',
config,
autoTriggerType,
true
)
}
if (RecommendationHandler.instance.canShowRecommendationInIntelliSense(editor, false, response)) {
await vscode.commands.executeCommand('editor.action.triggerSuggest').then(() => {
vsCodeState.isIntelliSenseActive = true
})
}
} finally {
RecommendationHandler.instance.isGenerateRecommendationInProgress = false
}
} else if (isInlineCompletionEnabled()) {
await InlineCompletionService.instance.getPaginatedRecommendation(
client,
editor,
'AutoTrigger',
config,
autoTriggerType,
event
)
}
await RecommendationService.instance.generateRecommendation(
client,
editor,
'AutoTrigger',
config,
autoTriggerType
)
}
}

Expand Down
97 changes: 97 additions & 0 deletions src/codewhisperer/service/recommendationService.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/*!
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
import * as vscode from 'vscode'
import { ConfigurationEntry, GetRecommendationsResponse, vsCodeState } from '../models/model'
import { isCloud9 } from '../../shared/extensionUtilities'
import { isInlineCompletionEnabled } from '../util/commonUtil'
import { CodewhispererAutomatedTriggerType, CodewhispererTriggerType } from '../../shared/telemetry/telemetry'
import { AuthUtil } from '../util/authUtil'
import { isIamConnection } from '../../auth/connection'
import { RecommendationHandler } from '../service/recommendationHandler'
import { InlineCompletionService } from '../service/inlineCompletionService'
import { ClassifierTrigger } from './classifierTrigger'
import { DefaultCodeWhispererClient } from '../client/codewhisperer'

export class RecommendationService {
static #instance: RecommendationService

public static get instance() {
return (this.#instance ??= new RecommendationService())
}

async generateRecommendation(
client: DefaultCodeWhispererClient,
editor: vscode.TextEditor,
triggerType: CodewhispererTriggerType,
config: ConfigurationEntry,
autoTriggerType?: CodewhispererAutomatedTriggerType,
event?: vscode.TextDocumentChangeEvent
) {
if (isCloud9('any')) {
// C9 manual trigger key alt/option + C is ALWAYS enabled because the VSC version C9 is on doesn't support setContextKey which is used for CODEWHISPERER_ENABLED
// therefore we need a connection check if there is ANY connection(regardless of the connection's state) connected to CodeWhisperer on C9
if (triggerType === 'OnDemand' && !AuthUtil.instance.isConnected()) {
return
}

if (RecommendationHandler.instance.isGenerateRecommendationInProgress) {
return
}

RecommendationHandler.instance.checkAndResetCancellationTokens()
vsCodeState.isIntelliSenseActive = false
RecommendationHandler.instance.isGenerateRecommendationInProgress = true

try {
let response: GetRecommendationsResponse = {
result: 'Failed',
errorMessage: undefined,
}

if (isCloud9('classic') || isIamConnection(AuthUtil.instance.conn)) {
response = await RecommendationHandler.instance.getRecommendations(
client,
editor,
triggerType,
config,
autoTriggerType,
false
)
} else {
if (AuthUtil.instance.isConnectionExpired()) {
await AuthUtil.instance.showReauthenticatePrompt()
}
response = await RecommendationHandler.instance.getRecommendations(
client,
editor,
triggerType,
config,
autoTriggerType,
true
)
}
if (RecommendationHandler.instance.canShowRecommendationInIntelliSense(editor, true, response)) {
await vscode.commands.executeCommand('editor.action.triggerSuggest').then(() => {
vsCodeState.isIntelliSenseActive = true
})
}
} finally {
RecommendationHandler.instance.isGenerateRecommendationInProgress = false
}
} else if (isInlineCompletionEnabled()) {
if (triggerType === 'OnDemand') {
ClassifierTrigger.instance.recordClassifierResultForManualTrigger(editor)
}
await InlineCompletionService.instance.getPaginatedRecommendation(
client,
editor,
triggerType,
config,
autoTriggerType,
event
)
}
}
}

0 comments on commit 1e48a31

Please sign in to comment.