Skip to content
Merged
Show file tree
Hide file tree
Changes from 12 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
@@ -1,4 +1,4 @@
// Copyright 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.jetbrains.services.codewhisperer.credentials
Expand All @@ -22,7 +22,7 @@
import software.amazon.awssdk.services.codewhispererruntime.model.GetTestGenerationResponse
import software.amazon.awssdk.services.codewhispererruntime.model.IdeCategory
import software.amazon.awssdk.services.codewhispererruntime.model.InlineChatUserDecision
import software.amazon.awssdk.services.codewhispererruntime.model.ListAvailableCustomizationsRequest

Check warning on line 25 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/credentials/CodeWhispererClientAdaptor.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused import directive

Unused import directive
import software.amazon.awssdk.services.codewhispererruntime.model.ListCodeAnalysisFindingsRequest
import software.amazon.awssdk.services.codewhispererruntime.model.ListCodeAnalysisFindingsResponse
import software.amazon.awssdk.services.codewhispererruntime.model.ListFeatureEvaluationsResponse
Expand All @@ -35,10 +35,10 @@
import software.amazon.awssdk.services.codewhispererruntime.model.SuggestionState
import software.amazon.awssdk.services.codewhispererruntime.model.TargetCode
import software.amazon.awssdk.services.codewhispererruntime.model.UserIntent
import software.aws.toolkits.core.utils.debug

Check warning on line 38 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/credentials/CodeWhispererClientAdaptor.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused import directive

Unused import directive
import software.aws.toolkits.core.utils.getLogger
import software.aws.toolkits.jetbrains.services.amazonq.codeWhispererUserContext
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile

Check warning on line 41 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/credentials/CodeWhispererClientAdaptor.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused import directive

Unused import directive
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererCustomization
import software.aws.toolkits.jetbrains.services.codewhisperer.language.CodeWhispererProgrammingLanguage
Expand Down Expand Up @@ -79,8 +79,6 @@

fun getCodeFixJob(request: GetCodeFixJobRequest): GetCodeFixJobResponse

fun listAvailableCustomizations(profile: QRegionProfile): List<CodeWhispererCustomization>

fun startTestGeneration(uploadId: String, targetCode: List<TargetCode>, userInput: String): StartTestGenerationResponse

fun getTestGeneration(jobId: String, jobGroupName: String): GetTestGenerationResponse
Expand Down Expand Up @@ -282,29 +280,6 @@

override fun getCodeFixJob(request: GetCodeFixJobRequest): GetCodeFixJobResponse = bearerClient().getCodeFixJob(request)

// DO NOT directly use this method to fetch customizations, use wrapper [CodeWhispererModelConfigurator.listCustomization()] instead
override fun listAvailableCustomizations(profile: QRegionProfile): List<CodeWhispererCustomization> =
QRegionProfileManager.getInstance().getQClient<CodeWhispererRuntimeClient>(project, profile).listAvailableCustomizationsPaginator(
ListAvailableCustomizationsRequest.builder().profileArn(profile.arn).build()
)
.stream()
.toList()
.flatMap { resp ->
LOG.debug {
"listAvailableCustomizations: requestId: ${resp.responseMetadata().requestId()}, customizations: ${
resp.customizations().map { it.name() }
}"
}
resp.customizations().map {
CodeWhispererCustomization(
arn = it.arn(),
name = it.name(),
description = it.description(),
profile = profile
)
}
}

override fun startTestGeneration(uploadId: String, targetCode: List<TargetCode>, userInput: String): StartTestGenerationResponse =
bearerClient().startTestGeneration { builder ->
builder.uploadId(uploadId)
Expand Down Expand Up @@ -803,7 +778,7 @@
}

