Skip to content
Merged
Show file tree
Hide file tree
Changes from 161 commits
Commits
Show all changes
166 commits
Select commit Hold shift + click to select a range
5b9ee01
Merge main into feature/q-lsp
aws-toolkit-automation Feb 10, 2025
10b8b1c
Merge main into feature/q-lsp
aws-toolkit-automation Feb 11, 2025
d204734
Merge main into feature/q-lsp
aws-toolkit-automation Feb 11, 2025
acdcc9f
Merge main into feature/q-lsp
aws-toolkit-automation Feb 11, 2025
000e806
Merge main into feature/q-lsp
aws-toolkit-automation Feb 11, 2025
d948ab9
Merge main into feature/q-lsp
aws-toolkit-automation Feb 11, 2025
888d9dc
Merge main into feature/q-lsp
aws-toolkit-automation Feb 11, 2025
847b17a
Merge main into feature/q-lsp
aws-toolkit-automation Feb 11, 2025
3e3babf
Merge main into feature/q-lsp
aws-toolkit-automation Feb 11, 2025
368b473
Merge main into feature/q-lsp
aws-toolkit-automation Feb 11, 2025
dafcfb3
Merge main into feature/q-lsp
aws-toolkit-automation Feb 11, 2025
51166e3
Merge main into feature/q-lsp
aws-toolkit-automation Feb 11, 2025
2054332
Merge main into feature/q-lsp
aws-toolkit-automation Feb 11, 2025
d651a46
feat(q): stub out Q LSP logic (#5352)
rli Feb 12, 2025
c895f6b
Merge main into feature/q-lsp
aws-toolkit-automation Feb 12, 2025
03441f1
Merge main into feature/q-lsp
aws-toolkit-automation Feb 12, 2025
4a29d0e
Merge main into feature/q-lsp
aws-toolkit-automation Feb 12, 2025
ffbab15
Merge main into feature/q-lsp
aws-toolkit-automation Feb 12, 2025
013c54f
feat(amazonq): LSP -- Implement Initialize message (#5367)
samgst-amazon Feb 13, 2025
ba5d289
Merge main into feature/q-lsp
aws-toolkit-automation Feb 13, 2025
d9f7bb3
feat(amazonq): initialize flare lsp on project start (#5366)
rli Feb 13, 2025
3a866a6
fix(amazonq): also terminate lsp process on other failures (#5371)
rli Feb 13, 2025
7de1aa4
Merge main into feature/q-lsp
aws-toolkit-automation Feb 13, 2025
7c73892
Merge main into feature/q-lsp
aws-toolkit-automation Feb 13, 2025
e22092f
feat(amazonq): hook up lsp payload encryption (#5370)
rli Feb 13, 2025
bfbaf72
Merge main into feature/q-lsp
aws-toolkit-automation Feb 13, 2025
b979630
Merge main into feature/q-lsp
aws-toolkit-automation Feb 14, 2025
d24f3df
Merge main into feature/q-lsp
aws-toolkit-automation Feb 14, 2025
e3dcd5c
Merge main into feature/q-lsp
aws-toolkit-automation Feb 14, 2025
add1848
Merge main into feature/q-lsp
aws-toolkit-automation Feb 15, 2025
b2910df
Merge main into feature/q-lsp
aws-toolkit-automation Feb 15, 2025
9372b80
Merge main into feature/q-lsp
aws-toolkit-automation Feb 18, 2025
f8e3c87
Merge main into feature/q-lsp
aws-toolkit-automation Feb 18, 2025
f541043
Merge main into feature/q-lsp
aws-toolkit-automation Feb 18, 2025
7fe49e0
Merge main into feature/q-lsp
aws-toolkit-automation Feb 18, 2025
7c25e12
Merge main into feature/q-lsp
aws-toolkit-automation Feb 18, 2025
d927594
feature(amazonq): expose `AmazonQLanguageServer` to consumers (#5386)
rli Feb 18, 2025
5039aad
Merge main into feature/q-lsp
aws-toolkit-automation Feb 18, 2025
5338e0c
Merge main into feature/q-lsp
aws-toolkit-automation Feb 18, 2025
13bf928
Merge main into feature/q-lsp
aws-toolkit-automation Feb 18, 2025
462f836
Merge main into feature/q-lsp
aws-toolkit-automation Feb 19, 2025
b403d8a
Merge main into feature/q-lsp
aws-toolkit-automation Feb 19, 2025
5b15f52
Merge main into feature/q-lsp
aws-toolkit-automation Feb 20, 2025
290ac22
Merge main into feature/q-lsp
aws-toolkit-automation Feb 20, 2025
4efffa0
Merge main into feature/q-lsp
aws-toolkit-automation Feb 20, 2025
41bffe5
Merge main into feature/q-lsp
aws-toolkit-automation Feb 20, 2025
8715a11
Merge main into feature/q-lsp
aws-toolkit-automation Feb 21, 2025
140110c
Merge main into feature/q-lsp
aws-toolkit-automation Feb 21, 2025
c222125
Merge main into feature/q-lsp
aws-toolkit-automation Feb 22, 2025
2d60ec2
Merge main into feature/q-lsp
aws-toolkit-automation Feb 25, 2025
48b20a4
Merge main into feature/q-lsp
aws-toolkit-automation Feb 25, 2025
3a5823e
Merge main into feature/q-lsp
aws-toolkit-automation Feb 25, 2025
1cdc40a
Merge main into feature/q-lsp
aws-toolkit-automation Feb 26, 2025
ab00ed9
Merge main into feature/q-lsp
aws-toolkit-automation Feb 26, 2025
eab7f37
Merge main into feature/q-lsp
aws-toolkit-automation Feb 26, 2025
6d593c3
Merge main into feature/q-lsp
aws-toolkit-automation Feb 26, 2025
179aea2
feat(amazonq): Added LSP Manifest manager related changes (#5387)
LokeshDogga13 Feb 26, 2025
35b0424
feat(amazonq): Implement aws/credentials/token messages (#5410)
samgst-amazon Feb 26, 2025
bd4dd63
feat(amazonq): Extract ZIP File and Unit Test Cases (#5416)
LokeshDogga13 Feb 27, 2025
f7039e1
Merge main into feature/q-lsp
aws-toolkit-automation Feb 27, 2025
c349947
Merge main into feature/q-lsp
aws-toolkit-automation Feb 28, 2025
a6e7685
Merge main into feature/q-lsp
aws-toolkit-automation Feb 28, 2025
a74f884
implement token change listener (#5423)
samgst-amazon Feb 28, 2025
6bfc0e5
Merge main into feature/q-lsp
aws-toolkit-automation Feb 28, 2025
0af95e3
feat(amazonq): Added progress indicator for lsp artifact download (#…
LokeshDogga13 Feb 28, 2025
1fd1e73
feat(amazonq): add virtualFile -> URI util (#5381)
samgst-amazon Mar 3, 2025
25f6e19
Merge main into feature/q-lsp
aws-toolkit-automation Mar 3, 2025
cb97ce7
feat(amazonq): implement workspace file messages (#5377)
samgst-amazon Mar 3, 2025
e20697a
fix(amazonq): fix failing lsp artifact tests (#5433)
rli Mar 3, 2025
85ebf09
Merge main into feature/q-lsp
aws-toolkit-automation Mar 4, 2025
9574b42
feat(amazonq): expose lsp server capabilities to consumers of AmazonQ…
rli Mar 4, 2025
6df31d9
feat(amazonq): implement TextDocumentService message handler (#5380)
samgst-amazon Mar 4, 2025
21ed987
Merge main into feature/q-lsp
aws-toolkit-automation Mar 4, 2025
0b6e695
fix(amazonq): fix failing FileUri/TextDocumentServiceHandler tests (#…
rli Mar 5, 2025
fa2ddee
Merge main into feature/q-lsp
aws-toolkit-automation Mar 5, 2025
332af68
Merge main into feature/q-lsp
aws-toolkit-automation Mar 5, 2025
c0e4ad3
Merge main into feature/q-lsp
aws-toolkit-automation Mar 5, 2025
954096d
Merge main into feature/q-lsp
aws-toolkit-automation Mar 5, 2025
84b0f7d
feat(amazonq): Added changes for override lsp artifacts (#5429)
LokeshDogga13 Mar 6, 2025
e66ca51
Merge main into feature/q-lsp
aws-toolkit-automation Mar 6, 2025
bff5c09
Merge main into feature/q-lsp
aws-toolkit-automation Mar 6, 2025
262a6a8
Merge main into feature/q-lsp
aws-toolkit-automation Mar 7, 2025
b179b37
feat(amazonq): implement configuration/didChangeConfiguration message…
rli Mar 7, 2025
ac81a2f
feat(amazonq): Implement aws/syncModuleDependencies call (#5414)
samgst-amazon Mar 7, 2025
b6ae7b1
feat(amazonq): launch lsp from resolved artifacts and allow user to o…
rli Mar 7, 2025
d370f79
Merge main into feature/q-lsp
aws-toolkit-automation Mar 8, 2025
07fab42
Merge main into feature/q-lsp
aws-toolkit-automation Mar 10, 2025
ca4e3ce
Merge main into feature/q-lsp
aws-toolkit-automation Mar 10, 2025
ecce6e5
Merge main into feature/q-lsp
aws-toolkit-automation Mar 10, 2025
c661fee
Merge main into feature/q-lsp
aws-toolkit-automation Mar 10, 2025
4f8b2c4
Merge main into feature/q-lsp
aws-toolkit-automation Mar 11, 2025
bba5794
Merge main into feature/q-lsp
aws-toolkit-automation Mar 11, 2025
e3aed6c
Merge main into feature/q-lsp
aws-toolkit-automation Mar 12, 2025
526eb4a
Merge main into feature/q-lsp
aws-toolkit-automation Mar 12, 2025
7d92d3a
fix(amazonq): always send creds on lsp init if available (#5459)
rli Mar 12, 2025
660ee40
Merge main into feature/q-lsp
aws-toolkit-automation Mar 12, 2025
151a9ab
Merge main into feature/q-lsp
aws-toolkit-automation Mar 12, 2025
c0f84b1
refactor(amazonq): implement VirtualFile -> URI util for messaging pa…
samgst-amazon Mar 13, 2025
5666c65
Merge main into feature/q-lsp
aws-toolkit-automation Mar 13, 2025
1bed23a
Merge main into feature/q-lsp
aws-toolkit-automation Mar 13, 2025
38fe91e
fix(amazonq): capture more file events for workspace/ messages (#5474)
samgst-amazon Mar 13, 2025
e6d8159
fix(amazonq): lsp token/update emits for init, logins, and token refr…
samgst-amazon Mar 14, 2025
1378eae
Merge main into feature/q-lsp
aws-toolkit-automation Mar 14, 2025
897e2a3
Merge main into feature/q-lsp
aws-toolkit-automation Mar 17, 2025
9f76c93
Merge main into feature/q-lsp
aws-toolkit-automation Mar 17, 2025
2536f83
feat(amazonq): implement aws/credentials/getConnectionMetadata for ls…
samgst-amazon Mar 18, 2025
e8a4bee
Merge main into feature/q-lsp
aws-toolkit-automation Mar 18, 2025
7f90c20
feat(amazonq): add lsp configuration support for includeSuggestionsWi…
samgst-amazon Mar 18, 2025
78b6ac9
Merge main into feature/q-lsp
aws-toolkit-automation Mar 18, 2025
0773bbb
Merge main into feature/q-lsp
aws-toolkit-automation Mar 19, 2025
c0de224
rename params (#5484)
samgst-amazon Mar 19, 2025
8e1355f
fix(amazonq): didRename emits full oldUri path (#5487)
samgst-amazon Mar 20, 2025
083f6d8
Merge main into feature/q-lsp
aws-toolkit-automation Mar 20, 2025
8542f6b
Merge main into feature/q-lsp
aws-toolkit-automation Mar 20, 2025
4367af0
Merge main into feature/q-lsp
aws-toolkit-automation Mar 20, 2025
60a42f4
Merge main into feature/q-lsp
aws-toolkit-automation Mar 21, 2025
59d5c75
fix(amazonq): fix didChangeDependencyPathsParams with absolute pathin…
samgst-amazon Mar 21, 2025
d82065d
Merge main into feature/q-lsp
aws-toolkit-automation Mar 21, 2025
f24037f
Merge main into feature/q-lsp
aws-toolkit-automation Mar 24, 2025
68ba71c
rename to match flare shape (#5504)
samgst-amazon Mar 26, 2025
99827f8
Merge remote-tracking branch 'origin/main' into HEAD
rli Mar 26, 2025
9046a85
Merge pull request #5506 from aws/autoMerge/feature/q-lsp
rli Mar 26, 2025
7d3b55c
Merge main into feature/q-lsp
aws-toolkit-automation Mar 27, 2025
d267a21
Merge main into feature/q-lsp
aws-toolkit-automation Mar 27, 2025
026ffca
Merge main into feature/q-lsp
aws-toolkit-automation Mar 27, 2025
60a5f37
Merge main into feature/q-lsp
aws-toolkit-automation Mar 28, 2025
d22a9bb
Merge main into feature/q-lsp
aws-toolkit-automation Mar 31, 2025
86527a3
Merge main into feature/q-lsp
aws-toolkit-automation Mar 31, 2025
5740273
Merge main into feature/q-lsp
aws-toolkit-automation Mar 31, 2025
49e8f68
Merge main into feature/q-lsp
aws-toolkit-automation Apr 1, 2025
d51385e
Merge main into feature/q-lsp
aws-toolkit-automation Apr 1, 2025
5f752ca
fix(amazonq): didOpen emits for files already open on IDE start (#5494)
samgst-amazon Apr 1, 2025
3abcd1f
fix(amazonq): update didRenameFile to call didOpen & didClose for doc…
samgst-amazon Apr 1, 2025
5456fa0
feat(amazonq): workspace context settings & workspaceId (#5526)
leigaol Apr 1, 2025
525f747
Merge main into feature/q-lsp
aws-toolkit-automation Apr 3, 2025
e68bb80
Merge main into feature/q-lsp
aws-toolkit-automation Apr 3, 2025
35c0eaa
fix(amazonq): do not show workspace context settings (#5534)
leigaol Apr 4, 2025
61c2b5f
add languageId and version to didOpen message (#5536)
samgst-amazon Apr 8, 2025
5cc7ae1
Merge main into feature/q-lsp
aws-toolkit-automation Apr 8, 2025
f444073
Merge remote-tracking branch 'origin/main' into HEAD
rli Apr 10, 2025
35bab00
compile
rli Apr 10, 2025
d03a641
Merge pull request #5537 from aws/autoMerge/feature/q-lsp
rli Apr 10, 2025
1faaa9e
Merge main into feature/q-lsp
aws-toolkit-automation Apr 10, 2025
9ff4d7b
Merge main into feature/q-lsp
aws-toolkit-automation Apr 10, 2025
25ed88a
Merge main into feature/q-lsp
aws-toolkit-automation Apr 10, 2025
dad76f1
Merge main into feature/q-lsp
aws-toolkit-automation Apr 10, 2025
24bf5d4
Merge main into feature/q-lsp
aws-toolkit-automation Apr 10, 2025
345a2c8
Merge main into feature/q-lsp
aws-toolkit-automation Apr 10, 2025
f077616
Merge main into feature/q-lsp
aws-toolkit-automation Apr 11, 2025
f8a47fe
Merge main into feature/q-lsp
aws-toolkit-automation Apr 11, 2025
5de10f3
Merge main into feature/q-lsp
aws-toolkit-automation Apr 11, 2025
f22322a
Merge main into feature/q-lsp
aws-toolkit-automation Apr 11, 2025
64903e1
Merge main into feature/q-lsp
aws-toolkit-automation Apr 11, 2025
d167137
Merge main into feature/q-lsp
aws-toolkit-automation Apr 11, 2025
ae57be6
Merge main into feature/q-lsp
aws-toolkit-automation Apr 12, 2025
09cf748
Merge main into feature/q-lsp
aws-toolkit-automation Apr 15, 2025
dc9ff9d
Merge main into feature/q-lsp
aws-toolkit-automation Apr 15, 2025
97845d8
Merge main into feature/q-lsp
aws-toolkit-automation Apr 15, 2025
de5a4bb
fix(amazonq): fix createWorkspaceFolders (#5578)
samgst-amazon Apr 16, 2025
a64c229
Merge main into feature/q-lsp
aws-toolkit-automation Apr 16, 2025
63ce354
switch LSP endpoint (#5576)
leigaol Apr 16, 2025
a8da8ca
deps(lsp): Add initialization options for profiles (#5599)
manodnyab Apr 17, 2025
9a4bfd6
deps(lsp): implement aws/updateConfiguration (#5600)
samgst-amazon Apr 17, 2025
4d2ff28
Merge remote-tracking branch 'origin/main' into HEAD
rli Apr 17, 2025
2b5d434
Merge pull request #5602 from aws/autoMerge/feature/q-lsp
rli Apr 17, 2025
2685de7
build: delete FIXME
rli Apr 17, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref =
kotlin-stdLibJdk8 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" }
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" }
mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito" }
mockito-junit-jupiter = { module = "org.mockito:mockito-junit-jupiter", version.ref = "mockito" }
mockito-kotlin = { module = "org.mockito.kotlin:mockito-kotlin", version.ref = "mockitoKotlin" }
mockk = { module = "io.mockk:mockk", version.ref="mockk" }
nimbus-jose-jwt = {module = "com.nimbusds:nimbus-jose-jwt", version.ref = "nimbus-jose-jwt"}
Expand All @@ -121,7 +122,7 @@ zjsonpatch = { module = "com.flipkart.zjsonpatch:zjsonpatch", version.ref = "zjs
[bundles]
jackson = ["jackson-datetime", "jackson-kotlin", "jackson-yaml", "jackson-xml"]
kotlin = ["kotlin-stdLibJdk8", "kotlin-reflect"]
mockito = ["mockito-core", "mockito-kotlin"]
mockito = ["mockito-core", "mockito-junit-jupiter", "mockito-kotlin"]
sshd = ["sshd-core", "sshd-scp", "sshd-sftp"]

[plugins]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
import software.aws.toolkits.jetbrains.core.gettingstarted.emitUserState
import software.aws.toolkits.jetbrains.services.amazonq.CodeWhispererFeatureConfigService
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
import software.aws.toolkits.jetbrains.services.amazonq.project.ProjectContextController
import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AmazonQToolWindow
Expand Down Expand Up @@ -56,6 +57,7 @@ class AmazonQStartupActivity : ProjectActivity {

QRegionProfileManager.getInstance().validateProfile(project)

AmazonQLspService.getInstance(project)
startLsp(project)
if (runOnce.get()) return
emitUserState(project)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnection
import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager
import software.aws.toolkits.jetbrains.core.credentials.pinning.CodeWhispererConnection
import software.aws.toolkits.jetbrains.services.amazonq.SUPPLEMENTAL_CONTEXT_TIMEOUT
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.GetConfigurationFromServerParams
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.LspServerConfigurations
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator
Expand Down Expand Up @@ -92,6 +95,9 @@ import software.aws.toolkits.resources.message
import software.aws.toolkits.telemetry.CodewhispererCompletionType
import software.aws.toolkits.telemetry.CodewhispererSuggestionState
import software.aws.toolkits.telemetry.CodewhispererTriggerType
import java.net.URI
import java.nio.file.Paths
import java.util.concurrent.CompletableFuture
import java.util.concurrent.TimeUnit

@Service
Expand Down Expand Up @@ -233,7 +239,8 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable {
requestContext.fileContextInfo,
requestContext.awaitSupplementalContext(),
requestContext.customizationArn,
requestContext.profileArn
requestContext.profileArn,
requestContext.workspaceId,
)
)

Expand Down Expand Up @@ -670,10 +677,42 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable {

val profileArn = QRegionProfileManager.getInstance().activeProfile(project)?.arn

var workspaceId: String? = null
try {
val workspacesInfos = getWorkspaceIds(project).get().workspaces
for (workspaceInfo in workspacesInfos) {
val workspaceRootPath = Paths.get(URI(workspaceInfo.workspaceRoot)).toString()
if (psiFile.virtualFile.path.startsWith(workspaceRootPath)) {
workspaceId = workspaceInfo.workspaceId
LOG.info { "Found workspaceId from LSP '$workspaceId'" }
break
}
}
} catch (e: Exception) {
LOG.warn { "Cannot get workspaceId from LSP'$e'" }
}
return RequestContext(
project, editor, triggerTypeInfo, caretPosition, fileContext,
supplementalContext, connection, latencyContext, customizationArn, profileArn
project,
editor,
triggerTypeInfo,
caretPosition,
fileContext,
supplementalContext,
connection,
latencyContext,
customizationArn,
profileArn,
workspaceId,
)
}

private fun getWorkspaceIds(project: Project): CompletableFuture<LspServerConfigurations> {
val payload = GetConfigurationFromServerParams(
section = "aws.q.workspaceContext"
)
return AmazonQLspService.executeIfRunning(project) { server ->
server.getConfigurationFromServer(payload)
} ?: (CompletableFuture.failedFuture(IllegalStateException("LSP Server not running")))
}

fun validateResponse(response: GenerateCompletionsResponse): GenerateCompletionsResponse {
Expand Down Expand Up @@ -808,6 +847,7 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable {
supplementalContext: SupplementalContextInfo?,
customizationArn: String?,
profileArn: String?,
workspaceId: String?,
): GenerateCompletionsRequest {
val programmingLanguage = ProgrammingLanguage.builder()
.languageName(fileContextInfo.programmingLanguage.toCodeWhispererRuntimeLanguage().languageId)
Expand Down Expand Up @@ -837,6 +877,7 @@ class CodeWhispererService(private val cs: CoroutineScope) : Disposable {
.customizationArn(customizationArn)
.optOutPreference(getTelemetryOptOutPreference())
.profileArn(profileArn)
.workspaceId(workspaceId)
.build()
}
}
Expand All @@ -853,6 +894,7 @@ data class RequestContext(
val latencyContext: LatencyContext,
val customizationArn: String?,
val profileArn: String?,
val workspaceId: String?,
) {
// TODO: should make the entire getRequestContext() suspend function instead of making supplemental context only
var supplementalContext: SupplementalContextInfo? = null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@

import com.intellij.icons.AllIcons
import com.intellij.ide.DataManager
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory
import com.intellij.openapi.options.BoundConfigurable
import com.intellij.openapi.options.Configurable
import com.intellij.openapi.options.SearchableConfigurable
import com.intellij.openapi.options.ex.Settings
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.emptyText
import com.intellij.ui.components.ActionLink
import com.intellij.ui.components.fields.ExpandableTextField
import com.intellij.ui.dsl.builder.Align
import com.intellij.ui.dsl.builder.bindIntText
import com.intellij.ui.dsl.builder.bindSelected
import com.intellij.ui.dsl.builder.bindText
Expand All @@ -24,6 +27,7 @@
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.isCodeWhispererEnabled
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
import software.aws.toolkits.jetbrains.settings.LspSettings
import software.aws.toolkits.resources.message
import java.awt.Font
import java.util.concurrent.TimeUnit
Expand Down Expand Up @@ -61,6 +65,24 @@
}
}

group(message("amazonqFeatureDev.placeholder.lsp")) {
row(message("amazonqFeatureDev.placeholder.select_lsp_artifact")) {
val fileChooserDescriptor = FileChooserDescriptorFactory.createSingleFileDescriptor()
fileChooserDescriptor.isForcedToUseIdeaFileChooser = true

textFieldWithBrowseButton(fileChooserDescriptor = fileChooserDescriptor)

Check warning on line 73 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unstable API Usage

'textFieldWithBrowseButton(com.intellij.openapi.fileChooser.FileChooserDescriptor, com.intellij.openapi.project.Project, kotlin.jvm.functions.Function1)' is marked unstable with @ApiStatus.Experimental

Check warning

Code scanning / QDJVMC

Unstable API Usage Warning

'textFieldWithBrowseButton(com.intellij.openapi.fileChooser.FileChooserDescriptor, com.intellij.openapi.project.Project, kotlin.jvm.functions.Function1)' is marked unstable with @ApiStatus.Experimental
.bindText(
{ LspSettings.getInstance().getArtifactPath().orEmpty() },
{ LspSettings.getInstance().setArtifactPath(it) }
)
.applyToComponent {
emptyText.text = message("executableCommon.auto_managed")
}
.resizableColumn()
.align(Align.FILL)
}
}

group(message("aws.settings.codewhisperer.group.general")) {
row {
checkBox(message("aws.settings.codewhisperer.include_code_with_reference")).apply {
Expand Down Expand Up @@ -116,6 +138,20 @@
}

group(message("aws.settings.codewhisperer.group.q_chat")) {
row {
checkBox(message("aws.settings.codewhisperer.workspace_context")).apply {

Check warning on line 142 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead

Check warning

Code scanning / QDJVMC

Usage of redundant or deprecated syntax or deprecated symbols Warning

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
connect.subscribe(
ToolkitConnectionManagerListener.TOPIC,
object : ToolkitConnectionManagerListener {
override fun activeConnectionChanged(newConnection: ToolkitConnection?) {
enabled(isCodeWhispererEnabled(project))
}
}
)
enabled(invoke)
bindSelected(codeWhispererSettings::isWorkspaceContextEnabled, codeWhispererSettings::toggleWorkspaceContextEnabled)
}.comment(message("aws.settings.codewhisperer.workspace_context.tooltip"))
}.visible(false)
row {
checkBox(message("aws.settings.codewhisperer.project_context")).apply {
connect.subscribe(
Expand Down Expand Up @@ -183,9 +219,9 @@

val autoBuildSetting = codeWhispererSettings.getAutoBuildSetting()
if (autoBuildSetting.isNotEmpty()) {
group(message("aws.settings.codewhisperer.feature_development")) {

Check warning on line 222 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
row {
text(message("aws.settings.codewhisperer.feature_development.allow_running_code_and_test_commands"))

Check warning on line 224 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
}
row {
val settings = codeWhispererSettings.getAutoBuildSetting()
Expand All @@ -210,11 +246,11 @@
}
}

group(message("aws.settings.codewhisperer.code_review")) {

Check warning on line 249 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
row {
ExpandableTextField(ParametersListUtil.COLON_LINE_PARSER, ParametersListUtil.COLON_LINE_JOINER).also {
cell(it)
.label(message("aws.settings.codewhisperer.code_review.title"))

Check warning on line 253 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

'message(String, vararg Any): String' is deprecated. Use extension-specific localization bundle instead
.comment(message("aws.settings.codewhisperer.code_review.description"))
.bindText(codeWhispererSettings::getIgnoredCodeReviewIssues, codeWhispererSettings::setIgnoredCodeReviewIssues)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,8 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
null,
mock(),
aString(),
aString()
aString(),
aString(),
)
val responseContext = ResponseContext("sessionId")
val recommendationContext = RecommendationContext(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,18 @@ class CodeWhispererConfigurableTest : CodeWhispererTestBase() {

val checkboxes = panel.components.filterIsInstance<JCheckBox>()

assertThat(checkboxes.size).isEqualTo(5)
assertThat(checkboxes.size).isEqualTo(6)
assertThat(checkboxes.map { it.text }).containsExactlyInAnyOrder(
message("aws.settings.codewhisperer.include_code_with_reference"),
message("aws.settings.codewhisperer.configurable.opt_out.title"),
message("aws.settings.codewhisperer.automatic_import_adder"),
"Workspace context",
message("aws.settings.codewhisperer.project_context"),
message("aws.settings.codewhisperer.project_context_gpu")
)

val comments = panel.components.filterIsInstance<DslLabel>()
assertThat(comments.size).isEqualTo(8)
assertThat(comments.size).isEqualTo(9)

mockCodeWhispererEnabledStatus(false)
ApplicationManager.getApplication().messageBus.syncPublisher(ToolkitConnectionManagerListener.TOPIC)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,8 @@ class CodeWhispererServiceTest {
connection = ToolkitConnectionManager.getInstance(projectRule.project).activeConnection(),
latencyContext = LatencyContext(),
customizationArn = "fake-arn",
profileArn = "fake-arn"
profileArn = "fake-arn",
workspaceId = null,
)
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,22 @@ import com.intellij.openapi.wm.impl.status.widget.StatusBarWidgetsManager
import com.intellij.testFramework.replaceService
import com.intellij.testFramework.runInEdtAndWait
import com.intellij.util.xmlb.XmlSerializer
import io.mockk.every
import io.mockk.junit4.MockKRule
import io.mockk.mockkObject
import org.assertj.core.api.Assertions.assertThat
import org.jdom.output.XMLOutputter
import org.junit.Before
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.mockito.kotlin.any
import org.mockito.kotlin.never
import org.mockito.kotlin.spy
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
import software.aws.toolkits.jetbrains.core.ToolWindowHeadlessManagerImpl
import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererLoginType
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExploreActionState
import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.isCodeWhispererEnabled
Expand All @@ -40,6 +45,9 @@ class CodeWhispererSettingsTest : CodeWhispererTestBase() {
private lateinit var codewhispererServiceSpy: CodeWhispererService
private lateinit var toolWindowHeadlessManager: ToolWindowHeadlessManagerImpl

@get:Rule
val mockkRule = MockKRule(this)

@Before
override fun setUp() {
super.setUp()
Expand Down Expand Up @@ -211,6 +219,18 @@ class CodeWhispererSettingsTest : CodeWhispererTestBase() {
assertThat(actual.autoBuildSetting).hasSize(1)
assertThat(actual.autoBuildSetting["project1"]).isTrue()
}

@Test
fun `toggleMetricOptIn should trigger LSP didChangeConfiguration`() {
mockkObject(AmazonQLspService)
every { AmazonQLspService.didChangeConfiguration(any()) } returns Unit
settingsManager.toggleMetricOptIn(true)
settingsManager.toggleMetricOptIn(false)

io.mockk.verify(atLeast = 2) {
AmazonQLspService.didChangeConfiguration(any())
}
}
}

class CodeWhispererSettingUnitTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,8 @@ fun aRequestContext(
aString()
),
customizationArn = null,
profileArn = null
profileArn = null,
workspaceId = null,
)
}

Expand Down
5 changes: 5 additions & 0 deletions plugins/amazonq/shared/jetbrains-community/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,10 @@ dependencies {
implementation(libs.commons.collections)
implementation(libs.nimbus.jose.jwt)

// FIX_WHEN_MIN_IS_242
if (providers.gradleProperty("ideProfileName").get() == "2024.1") {
implementation("org.eclipse.lsp4j:org.eclipse.lsp4j:0.24.0")
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// FIX_WHEN_MIN_IS_242
if (providers.gradleProperty("ideProfileName").get() == "2024.1") {
implementation("org.eclipse.lsp4j:org.eclipse.lsp4j:0.24.0")
}

testFixturesApi(testFixtures(project(":plugin-core:jetbrains-community")))
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@
<extensions defaultExtensionNs="com.intellij">
<applicationService serviceImplementation="migration.software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager"/>
</extensions>

</idea-plugin>
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.jetbrains.services.amazonq.lsp

import org.eclipse.lsp4j.jsonrpc.services.JsonRequest
import org.eclipse.lsp4j.services.LanguageClient
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata
import java.util.concurrent.CompletableFuture

/**
* Requests sent by server to client
*/
@Suppress("unused")
interface AmazonQLanguageClient : LanguageClient {
@JsonRequest("aws/credentials/getConnectionMetadata")
fun getConnectionMetadata(): CompletableFuture<ConnectionMetadata>
}
Loading
Loading