@@ -28,6 +28,7 @@ import kotlinx.coroutines.async
2828import kotlinx.coroutines.delay
2929import kotlinx.coroutines.isActive
3030import kotlinx.coroutines.launch
31+ import kotlinx.coroutines.withContext
3132import software.amazon.awssdk.core.exception.SdkServiceException
3233import software.amazon.awssdk.core.util.DefaultSdkAutoConstructList
3334import software.amazon.awssdk.services.codewhisperer.model.CodeWhispererException
@@ -46,6 +47,7 @@ import software.aws.toolkits.core.utils.getLogger
4647import software.aws.toolkits.core.utils.info
4748import software.aws.toolkits.core.utils.warn
4849import software.aws.toolkits.jetbrains.core.coroutines.disposableCoroutineScope
50+ import software.aws.toolkits.jetbrains.core.coroutines.getCoroutineBgContext
4951import software.aws.toolkits.jetbrains.core.coroutines.projectCoroutineScope
5052import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection
5153import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
@@ -82,7 +84,6 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.util.FileContextPr
8284import software.aws.toolkits.jetbrains.utils.isInjectedText
8385import software.aws.toolkits.jetbrains.utils.isQExpired
8486import software.aws.toolkits.jetbrains.utils.notifyWarn
85- import software.aws.toolkits.jetbrains.utils.pluginAwareExecuteOnPooledThread
8687import software.aws.toolkits.resources.message
8788import software.aws.toolkits.telemetry.CodewhispererCompletionType
8889import software.aws.toolkits.telemetry.CodewhispererSuggestionState
@@ -98,26 +99,43 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable {
9899 Disposer .register(this , codeInsightSettingsFacade)
99100 }
100101
102+ private var job: Job ? = null
101103 fun showRecommendationsInPopup (
102104 editor : Editor ,
103105 triggerTypeInfo : TriggerTypeInfo ,
104106 latencyContext : LatencyContext
107+ ) {
108+ if (job == null || job?.isCompleted == true ) {
109+ job = cs.launch(getCoroutineBgContext()) {
110+ doShowRecommendationsInPopup(editor, triggerTypeInfo, latencyContext)
111+ }
112+ }
113+ }
114+
115+ @RequiresEdt
116+ private suspend fun doShowRecommendationsInPopup (
117+ editor : Editor ,
118+ triggerTypeInfo : TriggerTypeInfo ,
119+ latencyContext : LatencyContext
105120 ) {
106121 val project = editor.project ? : return
107122 if (! isCodeWhispererEnabled(project)) return
108123
109124 latencyContext.credentialFetchingStart = System .nanoTime()
110125
111126 if (isQExpired(project)) {
127+ // consider changing to only running once a ~minute since this is relatively expensive
112128 // say the connection is un-refreshable if refresh fails for 3 times
113129 val shouldReauth = if (refreshFailure < MAX_REFRESH_ATTEMPT ) {
114- pluginAwareExecuteOnPooledThread {
130+ val attempt = withContext(getCoroutineBgContext()) {
115131 promptReAuth(project)
116- }.get().also { success ->
117- if (! success) {
118- refreshFailure++
119- }
120132 }
133+
134+ if (! attempt) {
135+ refreshFailure++
136+ }
137+
138+ attempt
121139 } else {
122140 true
123141 }
0 commit comments