Skip to content

Commit 5b9903c

Browse files
committed
Merge remote-tracking branch 'aws/main' into cw-telemetry
2 parents 3a09725 + fa3dcf2 commit 5b9903c

File tree

21 files changed

+162
-42
lines changed

21 files changed

+162
-42
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" : "Amazon Q Code Transformation: allow users to skip tests"
4+
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/chat/telemetry/TelemetryHelper.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
210210
AmazonqTelemetry.interactWithMessage(
211211
cwsprChatConversationId = getConversationId(message.tabId).orEmpty(),
212212
cwsprChatMessageId = message.messageId,
213+
cwsprChatUserIntent = message.userIntent?.let { getTelemetryUserIntent(it) },
213214
cwsprChatInteractionType = CwsprChatInteractionType.CopySnippet,
214215
cwsprChatAcceptedCharactersLength = message.code.length.toLong(),
215216
cwsprChatInteractionTarget = message.insertionTargetType,
@@ -233,6 +234,7 @@ class TelemetryHelper(private val context: AmazonQAppInitContext, private val se
233234
AmazonqTelemetry.interactWithMessage(
234235
cwsprChatConversationId = getConversationId(message.tabId).orEmpty(),
235236
cwsprChatMessageId = message.messageId,
237+
cwsprChatUserIntent = message.userIntent?.let { getTelemetryUserIntent(it) },
236238
cwsprChatInteractionType = CwsprChatInteractionType.InsertAtCursor,
237239
cwsprChatAcceptedCharactersLength = message.code.length.toLong(),
238240
cwsprChatAcceptedNumberOfLines = message.code.lines().size.toLong(),

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/messages/CwcMessage.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.fasterxml.jackson.databind.JsonSerializer
1313
import com.fasterxml.jackson.databind.SerializerProvider
1414
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
1515
import com.fasterxml.jackson.databind.annotation.JsonSerialize
16+
import software.amazon.awssdk.services.codewhispererstreaming.model.UserIntent
1617
import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthFollowUpType
1718
import software.aws.toolkits.jetbrains.services.amazonq.messages.AmazonQMessage
1819
import software.aws.toolkits.jetbrains.services.amazonq.onboarding.OnboardingPageInteractionType
@@ -65,6 +66,7 @@ sealed interface IncomingCwcMessage : CwcMessage {
6566
val command: String?,
6667
@JsonProperty("tabID") val tabId: String,
6768
val messageId: String,
69+
val userIntent: UserIntent?,
6870
val code: String,
6971
val insertionTargetType: String?,
7072
val eventId: String?,
@@ -75,6 +77,7 @@ sealed interface IncomingCwcMessage : CwcMessage {
7577
data class InsertCodeAtCursorPosition(
7678
@JsonProperty("tabID") val tabId: String,
7779
val messageId: String,
80+
val userIntent: UserIntent?,
7881
val code: String,
7982
val insertionTargetType: String?,
8083
val codeReference: List<CodeReference>?,

plugins/amazonq/chat/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/TelemetryHelperTest.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ class TelemetryHelperTest {
106106
private const val mockRegion = "us-east-1"
107107
private const val tabId = "tabId"
108108
private const val messageId = "messageId"
109+
private val userIntent = UserIntent.SHOW_EXAMPLES
109110
private const val conversationId = "conversationId"
110111
private const val triggerId = "triggerId"
111112
private const val customizationArn = "customizationArn"
@@ -414,6 +415,7 @@ class TelemetryHelperTest {
414415
"command",
415416
tabId,
416417
messageId,
418+
userIntent,
417419
"println()",
418420
"insertionTargetType",
419421
"eventId",
@@ -476,6 +478,7 @@ class TelemetryHelperTest {
476478
IncomingCwcMessage.InsertCodeAtCursorPosition(
477479
tabId,
478480
messageId,
481+
userIntent,
479482
code,
480483
inserTionTargetType,
481484
emptyList(),

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerManager.kt

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
112112
private val isJobSuccessfullyResumed = AtomicBoolean(false)
113113

114114
private val transformationStoppedByUsr = AtomicBoolean(false)
115-
private var codeTransformationSession: CodeModernizerSession? = null
115+
var codeTransformationSession: CodeModernizerSession? = null
116116
set(session) {
117117
if (session != null) {
118118
Disposer.register(this, session)
@@ -383,12 +383,7 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
383383
CodeTransformMessageListener.instance.onMavenBuildResult(mavenCopyCommandsResult)
384384
}
385385

386-
fun runLocalMavenBuild(project: Project, customerSelection: CustomerSelection) {
387-
// Create and set a session
388-
codeTransformationSession = null
389-
val session = createCodeModernizerSession(customerSelection, project)
390-
codeTransformationSession = session
391-
386+
fun runLocalMavenBuild(project: Project, session: CodeModernizerSession) {
392387
projectCoroutineScope(project).launch {
393388
isMvnRunning.set(true)
394389
val result = session.getDependenciesUsingMaven()
@@ -668,14 +663,16 @@ class CodeModernizerManager(private val project: Project) : PersistentStateCompo
668663
telemetry.totalRunTime(result.toString(), jobId)
669664
}
670665

671-
fun createCodeModernizerSession(customerSelection: CustomerSelection, project: Project) = CodeModernizerSession(
672-
CodeModernizerSessionContext(
673-
project,
674-
customerSelection.configurationFile,
675-
customerSelection.sourceJavaVersion,
676-
customerSelection.targetJavaVersion,
677-
),
678-
)
666+
fun createCodeModernizerSession(customerSelection: CustomerSelection, project: Project) {
667+
codeTransformationSession = CodeModernizerSession(
668+
CodeModernizerSessionContext(
669+
project,
670+
customerSelection.configurationFile,
671+
customerSelection.sourceJavaVersion,
672+
customerSelection.targetJavaVersion,
673+
),
674+
)
675+
}
679676

680677
fun showModernizationProgressUI() = codeModernizerBottomWindowPanelManager.showUnalteredJobUI()
681678

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeTransformChatApp.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ private enum class CodeTransformMessageTypes(val type: String) {
3535
CodeTransformStart("codetransform-start"),
3636
CodeTransformStop("codetransform-stop"),
3737
CodeTransformCancel("codetransform-cancel"),
38+
CodeTransformConfirmSkipTests("codetransform-confirm-skip-tests"),
3839
CodeTransformNew("codetransform-new"),
3940
CodeTransformOpenTransformHub("codetransform-open-transform-hub"),
4041
CodeTransformOpenMvnBuild("codetransform-open-mvn-build"),
@@ -64,6 +65,7 @@ class CodeTransformChatApp : AmazonQApp {
6465
CodeTransformMessageTypes.CodeTransformStart.type to IncomingCodeTransformMessage.CodeTransformStart::class,
6566
CodeTransformMessageTypes.CodeTransformStop.type to IncomingCodeTransformMessage.CodeTransformStop::class,
6667
CodeTransformMessageTypes.CodeTransformCancel.type to IncomingCodeTransformMessage.CodeTransformCancel::class,
68+
CodeTransformMessageTypes.CodeTransformConfirmSkipTests.type to IncomingCodeTransformMessage.CodeTransformConfirmSkipTests::class,
6769
CodeTransformMessageTypes.CodeTransformNew.type to IncomingCodeTransformMessage.CodeTransformNew::class,
6870
CodeTransformMessageTypes.CodeTransformOpenTransformHub.type to IncomingCodeTransformMessage.CodeTransformOpenTransformHub::class,
6971
CodeTransformMessageTypes.CodeTransformOpenMvnBuild.type to IncomingCodeTransformMessage.CodeTransformOpenMvnBuild::class,
@@ -153,6 +155,7 @@ class CodeTransformChatApp : AmazonQApp {
153155
is IncomingCodeTransformMessage.CodeTransformStart -> inboundAppMessagesHandler.processCodeTransformStartAction(message)
154156
is IncomingCodeTransformMessage.CodeTransformCancel -> inboundAppMessagesHandler.processCodeTransformCancelAction(message)
155157
is IncomingCodeTransformMessage.CodeTransformStop -> inboundAppMessagesHandler.processCodeTransformStopAction(message.tabId)
158+
is IncomingCodeTransformMessage.CodeTransformConfirmSkipTests -> inboundAppMessagesHandler.processCodeTransformConfirmSkipTests(message)
156159
is IncomingCodeTransformMessage.CodeTransformNew -> inboundAppMessagesHandler.processCodeTransformNewAction(message)
157160
is IncomingCodeTransformMessage.CodeTransformOpenTransformHub -> inboundAppMessagesHandler.processCodeTransformOpenTransformHub(message)
158161
is IncomingCodeTransformMessage.CodeTransformOpenMvnBuild -> inboundAppMessagesHandler.processCodeTransformOpenMvnBuild(message)

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/InboundAppMessagesHandler.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ interface InboundAppMessagesHandler {
1515

1616
suspend fun processCodeTransformStopAction(tabId: String)
1717

18+
suspend fun processCodeTransformConfirmSkipTests(message: IncomingCodeTransformMessage.CodeTransformConfirmSkipTests)
19+
1820
suspend fun processCodeTransformOpenTransformHub(message: IncomingCodeTransformMessage.CodeTransformOpenTransformHub)
1921

2022
suspend fun processCodeTransformOpenMvnBuild(message: IncomingCodeTransformMessage.CodeTransformOpenMvnBuild)

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/constants/CodeTransformChatItems.kt

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ private val confirmUserSelectionButton = Button(
4848
id = CodeTransformButtonId.StartTransformation.id,
4949
)
5050

51+
private val confirmSkipTestsSelectionButton = Button(
52+
keepCardAfterClick = false,
53+
waitMandatoryFormItems = true,
54+
text = message("codemodernizer.chat.message.button.confirm"),
55+
id = CodeTransformButtonId.ConfirmSkipTests.id,
56+
)
57+
5158
private val openMvnBuildButton = Button(
5259
id = CodeTransformButtonId.OpenMvnBuild.id,
5360
text = message("codemodernizer.chat.message.button.view_build"),
@@ -134,6 +141,22 @@ private val selectTargetVersionFormItem = FormItem(
134141
)
135142
)
136143

144+
private val selectSkipTestsFlagFormItem = FormItem(
145+
id = CodeTransformFormItemId.SelectSkipTestsFlag.id,
146+
title = message("codemodernizer.chat.form.user_selection.item.choose_skip_tests_option"),
147+
mandatory = true,
148+
options = listOf(
149+
FormItemOption(
150+
label = message("codemodernizer.chat.message.skip_tests_form.run_tests"),
151+
value = message("codemodernizer.chat.message.skip_tests_form.run_tests"),
152+
),
153+
FormItemOption(
154+
label = message("codemodernizer.chat.message.skip_tests_form.skip"),
155+
value = message("codemodernizer.chat.message.skip_tests_form.skip"),
156+
)
157+
)
158+
)
159+
137160
private fun getUserSelectionFormattedMarkdown(moduleName: String): String = """
138161
### ${message("codemodernizer.chat.prompt.title.details")}
139162
-------------
@@ -184,11 +207,26 @@ fun buildStartNewTransformFollowup(): CodeTransformChatMessageContent = CodeTran
184207
)
185208
)
186209

187-
fun buildAuthRestoredFollowup(): CodeTransformChatMessageContent = CodeTransformChatMessageContent(
188-
type = CodeTransformChatMessageType.FinalizedAnswer,
189-
followUps = listOf(
190-
startNewTransformFollowUp
210+
fun buildUserInputSkipTestsFlagChatIntroContent(): CodeTransformChatMessageContent =
211+
CodeTransformChatMessageContent(
212+
message = message("codemodernizer.chat.message.skip_tests"),
213+
type = CodeTransformChatMessageType.FinalizedAnswer,
191214
)
215+
216+
fun buildUserInputSkipTestsFlagChatContent(): CodeTransformChatMessageContent =
217+
CodeTransformChatMessageContent(
218+
message = message("codemodernizer.chat.form.user_selection.title"),
219+
buttons = listOf(
220+
confirmSkipTestsSelectionButton,
221+
cancelUserSelectionButton,
222+
),
223+
formItems = listOf(selectSkipTestsFlagFormItem),
224+
type = CodeTransformChatMessageType.FinalizedAnswer,
225+
)
226+
227+
fun buildUserSkipTestsFlagSelectionChatContent(skipTestsSelection: String) = CodeTransformChatMessageContent(
228+
type = CodeTransformChatMessageType.FinalizedAnswer,
229+
message = message("codemodernizer.chat.message.skip_tests_form.response", skipTestsSelection.lowercase())
192230
)
193231

194232
fun buildUserInputChatContent(project: Project, validationResult: ValidationResult): CodeTransformChatMessageContent {

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/controller/CodeTransformChatController.kt

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,10 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildTr
5555
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserCancelledChatContent
5656
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserHilSelection
5757
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputChatContent
58+
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputSkipTestsFlagChatContent
59+
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserInputSkipTestsFlagChatIntroContent
5860
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserSelectionSummaryChatContent
61+
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserSkipTestsFlagSelectionChatContent
5962
import software.aws.toolkits.jetbrains.services.codemodernizer.constants.buildUserStopTransformChatContent
6063
import software.aws.toolkits.jetbrains.services.codemodernizer.messages.AuthenticationNeededExceptionMessage
6164
import software.aws.toolkits.jetbrains.services.codemodernizer.messages.CodeTransformChatMessage
@@ -66,6 +69,8 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransfo
6669
import software.aws.toolkits.jetbrains.services.codemodernizer.model.CustomerSelection
6770
import software.aws.toolkits.jetbrains.services.codemodernizer.model.DownloadFailureReason
6871
import software.aws.toolkits.jetbrains.services.codemodernizer.model.JobId
72+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MAVEN_BUILD_RUN_UNIT_TESTS
73+
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MAVEN_BUILD_SKIP_UNIT_TESTS
6974
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenCopyCommandsResult
7075
import software.aws.toolkits.jetbrains.services.codemodernizer.model.MavenDependencyReportCommandsResult
7176
import software.aws.toolkits.jetbrains.services.codemodernizer.model.UploadFailureReason
@@ -208,26 +213,47 @@ class CodeTransformChatController(
208213
val moduleVirtualFile: VirtualFile = modulePath.toVirtualFile() as VirtualFile
209214
val moduleName = context.project.getModuleOrProjectNameForFile(moduleVirtualFile)
210215

211-
codeTransformChatHelper.run {
212-
addNewMessage(buildUserSelectionSummaryChatContent(moduleName))
213-
addNewMessage(buildCompileLocalInProgressChatContent())
214-
}
216+
codeTransformChatHelper.addNewMessage(buildUserSelectionSummaryChatContent(moduleName))
215217

216-
// this should never throw the RuntimeException since invalid JDK case is already handled in previous validation step
217-
val moduleJdkVersion = ModuleUtil.findModuleForFile(moduleVirtualFile, context.project)?.tryGetJdk(context.project)
218-
logger.info { "Found project JDK version: ${context.project.tryGetJdk()}, module JDK version: $moduleJdkVersion. Module JDK version prioritized." }
219-
val sourceJdk = moduleJdkVersion ?: context.project.tryGetJdk() ?: throw RuntimeException("Unable to determine source JDK version")
218+
val sourceJdk = getSourceJdk(moduleVirtualFile)
220219

221220
val selection = CustomerSelection(
222221
moduleVirtualFile,
223222
sourceJdk,
224-
JavaSdkVersion.JDK_17
223+
JavaSdkVersion.JDK_17,
225224
)
226225

226+
// Create and set a session
227+
codeModernizerManager.createCodeModernizerSession(selection, context.project)
228+
227229
// Publish metric to capture user selection before local build starts
228230
telemetry.submitSelection("Confirm", selection)
229231

230-
codeModernizerManager.runLocalMavenBuild(context.project, selection)
232+
codeTransformChatHelper.run {
233+
addNewMessage(buildUserInputSkipTestsFlagChatIntroContent())
234+
addNewMessage(buildUserInputSkipTestsFlagChatContent())
235+
}
236+
}
237+
238+
override suspend fun processCodeTransformConfirmSkipTests(message: IncomingCodeTransformMessage.CodeTransformConfirmSkipTests) {
239+
val customBuildCommand = when (message.skipTestsSelection) {
240+
message("codemodernizer.chat.message.skip_tests_form.skip") -> MAVEN_BUILD_SKIP_UNIT_TESTS
241+
else -> MAVEN_BUILD_RUN_UNIT_TESTS
242+
}
243+
codeTransformChatHelper.addNewMessage(buildUserSkipTestsFlagSelectionChatContent(message.skipTestsSelection))
244+
codeTransformChatHelper.addNewMessage(buildCompileLocalInProgressChatContent())
245+
codeModernizerManager.codeTransformationSession?.let {
246+
it.sessionContext.customBuildCommand = customBuildCommand
247+
codeModernizerManager.runLocalMavenBuild(context.project, it)
248+
}
249+
}
250+
251+
private fun getSourceJdk(moduleConfigurationFile: VirtualFile): JavaSdkVersion {
252+
// this should never throw the RuntimeException since invalid JDK case is already handled in previous validation step
253+
val moduleJdkVersion = ModuleUtil.findModuleForFile(moduleConfigurationFile, context.project)?.tryGetJdk(context.project)
254+
logger.info { "Found project JDK version: ${context.project.tryGetJdk()}, module JDK version: $moduleJdkVersion. Module JDK version prioritized." }
255+
val sourceJdk = moduleJdkVersion ?: context.project.tryGetJdk() ?: error("Unable to determine source JDK version")
256+
return sourceJdk
231257
}
232258

233259
private suspend fun handleMavenBuildResult(mavenBuildResult: MavenCopyCommandsResult) {

plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/messages/CodeTransformMessage.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ sealed interface CodeTransformBaseMessage : AmazonQMessage
1818
enum class CodeTransformButtonId(val id: String) {
1919
StartTransformation("codetransform-input-confirm"),
2020
CancelTransformation("codetransform-input-cancel"),
21+
ConfirmSkipTests("codetransform-input-confirm-skip-tests"),
2122
StopTransformation("stop_transform"),
2223
OpenTransformationHub("open_transformation_hub"),
2324
OpenMvnBuild("open_mvn_build"),
@@ -32,6 +33,7 @@ enum class CodeTransformButtonId(val id: String) {
3233
enum class CodeTransformFormItemId(val id: String) {
3334
SelectModule("module"),
3435
SelectTargetVersion("targetVersion"),
36+
SelectSkipTestsFlag("skipTestsSelection"),
3537
DependencyVersion("dependencyVersion"),
3638
}
3739

@@ -81,6 +83,11 @@ sealed interface IncomingCodeTransformMessage : CodeTransformBaseMessage {
8183
@JsonProperty("tabID") val tabId: String,
8284
) : IncomingCodeTransformMessage
8385

86+
data class CodeTransformConfirmSkipTests(
87+
@JsonProperty("tabID") val tabId: String,
88+
val skipTestsSelection: String,
89+
) : IncomingCodeTransformMessage
90+
8491
data class CodeTransformOpenMvnBuild(
8592
@JsonProperty("tabID") val tabId: String,
8693
) : IncomingCodeTransformMessage

0 commit comments

Comments
 (0)