companion object {
private val LOG = getLogger<CodeWhispererClientAdaptorImpl>()

Check warning on line 781 in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/credentials/CodeWhispererClientAdaptor.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused symbol

Property "LOG" is never used
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ object CodeWhispererConstants {
val scanResultsKey = DataKey.create<CodeScanResponse>("amazonq.codescan.result")
val scanScopeKey = DataKey.create<CodeAnalysisScope>("amazonq.codescan.scope")

const val Q_CUSTOM_LEARN_MORE_URI = "https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/customizations.html"
const val Q_SUPPORTED_LANG_URI = "https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/q-language-ide-support.html"
const val CODEWHISPERER_CODE_SCAN_LEARN_MORE_URI = "https://docs.aws.amazon.com/codewhisperer/latest/userguide/security-scans.html"
const val CODEWHISPERER_ONBOARDING_DOCUMENTATION_URI = "https://docs.aws.amazon.com/codewhisperer/latest/userguide/features.html"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package migration.software.aws.toolkits.jetbrains.services.codewhisperer.customization
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp

import com.intellij.notification.NotificationType
import com.intellij.openapi.project.Project
import migration.software.aws.toolkits.jetbrains.settings.AwsSettings
import org.eclipse.lsp4j.ConfigurationParams
import org.eclipse.lsp4j.MessageActionItem
import org.eclipse.lsp4j.MessageParams
Expand All @@ -18,6 +19,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credential
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.SsoProfileData
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
import java.util.concurrent.CompletableFuture
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator

/**
* Concrete implementation of [AmazonQLanguageClient] to handle messages sent from server
Expand Down Expand Up @@ -77,14 +79,31 @@ class AmazonQLanguageClientImpl(private val project: Project) : AmazonQLanguageC

return CompletableFuture.completedFuture(
buildList {
val qSettings = CodeWhispererSettings.getInstance()
params.items.forEach {
when (it.section) {
AmazonQLspConstants.LSP_CW_CONFIGURATION_KEY -> {
add(
CodeWhispererLspConfiguration(
shouldShareData = CodeWhispererSettings.getInstance().isMetricOptIn(),
shouldShareCodeReferences = CodeWhispererSettings.getInstance().isIncludeCodeWithReference(),
shouldEnableWorkspaceContext = CodeWhispererSettings.getInstance().isWorkspaceContextEnabled()
shouldShareData = qSettings.isMetricOptIn(),
shouldShareCodeReferences = qSettings.isIncludeCodeWithReference(),
// server context
shouldEnableWorkspaceContext = qSettings.isWorkspaceContextEnabled()
)
)
}
AmazonQLspConstants.LSP_Q_CONFIGURATION_KEY -> {
add(
AmazonQLspConfiguration(
optOutTelemetry = AwsSettings.getInstance().isTelemetryEnabled,
customization = CodeWhispererModelConfigurator.getInstance().activeCustomization(project)?.arn,
// local context
enableLocalIndexing = qSettings.isProjectContextEnabled(),
indexWorkerThreads = qSettings.getProjectContextIndexThreadCount(),
enableGpuAcceleration = qSettings.isProjectContextGpu(),
localIndexing = LocalIndexingConfiguration(
maxIndexSizeMB = qSettings.getProjectContextIndexMaxSize()
)
)
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// 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 com.google.gson.annotations.SerializedName

data class AmazonQLspConfiguration(
@SerializedName(AmazonQLspConstants.LSP_OPT_OUT_TELEMETRY_CONFIGURATION_KEY)
val optOutTelemetry: Boolean? = null,

@SerializedName(AmazonQLspConstants.LSP_ENABLE_TELEMETRY_EVENTS_CONFIGURATION_KEY)
Copy link
Contributor Author

@samgst-amazon samgst-amazon Mar 28, 2025

Choose a reason for hiding this comment

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

The flag enableTelemetryEventsToDestination is set to true temporarily. It's value will be determined through destination configuration post all events migration to STE. It'll be replaced by qConfig['enableTelemetryEventsToDestination'] === true

This is not currently being used but will be in future migrations. not exactly sure what it should be pointing to in current codebase

val enableTelemetryEvents: Boolean? = null,

@SerializedName(AmazonQLspConstants.LSP_CUSTOMIZATION_CONFIGURATION_KEY)
val customization: String? = null,

val enableLocalIndexing: Boolean? = null,

val enableGpuAcceleration: Boolean? = null,

val indexWorkerThreads: Int? = null,

val localIndexing: LocalIndexingConfiguration? = null,
)

data class LocalIndexingConfiguration(
val ignoreFilePatterns: List<String>? = null,
val maxFileSizeMB: Int? = null,
val maxIndexSizeMB: Int? = null,
val indexCacheDirPath: String? = null,
)
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,9 @@ object AmazonQLspConstants {
const val LSP_CW_CONFIGURATION_KEY = "aws.codeWhisperer"
const val LSP_CW_OPT_OUT_KEY = "shareCodeWhispererContentWithAWS"
const val LSP_CODE_REFERENCES_OPT_OUT_KEY = "includeSuggestionsWithCodeReferences"
const val LSP_Q_CONFIGURATION_KEY = "aws.q"
const val LSP_OPT_OUT_TELEMETRY_CONFIGURATION_KEY = "optOutTelemetry"
const val LSP_ENABLE_TELEMETRY_EVENTS_CONFIGURATION_KEY = "enableTelemetryEventsToDestination"
const val LSP_CUSTOMIZATION_CONFIGURATION_KEY = "customization"
const val LSP_WORKSPACE_CONTEXT_ENABLED_KEY = "workspaceContext"
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,32 +29,31 @@
import software.aws.toolkits.jetbrains.services.amazonq.profile.QProfileSwitchIntent
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.Q_CUSTOM_LEARN_MORE_URI
import software.aws.toolkits.jetbrains.ui.AsyncComboBox
import software.aws.toolkits.jetbrains.utils.notifyInfo
import software.aws.toolkits.resources.message

Check warning on line 34 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

Remove deprecated symbol import
import javax.swing.JComponent
import javax.swing.JList

private val NoDataToDisplay = CustomizationUiItem(
CodeWhispererCustomization("", message("codewhisperer.custom.dialog.option.no_data"), "", QRegionProfile("", "")),

Check warning on line 39 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.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
false,

Check notice on line 40 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Boolean literal argument without parameter name

Boolean literal argument without a parameter name
false

Check notice on line 41 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Boolean literal argument without parameter name

Boolean literal argument without a parameter name
)

private fun notifyCustomizationIsSelected(project: Project, customizationUiItem: CustomizationUiItem?) {
// TODO: localize
val content = customizationUiItem?.let {
"Amazon Q inline suggestions are now coming from the ${it.customization.name} customization"
} ?: "Amazon Q inline suggestions are now coming from the ${message("codewhisperer.custom.dialog.option.default")}"

Check warning on line 48 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.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

notifyInfo(
title = message("codewhisperer.custom.dialog.title"),

Check warning on line 51 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.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
content = content,
project = project,
notificationActions = listOf(
NotificationAction.create(
message("codewhisperer.notification.custom.simple.button.got_it")

Check warning on line 56 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.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
) { _, notification -> notification.expire() }
)
)
Expand Down Expand Up @@ -84,8 +83,8 @@
private val panel: DialogPanel by lazy { drawPanel() }

init {
title = message("codewhisperer.custom.dialog.title")

Check warning on line 86 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.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
setOKButtonText(message("codewhisperer.custom.dialog.ok_button.text"))

Check warning on line 87 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.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

val selectedOption = CodeWhispererModelConfigurator.getInstance().activeCustomization(project)?.let {
RadioButtonOption.Customization
Expand Down Expand Up @@ -140,7 +139,7 @@
// TODO: check if we can render a multi-line combo box
private fun drawPanel() = panel {
row {
label(message("codewhisperer.custom.dialog.panel.title")).bold()

Check warning on line 142 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.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
}

lateinit var customizationButton: Cell<JBRadioButton>
Expand All @@ -149,8 +148,8 @@

buttonsGroup {
row {
defaultButton = radioButton(message("codewhisperer.custom.dialog.option.default"), RadioButtonOption.Default)

Check warning on line 151 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.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("codewhisperer.custom.dialog.model.default.comment"))

Check warning on line 152 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.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
.actionListener { _, component ->
if (component.isSelected) {
isOKActionEnabled = CodeWhispererModelConfigurator.getInstance().activeCustomization(project) != null
Expand All @@ -159,7 +158,7 @@
}.topGap(TopGap.MEDIUM)

row {
customizationButton = radioButton(message("codewhisperer.custom.dialog.option.customization"), RadioButtonOption.Customization)

Check warning on line 161 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.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
.actionListener { _, component ->
if (component.isSelected) {
isOKActionEnabled =
Expand All @@ -174,11 +173,11 @@
lateinit var customizationComment: Row
indent {
noCustomizationComment = row("") {
rowComment(message("codewhisperer.custom.dialog.option.customization.description.no_customization", Q_CUSTOM_LEARN_MORE_URI))
rowComment(message("codewhisperer.custom.dialog.option.customization.description.no_customization", "https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/customizations.html"))

Check warning on line 176 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.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
}.visible(false)

customizationComment = row("") {
rowComment(message("codewhisperer.custom.dialog.option.customization.description"))

Check warning on line 180 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.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
}.visible(false)
}

Expand Down Expand Up @@ -256,7 +255,7 @@
}
}

private object CustomizationRenderer : ColoredListCellRenderer<CustomizationUiItem>() {

Check warning on line 258 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Serializable object must implement 'readResolve'

Serializable object must implement 'readResolve'
override fun customizeCellRenderer(
list: JList<out CustomizationUiItem>,
value: CustomizationUiItem?,
Expand All @@ -283,7 +282,7 @@

if (it != NoDataToDisplay) {
val description = if (it.customization.description.isNullOrBlank()) {
message("codewhisperer.custom.dialog.customization.no_description")

Check warning on line 285 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererCustomizationDialog.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
} else {
it.customization.description
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread
import com.intellij.util.xmlb.annotations.MapAnnotation
import com.intellij.util.xmlb.annotations.Property
import software.amazon.awssdk.services.codewhispererruntime.CodeWhispererRuntimeClient
import software.amazon.awssdk.services.codewhispererruntime.model.CodeWhispererRuntimeException
import software.aws.toolkits.core.utils.debug
import software.aws.toolkits.core.utils.getLogger
Expand All @@ -25,11 +26,10 @@
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSelectedListener
import software.aws.toolkits.jetbrains.services.codewhisperer.credentials.CodeWhispererClientAdaptor
import software.aws.toolkits.jetbrains.utils.notifyInfo
import software.aws.toolkits.jetbrains.utils.notifyWarn
import software.aws.toolkits.jetbrains.utils.pluginAwareExecuteOnPooledThread
import software.aws.toolkits.resources.message

Check warning on line 32 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Usage of redundant or deprecated syntax or deprecated symbols

Remove deprecated symbol import
import java.util.Collections
import java.util.concurrent.atomic.AtomicBoolean

Expand All @@ -37,11 +37,11 @@

private fun notifyInvalidSelectedCustomization(project: Project) {
notifyWarn(
title = message("codewhisperer.custom.dialog.title"),

Check warning on line 40 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.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
content = message("codewhisperer.notification.custom.not_available"),

Check warning on line 41 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.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
project = project,
notificationActions = listOf(
NotificationAction.create(message("codewhisperer.notification.custom.simple.button.select_another_customization")) { _, notification ->

Check warning on line 44 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.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
CodeWhispererModelConfigurator.getInstance().showConfigDialog(project)
notification.expire()
}
Expand All @@ -52,11 +52,11 @@
private fun notifyNewCustomization(project: Project) {
if (ApplicationManager.getApplication().isUnitTestMode) return
notifyInfo(
title = message("codewhisperer.custom.dialog.title"),

Check warning on line 55 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.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
content = message("codewhisperer.notification.custom.new_customization"),

Check warning on line 56 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.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
project = project,
notificationActions = listOf(
NotificationAction.createSimpleExpiring(message("codewhisperer.notification.custom.simple.button.select_customization")) {

Check warning on line 59 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.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
CodeWhispererModelConfigurator.getInstance().showConfigDialog(project)
}
)
Expand All @@ -65,7 +65,7 @@

@Service(Service.Level.APP)
@State(name = "codewhispererCustomizationStates", storages = [Storage("aws.xml")])
class DefaultCodeWhispererModelConfigurator : CodeWhispererModelConfigurator, PersistentStateComponent<CodeWhispererCustomizationState>, Disposable {

Check warning on line 68 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Extension class should be final and non-public

Service implementation should not be public. If a service is supposed to be used outside its module, extract an interface from it and specify it as serviceInterface in plugin.xml.
// TODO: refactor and clean these states, probably not need all the follwing and it's hard to maintain
// Map to store connectionId to its active customization
private val connectionIdToActiveCustomizationArn = Collections.synchronizedMap<String, CodeWhispererCustomization>(mutableMapOf())
Expand Down Expand Up @@ -105,6 +105,29 @@
}
}

/**
* DO NOT directly use this method to fetch customizations, use wrapper [listCustomizations] instead
*/
private fun listAvailableCustomizations(project: Project, profile: QRegionProfile): List<CodeWhispererCustomization> =
QRegionProfileManager.getInstance().getQClient<CodeWhispererRuntimeClient>(project, profile).listAvailableCustomizationsPaginator {
it.profileArn(profile.arn)
}.flatMap { resp ->
LOG.debug {
"listAvailableCustomizations: requestId: ${resp.responseMetadata().requestId()}, customizations: ${
resp.customizations().map { it.name() }
}"
}

resp.customizations().map {
CodeWhispererCustomization(
arn = it.arn(),
name = it.name(),
description = it.description(),
profile = profile
)
}
}

@RequiresBackgroundThread
override fun listCustomizations(project: Project, passive: Boolean): List<CustomizationUiItem>? =
calculateIfIamIdentityCenterConnection(project) {
Expand All @@ -114,7 +137,7 @@

val aggregatedCustomizations = listAvailableProfilesResult.flatMap { profile ->
runCatching {
CodeWhispererClientAdaptor.getInstance(project).listAvailableCustomizations(profile)
listAvailableCustomizations(project, profile)
}.onFailure { e ->
val requestId = (e as? CodeWhispererRuntimeException)?.requestId()
val logMessage = "ListAvailableCustomizations: failed due to unknown error ${e.message}, " +
Expand Down Expand Up @@ -228,7 +251,7 @@
false
} else {
calculateIfIamIdentityCenterConnection(project) {
val cachedValue = connectionIdToIsAllowlisted[it.id]

Check notice on line 254 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/customization/CodeWhispererModelConfigurator.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Variable declaration could be moved inside 'when'

Variable declaration could be moved into 'when'
when (cachedValue) {
true -> true

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import com.intellij.openapi.project.Project
import com.intellij.testFramework.ApplicationExtension
import io.mockk.every
import io.mockk.mockk
import migration.software.aws.toolkits.jetbrains.settings.AwsSettings
import org.assertj.core.api.Assertions.assertThat
import org.eclipse.lsp4j.ConfigurationItem
import org.eclipse.lsp4j.ConfigurationParams
Expand All @@ -21,6 +22,10 @@ import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.ConnectionMetadata
import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.credentials.SsoProfileData
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
import io.mockk.mockkObject
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfile
import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileManager


@ExtendWith(ApplicationExtension::class)
class AmazonQLanguageClientImplTest {
Expand Down Expand Up @@ -125,6 +130,80 @@ class AmazonQLanguageClientImplTest {
)
}

@Test
fun `configuration for Amazon Q respects telemetry disabled`() {
// Mock ToolkitConnectionManager
val mockConnectionManager = mockk<ToolkitConnectionManager>()
every { project.service<ToolkitConnectionManager>() } returns mockConnectionManager

// Mock QRegionProfileManager
val mockProfileManager = mockk<QRegionProfileManager>()
mockkObject(QRegionProfileManager.Companion)
every { QRegionProfileManager.getInstance() } returns mockProfileManager

// Mock the active profile with an ARN
val mockProfile = mockk<QRegionProfile> {
every { arn } returns "test:arn:123"
}
every { mockProfileManager.activeProfile(project) } returns mockProfile

// Mock AWS Settings
AwsSettings.getInstance().isTelemetryEnabled = false

assertThat(sut.configuration(configurationParams("aws.q")).get())
.singleElement()
.isEqualTo(
AmazonQLspConfiguration(
optOutTelemetry = false,
customization = "test:arn:123"
)
)
}

@Test
fun `configuration for Amazon Q respects telemetry enabled`() {
// Mock ToolkitConnectionManager
val mockConnectionManager = mockk<ToolkitConnectionManager>()
every { project.service<ToolkitConnectionManager>() } returns mockConnectionManager

// Mock QRegionProfileManager
val mockProfileManager = mockk<QRegionProfileManager>()
mockkObject(QRegionProfileManager.Companion)
every { QRegionProfileManager.getInstance() } returns mockProfileManager

// Mock the active profile with an ARN
val mockProfile = mockk<QRegionProfile> {
every { arn } returns "test:arn:123"
}
every { mockProfileManager.activeProfile(project) } returns mockProfile

// Mock AWS Settings
AwsSettings.getInstance().isTelemetryEnabled = true

assertThat(sut.configuration(configurationParams("aws.q")).get())
.singleElement()
.isEqualTo(
AmazonQLspConfiguration(
optOutTelemetry = true,
customization = "test:arn:123"
)
)
}

@Test
fun `Gson serializes AmazonQLspConfiguration correctly`() {
val sut = AmazonQLspConfiguration(
optOutTelemetry = true
)
assertThat(Gson().toJson(sut)).isEqualToIgnoringWhitespace(
"""
{
"optOutTelemetry": true
}
""".trimIndent()
)
}

private fun configurationParams(vararg attributes: String) = ConfigurationParams(
attributes.map {
ConfigurationItem().apply {
Expand Down
Loading