Skip to content

Commit 497cbdb

Browse files
Merge branch 'feature/q-lsp' into samgst/q-lsp-aws-config
2 parents 7b41616 + e8a4bee commit 497cbdb

File tree

8 files changed

+188
-176
lines changed

8 files changed

+188
-176
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "feature",
3+
"description" : "AmazonQ /test now displays a concise test plan summary to users."
4+
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/CodeWhispererUTGChatManager.kt

Lines changed: 107 additions & 157 deletions
Large diffs are not rendered by default.

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/controller/CodeTestChatController.kt

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -629,17 +629,18 @@ class CodeTestChatController(
629629
val manager = CodeWhispererCodeReferenceManager.getInstance(context.project)
630630
references.forEach { ref ->
631631
var referenceContentSpan: Span? = null
632-
ref.recommendationContentSpan?.let {
633-
referenceContentSpan = Span.builder().start(ref.recommendationContentSpan.start).end(ref.recommendationContentSpan.end).build()
632+
ref.recommendationContentSpan()?.let {
633+
referenceContentSpan = Span.builder().start(ref.recommendationContentSpan().start())
634+
.end(ref.recommendationContentSpan().end()).build()
634635
}
635636
val reference = Reference.builder().url(
636-
ref.url
637-
).licenseName(ref.licenseName).repository(ref.repository).recommendationContentSpan(referenceContentSpan).build()
637+
ref.url()
638+
).licenseName(ref.licenseName()).repository(ref.repository()).recommendationContentSpan(referenceContentSpan).build()
638639
var originalContent: String? = null
639-
ref.recommendationContentSpan?.let {
640+
ref.recommendationContentSpan()?.let {
640641
originalContent = session.generatedTestDiffs.values.first().substring(
641-
ref.recommendationContentSpan.start,
642-
ref.recommendationContentSpan.end
642+
ref.recommendationContentSpan().start(),
643+
ref.recommendationContentSpan().end()
643644
)
644645
}
645646
LOG.debug { "Original code content from reference span: $originalContent" }

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/session/Session.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
package software.aws.toolkits.jetbrains.services.amazonqCodeTest.session
55

66
import com.intellij.openapi.vfs.VirtualFile
7+
import software.amazon.awssdk.services.codewhispererruntime.model.PackageInfo
8+
import software.amazon.awssdk.services.codewhispererruntime.model.Reference
79
import software.aws.toolkits.jetbrains.services.amazonqCodeTest.ConversationState
8-
import software.aws.toolkits.jetbrains.services.amazonqCodeTest.model.ShortAnswer
9-
import software.aws.toolkits.jetbrains.services.amazonqCodeTest.model.ShortAnswerReference
1010
import software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage
1111
import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererUnknownLanguage
1212

@@ -37,14 +37,15 @@ data class Session(val tabId: String) {
3737
// First iteration will have a value of 1
3838
var iteration: Int = 0
3939
var projectRoot: String = "/"
40-
var shortAnswer: ShortAnswer = ShortAnswer()
40+
41+
var packageInfoList: List<PackageInfo> = emptyList()
4142
var selectedFile: VirtualFile? = null
4243
var testFileRelativePathToProjectRoot: String = ""
4344
var testFileName: String = ""
4445
var viewDiffMessageId: String? = null
4546
var openedDiffFile: VirtualFile? = null
4647
val generatedTestDiffs = mutableMapOf<String, String>()
47-
var codeReferences: List<ShortAnswerReference>? = null
48+
var codeReferences: List<Reference>? = null
4849

4950
// Build loop execution
5051
val buildAndExecuteTaskContext = BuildAndExecuteTaskContext()

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImpl.kt

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@
44
package software.aws.toolkits.jetbrains.services.amazonq.lsp
55

66
import com.intellij.notification.NotificationType
7+
import com.intellij.openapi.project.Project
78
import org.eclipse.lsp4j.ConfigurationParams
89
import org.eclipse.lsp4j.MessageActionItem
910
import org.eclipse.lsp4j.MessageParams
1011
import org.eclipse.lsp4j.MessageType
1112
import org.eclipse.lsp4j.PublishDiagnosticsParams
1213
import org.eclipse.lsp4j.ShowMessageRequestParams
14+
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
15+
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
16+
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
1317
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata
1418
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.SsoProfileData
1519
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
@@ -18,7 +22,7 @@ import java.util.concurrent.CompletableFuture
1822
/**
1923
* Concrete implementation of [AmazonQLanguageClient] to handle messages sent from server
2024
*/
21-
class AmazonQLanguageClientImpl : AmazonQLanguageClient {
25+
class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageClient {
2226
override fun telemetryEvent(`object`: Any) {
2327
println(`object`)
2428
}
@@ -46,11 +50,25 @@ class AmazonQLanguageClientImpl : AmazonQLanguageClient {
4650
showMessage(message)
4751
}
4852

49-
override fun getConnectionMetadata() = CompletableFuture.completedFuture(
50-
ConnectionMetadata(
51-
SsoProfileData("TODO")
52-
)
53-
)
53+
override fun getConnectionMetadata(): CompletableFuture<ConnectionMetadata> =
54+
CompletableFuture.supplyAsync {
55+
val connection = ToolkitConnectionManager.getInstance(project)
56+
.activeConnectionForFeature(QConnection.getInstance())
57+
58+
when (connection) {
59+
is AwsBearerTokenConnection -> {
60+
ConnectionMetadata(
61+
SsoProfileData(connection.startUrl)
62+
)
63+
}
64+
else -> {
65+
// If no connection or not a bearer token connection return default builderID start url
66+
ConnectionMetadata(
67+
SsoProfileData(AmazonQLspConstants.AWS_BUILDER_ID_URL)
68+
)
69+
}
70+
}
71+
}
5472

5573
override fun configuration(params: ConfigurationParams): CompletableFuture<List<Any>> {
5674
if (params.items.isEmpty()) {

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspConstants.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package software.aws.toolkits.jetbrains.services.amazonq.lsp
55

66
object AmazonQLspConstants {
7+
const val AWS_BUILDER_ID_URL = "https://view.awsapps.com/start"
78
const val LSP_CW_CONFIGURATION_KEY = "aws.codeWhisperer"
89
const val LSP_CW_OPT_OUT_KEY = "shareCodeWhispererContentWithAWS"
910
const val LSP_CODE_REFERENCES_OPT_OUT_KEY = "includeSuggestionsWithCodeReferences"

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ private class AmazonQServerInstance(private val project: Project, private val cs
264264
launcherHandler.startNotify()
265265

266266
launcher = LSPLauncher.Builder<AmazonQLanguageServer>()
267-
.setLocalService(AmazonQLanguageClientImpl())
267+
.setLocalService(AmazonQLanguageClientImpl(project))
268268
.setRemoteInterface(AmazonQLanguageServer::class.java)
269269
.configureGson {
270270
// TODO: maybe need adapter for initialize:

plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLanguageClientImplTest.kt

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,54 @@
55
package software.aws.toolkits.jetbrains.services.amazonq.lsp
66

77
import com.google.gson.Gson
8+
import com.intellij.openapi.components.service
9+
import com.intellij.openapi.project.Project
810
import com.intellij.testFramework.ApplicationExtension
11+
import io.mockk.every
12+
import io.mockk.mockk
913
import org.assertj.core.api.Assertions.assertThat
1014
import org.eclipse.lsp4j.ConfigurationItem
1115
import org.eclipse.lsp4j.ConfigurationParams
1216
import org.junit.jupiter.api.Test
1317
import org.junit.jupiter.api.extension.ExtendWith
18+
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
19+
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
20+
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
21+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata
22+
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.SsoProfileData
1423
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
1524

1625
@ExtendWith(ApplicationExtension::class)
1726
class AmazonQLanguageClientImplTest {
18-
private val sut = AmazonQLanguageClientImpl()
27+
private val project: Project = mockk(relaxed = true)
28+
private val sut = AmazonQLanguageClientImpl(project)
29+
30+
@Test
31+
fun `getConnectionMetadata returns connection metadata with start URL for bearer token connection`() {
32+
val mockConnectionManager = mockk<ToolkitConnectionManager>()
33+
every { project.service<ToolkitConnectionManager>() } returns mockConnectionManager
34+
35+
val expectedStartUrl = "https://test.aws.com"
36+
val mockConnection = mockk<AwsBearerTokenConnection> {
37+
every { startUrl } returns expectedStartUrl
38+
}
39+
40+
every { mockConnectionManager.activeConnectionForFeature(QConnection.getInstance()) } returns mockConnection
41+
42+
assertThat(sut.getConnectionMetadata().get())
43+
.isEqualTo(ConnectionMetadata(SsoProfileData(expectedStartUrl)))
44+
}
45+
46+
@Test
47+
fun `getConnectionMetadata returns empty start URL when no active connection`() {
48+
val mockConnectionManager = mockk<ToolkitConnectionManager>()
49+
every { project.service<ToolkitConnectionManager>() } returns mockConnectionManager
50+
51+
every { mockConnectionManager.activeConnectionForFeature(QConnection.getInstance()) } returns null
52+
53+
assertThat(sut.getConnectionMetadata().get())
54+
.isEqualTo(ConnectionMetadata(SsoProfileData(AmazonQLspConstants.AWS_BUILDER_ID_URL)))
55+
}
1956

2057
@Test
2158
fun `configuration null if no attributes requested`() {

0 commit comments

Comments
 (0)