Skip to content
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
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
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,7 +65,25 @@
}
}

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

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

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt#L68-L71

Added lines #L68 - L71 were not covered by tests

textFieldWithBrowseButton(fileChooserDescriptor = fileChooserDescriptor)
.bindText(
{ LspSettings.getInstance().getArtifactPath() },

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

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt#L73-L75

Added lines #L73 - L75 were not covered by tests
{ LspSettings.getInstance().setArtifactPath(it.takeIf { v -> v.isNotBlank() }) }
)
.applyToComponent {
emptyText.text = "Choose a file to upload"
}
.resizableColumn()
.align(Align.FILL)
}
}

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

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/settings/CodeWhispererConfigurable.kt#L78-L84

Added lines #L78 - L84 were not covered by tests

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

Check warning on line 86 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 {
checkBox(message("aws.settings.codewhisperer.include_code_with_reference")).apply {
connect.subscribe(
Expand All @@ -83,7 +105,7 @@
}

row {
checkBox(message("aws.settings.codewhisperer.automatic_import_adder")).apply {

Check warning on line 108 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
connect.subscribe(
ToolkitConnectionManagerListener.TOPIC,
object : ToolkitConnectionManagerListener {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.jetbrains.settings

import com.intellij.openapi.components.BaseState
import com.intellij.openapi.components.PersistentStateComponent
import com.intellij.openapi.components.RoamingType
import com.intellij.openapi.components.Service
import com.intellij.openapi.components.State
import com.intellij.openapi.components.Storage
import com.intellij.openapi.components.service
import com.intellij.util.xmlb.annotations.Property

@Service

Check warning on line 15 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt#L15

Added line #L15 was not covered by tests
@State(name = "lspSettings", storages = [Storage("aws.xml", roamingType = RoamingType.DISABLED)])
class LspSettings : PersistentStateComponent<LspConfiguration> {
private var state = LspConfiguration()

Check warning on line 18 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt#L17-L18

Added lines #L17 - L18 were not covered by tests

override fun getState(): LspConfiguration = state

Check warning on line 20 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt#L20

Added line #L20 was not covered by tests

override fun loadState(state: LspConfiguration) {
this.state = state
}

Check warning on line 24 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt#L23-L24

Added lines #L23 - L24 were not covered by tests

fun getArtifactPath() = state.artifactPath

Check warning on line 26 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt#L26

Added line #L26 was not covered by tests

fun setArtifactPath(artifactPath: String?) {
if (artifactPath == null) {
state.artifactPath = ""

Check warning on line 30 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt#L30

Added line #L30 was not covered by tests
} else {
state.artifactPath = artifactPath

Check warning on line 32 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt#L32

Added line #L32 was not covered by tests
}
}

Check warning on line 34 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt#L34

Added line #L34 was not covered by tests

companion object {
fun getInstance(): LspSettings = service()

Check warning on line 37 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt#L37

Added line #L37 was not covered by tests
}
}

class LspConfiguration : BaseState() {
@get:Property
var artifactPath: String = ""

Check warning on line 43 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/settings/LspSettings.kt#L41-L43

Added lines #L41 - L43 were not covered by tests
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.jetbrains.settings

import com.intellij.util.xmlb.XmlSerializer
import org.assertj.core.api.Assertions.assertThat
import org.jdom.output.XMLOutputter
import org.junit.Before
import org.junit.Test
import software.aws.toolkits.jetbrains.utils.xmlElement

class LspSettingsTest {
private lateinit var lspSettings: LspSettings

@Before
fun setUp() {
lspSettings = LspSettings()
lspSettings.loadState(LspConfiguration())
}

@Test
fun `artifact path is empty by default`() {
assertThat(lspSettings.getArtifactPath()).isEmpty()
}

@Test
fun `artifact path can be set`() {
lspSettings.setArtifactPath("test\\lsp.js")
assertThat(lspSettings.getArtifactPath()).isNotEmpty()
assertThat(lspSettings.getArtifactPath()).isEqualTo("test\\lsp.js")
}

@Test
fun `artifact path cannot be null`() {
lspSettings.setArtifactPath(null)
assertThat(lspSettings.getArtifactPath()).isEmpty()
}

@Test
fun `serialize settings to ensure backwards compatibility`() {
val element = xmlElement(
"""
<component name="LspSettings">
</component>
""".trimIndent()
)
lspSettings.setArtifactPath("temp\\lsp.js")

XmlSerializer.serializeInto(lspSettings.state, element)

val actual = XMLOutputter().outputString(element)

val expected = "<component name=\"LspSettings\">\n" +
"<option name=\"artifactPath\" value=\"temp\\lsp.js\" /></component>"

assertThat(actual).isEqualTo(expected)
}

@Test
fun `deserialize empty settings to ensure backwards compatibility`() {
val element = xmlElement(
"""
<component name="LspSettings">
</component>
"""
)
val actual = XmlSerializer.deserialize(element, LspConfiguration::class.java)
assertThat(actual.artifactPath).isEmpty()
}

@Test
fun `deserialize existing settings to ensure backwards compatibility`() {
val element = xmlElement(
"""
<component name="LspSettings">
<option name="artifactPath" value='temp\lsp.js'/>
</component>
""".trimIndent()
)
val actual = XmlSerializer.deserialize(element, LspConfiguration::class.java)
assertThat(actual.artifactPath).isNotEmpty()
assertThat(actual.artifactPath).isEqualTo("temp\\lsp.js")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,10 @@ amazonqFeatureDev.placeholder.closed_session=Open a new chat tab to continue
amazonqFeatureDev.placeholder.context_gathering_complete=Gathering context...
amazonqFeatureDev.placeholder.downloading_and_extracting_lsp_artifacts=Downloading and Extracting Lsp Artifacts...
amazonqFeatureDev.placeholder.generating_code=Generating code...
amazonqFeatureDev.placeholder.lsp=LSP
amazonqFeatureDev.placeholder.new_plan=Describe your task or issue in as much detail as possible
amazonqFeatureDev.placeholder.provide_code_feedback=Provide feedback or comments
amazonqFeatureDev.placeholder.select_lsp_artifact=Select LSP Artifact
amazonqFeatureDev.placeholder.write_new_prompt=Write a new prompt
apprunner.action.configure=Configure Service
apprunner.action.create.service=Create Service...
Expand Down
Loading