Skip to content

Commit 760f08f

Browse files
authored
fix(amazonq): fix inline pagination logic and corountine scope logic (#5717)
1. Show the configurable tab action only on new auto trigger UX(A/B) 2. remove disposableCoroutineScope usage and directly check the dispose state of the popup(session validity) 3. use partialResultToken instead of workdoneToken for pagination logic with flare
1 parent a4667f3 commit 760f08f

File tree

5 files changed

+17
-21
lines changed

5 files changed

+17
-21
lines changed

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/editor/CodeWhispererEditorManager.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.intellij.openapi.editor.Editor
1212
import com.intellij.openapi.options.ShowSettingsUtil
1313
import com.intellij.openapi.util.TextRange
1414
import com.intellij.psi.PsiDocumentManager
15+
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
1516
import software.aws.toolkits.jetbrains.services.codewhisperer.model.CaretPosition
1617
import software.aws.toolkits.jetbrains.services.codewhisperer.model.InvocationContext
1718
import software.aws.toolkits.jetbrains.services.codewhisperer.model.SessionContext
@@ -66,7 +67,9 @@ class CodeWhispererEditorManager {
6667
}
6768

6869
// Display tab accept priority once when the first accept is made
69-
if (!CodeWhispererSettings.getInstance().isTabAcceptPriorityNotificationShownOnce()) {
70+
if (!CodeWhispererSettings.getInstance().isTabAcceptPriorityNotificationShownOnce() &&
71+
CodeWhispererFeatureConfigService.getInstance().getNewAutoTriggerUX()
72+
) {
7073
notifyInfo(
7174
"Amazon Q",
7275
message("codewhisperer.inline.settings.tab_priority.notification.text"),

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import com.intellij.util.concurrency.annotations.RequiresEdt
2222
import kotlinx.coroutines.CoroutineScope
2323
import kotlinx.coroutines.Job
2424
import kotlinx.coroutines.future.await
25-
import kotlinx.coroutines.isActive
2625
import kotlinx.coroutines.launch
2726
import kotlinx.coroutines.withContext
2827
import org.eclipse.lsp4j.Position
@@ -36,7 +35,6 @@ import software.aws.toolkits.core.utils.getLogger
3635
import software.aws.toolkits.core.utils.info
3736
import software.aws.toolkits.core.utils.warn
3837
import software.aws.toolkits.jetbrains.core.coroutines.EDT
39-
import software.aws.toolkits.jetbrains.core.coroutines.disposableCoroutineScope
4038
import software.aws.toolkits.jetbrains.core.coroutines.getCoroutineBgContext
4139
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection
4240
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
@@ -181,15 +179,9 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable {
181179
}
182180
}
183181

184-
// When popup is disposed we will cancel this coroutine. The only places popup can get disposed should be
185-
// from CodeWhispererPopupManager.cancelPopup() and CodeWhispererPopupManager.closePopup().
186-
// It's possible and ok that coroutine will keep running until the next time we check it's state.
187-
// As long as we don't show to the user extra info we are good.
188-
val coroutineScope = disposableCoroutineScope(popup)
189-
190182
var states: InvocationContext? = null
191183

192-
val job = coroutineScope.launch {
184+
val job = cs.launch {
193185
try {
194186
var startTime = System.nanoTime()
195187
CodeWhispererInvocationStatus.getInstance().setInvocationStart()
@@ -211,13 +203,11 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable {
211203
runInEdt {
212204
states = processCodeWhispererUI(workerContext, states)
213205
}
214-
if (!isActive) {
215-
// If job is cancelled before we do another request, don't bother making
216-
// another API call to save resources
206+
if (popup.isDisposed) {
217207
LOG.debug { "Skipping sending remaining requests on CodeWhisperer session exit" }
218208
return@launch
219209
}
220-
} while (nextToken != null)
210+
} while (nextToken != null && nextToken.left.isNotEmpty())
221211
} catch (e: Exception) {
222212
// TODO flare: flare doesn't return exceptions
223213
val sessionId = ""
@@ -302,7 +292,7 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable {
302292
return null
303293
}
304294

305-
if (completions.partialResultToken == null) {
295+
if (completions.partialResultToken?.left.isNullOrEmpty()) {
306296
CodeWhispererInvocationStatus.getInstance().finishInvocation()
307297
}
308298

@@ -336,7 +326,7 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable {
336326
// If there are no recommendations at all in this session, we need to manually send the user decision event here
337327
// since it won't be sent automatically later
338328
if (!hasAtLeastOneValid) {
339-
if (completions.partialResultToken == null) {
329+
if (completions.partialResultToken?.left.isNullOrEmpty()) {
340330
LOG.debug { "None of the recommendations are valid, exiting CodeWhisperer session" }
341331
CodeWhispererPopupManager.getInstance().cancelPopup(popup)
342332
return null
@@ -531,7 +521,7 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable {
531521
editor.caretModel.primaryCaret.logicalPosition.column
532522
)
533523
if (nextToken != null) {
534-
workDoneToken = nextToken
524+
partialResultToken = nextToken
535525
}
536526
}
537527
}

plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererAcceptTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocume
1616
import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.javaFileName
1717
import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.javaResponse
1818
import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.javaTestContext
19+
import software.aws.toolkits.jetbrains.services.codewhisperer.CodeWhispererTestUtil.testNextToken
1920
import software.aws.toolkits.jetbrains.services.codewhisperer.actions.CodeWhispererActionPromoter
2021
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.QInlineActionId.qInlineAcceptActionId
2122
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.QInlineActionId.qInlineForceAcceptActionId
@@ -89,7 +90,7 @@ class CodeWhispererAcceptTest : CodeWhispererTestBase() {
8990
)
9091
),
9192
sessionId = "sessionId",
92-
partialResultToken = null
93+
partialResultToken = testNextToken
9394
)
9495
)
9596

plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererTestUtil.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ object CodeWhispererTestUtil {
5050
const val codeWhispererRecommendationActionId = "CodeWhispererRecommendationAction"
5151
const val codeWhispererCodeScanActionId = "codewhisperer.toolbar.security.scan"
5252
const val testValidAccessToken = "test_valid_access_token"
53-
val testNextToken: Either<String, Int> = Either.forLeft("test_next_token")
53+
val testNextToken: Either<String, Int> = Either.forLeft("")
5454
val metadata: DefaultAwsResponseMetadata = DefaultAwsResponseMetadata.create(
5555
mapOf(AwsHeader.AWS_REQUEST_ID to testRequestId)
5656
)
@@ -67,6 +67,7 @@ object CodeWhispererTestUtil {
6767
InlineCompletionItem("item4", "test recommendation 5"),
6868
),
6969
sessionId = "sessionId",
70+
partialResultToken = testNextToken
7071
)
7172
val javaResponse: InlineCompletionListWithReferences = InlineCompletionListWithReferences(
7273
items = listOf(
@@ -77,6 +78,7 @@ object CodeWhispererTestUtil {
7778
InlineCompletionItem("item5", "test recommendation 5"),
7879
),
7980
sessionId = "sessionId",
81+
partialResultToken = testNextToken
8082
)
8183
const val pythonFileName = "test.py"
8284
const val javaFileName = "test.java"

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/textDocument/InlineCompletionWithReferencesParams.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument
55

6-
import org.eclipse.lsp4j.TextDocumentPositionAndWorkDoneProgressParams
6+
import org.eclipse.lsp4j.TextDocumentPositionAndWorkDoneProgressAndPartialResultParams
77

88
data class InlineCompletionWithReferencesParams(
99
var context: InlineCompletionContext,
10-
) : TextDocumentPositionAndWorkDoneProgressParams()
10+
) : TextDocumentPositionAndWorkDoneProgressAndPartialResultParams()

0 commit comments

Comments
 (0)