From 5687fbda0575b0c1a124fcf6d52e60c7a8951151 Mon Sep 17 00:00:00 2001 From: David Hasani Date: Thu, 15 May 2025 15:19:46 -0700 Subject: [PATCH 1/7] parse plan --- .../codemodernizer/CodeModernizerSession.kt | 69 ++++++++++++++++++- .../codemodernizer/model/PlanTable.kt | 2 +- .../codemodernizer/model/ZipManifest.kt | 3 + .../plan/CodeModernizerPlanEditor.kt | 18 +++-- .../utils/CodeTransformApiUtils.kt | 32 ++++++--- .../CodeWhispererCodeModernizerUtilsTest.kt | 26 ++++++- 6 files changed, 133 insertions(+), 17 deletions(-) diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt index b1ff57d6c8d..a6a7084ed43 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt @@ -17,8 +17,10 @@ import software.amazon.awssdk.services.codewhispererruntime.model.StartTransform import software.amazon.awssdk.services.codewhispererruntime.model.TransformationJob import software.amazon.awssdk.services.codewhispererruntime.model.TransformationLanguage import software.amazon.awssdk.services.codewhispererruntime.model.TransformationPlan +import software.amazon.awssdk.services.codewhispererruntime.model.TransformationProgressUpdate import software.amazon.awssdk.services.codewhispererruntime.model.TransformationProgressUpdateStatus import software.amazon.awssdk.services.codewhispererruntime.model.TransformationStatus +import software.amazon.awssdk.services.codewhispererruntime.model.TransformationStep import software.amazon.awssdk.services.codewhispererruntime.model.TransformationUserActionStatus import software.amazon.awssdk.services.codewhispererruntime.model.UploadContext import software.amazon.awssdk.services.codewhispererstreaming.model.TransformationDownloadArtifactType @@ -608,7 +610,72 @@ class CodeModernizerSession( } fun tryOpenTransformationPlanEditor() { - val transformationPlan = getTransformationPlan() + // var transformationPlan = getTransformationPlan() + // TODO: remove this mocked API response + val transformationPlan = TransformationPlan.builder() + .transformationSteps( + listOf( + TransformationStep.builder() + .id("0") + .name("Supplement Info") + .status("COMPLETED") + .progressUpdates( + listOf( + TransformationProgressUpdate.builder() + .name("0") + .status("COMPLETED") + .description("{\"type\":\"STATISTICS\",\"name\":\"Plan Statistics\",\"description\":null,\"columnNames\":[\"name\",\"value\"],\"rows\":[{\"name\":\"linesOfCode\",\"value\":\"2532\"},{\"name\":\"plannedDependencyChanges\",\"value\":\"4\"},{\"name\":\"plannedDeprecatedApiChanges\",\"value\":\"0\"},{\"name\":\"plannedFileChanges\",\"value\":\"7\"}]}") + .build(), + TransformationProgressUpdate.builder() + .name("1") + .status("COMPLETED") + .description("{\"type\":\"DEPENDENCIES\",\"name\":\"Dependency Changes\",\"description\":null,\"columnNames\":[\"dependencyName\",\"action\",\"currentVersion\",\"targetVersion\"],\"rows\":[{\"dependencyName\":\"junit:junit\",\"action\":\"REMOVE\",\"currentVersion\":\"4.12\",\"targetVersion\":\"-\"},{\"dependencyName\":\"org.apache.logging.log4j:log4j-slf4j-impl\",\"action\":\"ADD\",\"currentVersion\":\"-\",\"targetVersion\":\"2.x\"},{\"dependencyName\":\"org.apache.maven.plugins:maven-surefire-plugin\",\"action\":\"UPDATE\",\"currentVersion\":\"2.18.1\",\"targetVersion\":\"3.1.x\"},{\"dependencyName\":\"org.slf4j:slf4j-log4j12\",\"action\":\"REMOVE\",\"currentVersion\":\"1.8.0-beta0\",\"targetVersion\":\"-\"}]}") + .build(), + TransformationProgressUpdate.builder() + .name("1") + .status("COMPLETED") + .description("{\"type\":\"DEPENDENCIES\",\"name\":\"Dependency Changes\",\"description\":null,\"columnNames\":[\"dependencyName\",\"action\",\"currentVersion\",\"targetVersion\"],\"rows\":[{\"dependencyName\":\"junit:junit\",\"action\":\"REMOVE\",\"currentVersion\":\"4.12\",\"targetVersion\":\"-\"},{\"dependencyName\":\"org.apache.logging.log4j:log4j-slf4j-impl\",\"action\":\"ADD\",\"currentVersion\":\"-\",\"targetVersion\":\"2.x\"},{\"dependencyName\":\"org.apache.maven.plugins:maven-surefire-plugin\",\"action\":\"UPDATE\",\"currentVersion\":\"2.18.1\",\"targetVersion\":\"3.1.x\"},{\"dependencyName\":\"org.slf4j:slf4j-log4j12\",\"action\":\"REMOVE\",\"currentVersion\":\"1.8.0-beta0\",\"targetVersion\":\"-\"}]}") + .build(), + TransformationProgressUpdate.builder() + .name("1") + .status("COMPLETED") + .description("{\"type\":\"DEPENDENCIES\",\"name\":\"Dependency Changes\",\"description\":null,\"columnNames\":[\"dependencyName\",\"action\",\"currentVersion\",\"targetVersion\"],\"rows\":[{\"dependencyName\":\"com.squareup.okio:okio\",\"action\":\"UPDATE\",\"currentVersion\":\"4.12\",\"targetVersion\":\"-\"},{\"dependencyName\":\"org.apache.logging.log4j:log4j-slf4j-impl\",\"action\":\"ADD\",\"currentVersion\":\"-\",\"targetVersion\":\"2.x\"},{\"dependencyName\":\"org.apache.maven.plugins:maven-surefire-plugin\",\"action\":\"UPDATE\",\"currentVersion\":\"2.18.1\",\"targetVersion\":\"3.1.x\"},{\"dependencyName\":\"org.slf4j:slf4j-log4j12\",\"action\":\"REMOVE\",\"currentVersion\":\"1.8.0-beta0\",\"targetVersion\":\"-\"}]}") + .build(), + TransformationProgressUpdate.builder() + .name("1") + .status("COMPLETED") + .description("{\"type\":\"DEPENDENCIES\",\"name\":\"Dependency Changes\",\"description\":null,\"columnNames\":[\"dependencyName\",\"action\",\"currentVersion\",\"targetVersion\"],\"rows\":[{\"dependencyName\":\"com.squareup.okio:okio\",\"action\":\"UPDATE\",\"currentVersion\":\"4.12\",\"targetVersion\":\"-\"},{\"dependencyName\":\"org.apache.logging.log4j:log4j-slf4j-impl\",\"action\":\"ADD\",\"currentVersion\":\"-\",\"targetVersion\":\"2.x\"},{\"dependencyName\":\"org.apache.maven.plugins:maven-surefire-plugin\",\"action\":\"UPDATE\",\"currentVersion\":\"2.18.1\",\"targetVersion\":\"3.1.x\"},{\"dependencyName\":\"org.slf4j:slf4j-log4j12\",\"action\":\"REMOVE\",\"currentVersion\":\"1.8.0-beta0\",\"targetVersion\":\"-\"}]}") + .build(), + TransformationProgressUpdate.builder() + .name("1") + .status("COMPLETED") + .description("{\"type\":\"DEPENDENCIES\",\"name\":\"Dependency Changes\",\"description\":null,\"columnNames\":[\"dependencyName\",\"action\",\"currentVersion\",\"targetVersion\"],\"rows\":[{\"dependencyName\":\"com.squareup.okio:okio\",\"action\":\"UPDATE\",\"currentVersion\":\"4.12\",\"targetVersion\":\"-\"},{\"dependencyName\":\"org.apache.logging.log4j:log4j-slf4j-impl\",\"action\":\"ADD\",\"currentVersion\":\"-\",\"targetVersion\":\"2.x\"},{\"dependencyName\":\"org.apache.maven.plugins:maven-surefire-plugin\",\"action\":\"UPDATE\",\"currentVersion\":\"2.18.1\",\"targetVersion\":\"3.1.x\"},{\"dependencyName\":\"org.slf4j:slf4j-log4j12\",\"action\":\"REMOVE\",\"currentVersion\":\"1.8.0-beta0\",\"targetVersion\":\"-\"}]}") + .build(), + TransformationProgressUpdate.builder() + .name("-1") + .status("COMPLETED") + .description("{\"type\":\"FILES\",\"name\":\"File Changes\",\"description\":null,\"columnNames\":[\"relativePath\",\"action\"],\"rows\":[{\"relativePath\":\"src/main/test/com/nxllxn/plantuml/java/TopLevelInterfaceTest.java\",\"action\":\"UPDATE\"},{\"relativePath\":\"src/main/test/com/nxllxn/plantuml/java/TopLevelEnumerationTest.java\",\"action\":\"UPDATE\"},{\"relativePath\":\"src/main/test/com/nxllxn/plantuml/java/TopLevelClassTest.java\",\"action\":\"UPDATE\"},{\"relativePath\":\"src/main/test/com/nxllxn/plantuml/java/TopLevelAnnotationTest.java\",\"action\":\"UPDATE\"},{\"relativePath\":\"src/main/test/com/nxllxn/plantuml/java/ParameterTest.java\",\"action\":\"UPDATE\"},{\"relativePath\":\"src/main/test/com/nxllxn/plantuml/java/MethodTest.java\",\"action\":\"UPDATE\"},{\"relativePath\":\"src/main/test/com/nxllxn/plantuml/java/FieldTest.java\",\"action\":\"UPDATE\"}]}") + .build() + ) + ) + .build(), + TransformationStep.builder() + .id("1") + .name("Step 1 - Update JDK version, dependencies and related code (David)") + .description("Amazon Q will attempt to update the JDK version and change the following dependencies and related code.") + .status("CREATED") + .progressUpdates(emptyList()) + .build(), + TransformationStep.builder() + .id("2") + .name("Step 2 - Finalize code changes") + .description("Amazon Q will attempt to replace the following instances of deprecated code.") + .status("CREATED") + .progressUpdates(emptyList()) + .build() + ) + ) + .build() if (transformationPlan != null) { runInEdt { CodeModernizerPlanEditorProvider.openEditor( diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/PlanTable.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/PlanTable.kt index ef1784b9e7c..781ef05ca03 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/PlanTable.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/PlanTable.kt @@ -11,7 +11,7 @@ data class PlanTable( @JsonProperty("columnNames") val columns: List, @JsonProperty("rows") - val rows: List, + val rows: MutableList, @JsonProperty("name") val name: String, ) diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/ZipManifest.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/ZipManifest.kt index e65b08f7e12..c5dcdcbcd67 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/ZipManifest.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/ZipManifest.kt @@ -11,6 +11,9 @@ data class ZipManifest( val version: String = UPLOAD_ZIP_MANIFEST_VERSION, val hilCapabilities: List = listOf(HIL_1P_UPGRADE_CAPABILITY), // TODO: add CLIENT_SIDE_BUILD to transformCapabilities when releasing CSB + + // TODO: add AGENTIC_PLAN_V1 or something here + val transformCapabilities: List = listOf(EXPLAINABILITY_V1), val customBuildCommand: String = MAVEN_BUILD_RUN_UNIT_TESTS, val requestedConversions: RequestedConversions? = null, // only used for SQL conversions for now diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/plan/CodeModernizerPlanEditor.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/plan/CodeModernizerPlanEditor.kt index 74202e35f11..b5ed5ebef64 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/plan/CodeModernizerPlanEditor.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/plan/CodeModernizerPlanEditor.kt @@ -24,6 +24,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.constants.LOC_THR import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerArtifact.Companion.MAPPER import software.aws.toolkits.jetbrains.services.codemodernizer.model.PlanTable import software.aws.toolkits.jetbrains.services.codemodernizer.plan.CodeModernizerPlanEditorProvider.Companion.MIGRATION_PLAN_KEY +import software.aws.toolkits.jetbrains.services.codemodernizer.utils.combineTableRows import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getAuthType import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getBillingText import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getLinesOfCodeSubmitted @@ -103,10 +104,10 @@ class CodeModernizerPlanEditor(val project: Project, private val virtualFile: Vi ) } add(transformationPlanPanel(plan), CodeModernizerUIConstants.transformationPlanPlaneConstraint) - // key "-1" reserved for appendix table + // key "-1" reserved for appendix table; only 1 table there if (APPENDIX_TABLE_KEY in tableMapping) { add( - tableMapping[APPENDIX_TABLE_KEY]?.let { MAPPER.readValue(it) }?.let { transformationPlanAppendix(it) }, + tableMapping[APPENDIX_TABLE_KEY]?.get(0)?.let { MAPPER.readValue(it) }?.let { transformationPlanAppendix(it) }, CodeModernizerUIConstants.transformationPlanPlaneConstraint, ) } @@ -393,10 +394,17 @@ class CodeModernizerPlanEditor(val project: Project, private val virtualFile: Vi border = CodeModernizerUIConstants.DESCRIPTION_BORDER } - val table = tableMapping[step.id()] + val tables = tableMapping[step.id()] - var parsedTable = table?.let { - MAPPER.readValue(it) + val parsedTables = tables?.map { table -> + MAPPER.readValue(table) + } + + var parsedTable: PlanTable? = if (parsedTables?.size == 1) { + parsedTables.first() + } else { + // for multiple tables under 1 step, the table headers are the same, so combine the rows and just show 1 combined table + combineTableRows(parsedTables) } if (parsedTable?.rows?.isEmpty() == true) { diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/utils/CodeTransformApiUtils.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/utils/CodeTransformApiUtils.kt index 6495508328b..d8904e15bf0 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/utils/CodeTransformApiUtils.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/utils/CodeTransformApiUtils.kt @@ -286,19 +286,33 @@ fun findDownloadArtifactProgressUpdate(transformationSteps: List): Map { - if (stepZeroProgressUpdates.isNotEmpty()) { - return stepZeroProgressUpdates.associate { - it.name() to it.description() +fun getTableMapping(stepZeroProgressUpdates: List): Map> { + return stepZeroProgressUpdates.groupBy( + { it.name() }, + { it.description() } + ) +} + +// ID of '0' reserved for job statistics table; only 1 table there +fun parseTableMapping(tableMapping: Map>): PlanTable { + val statsTable = tableMapping[JOB_STATISTICS_TABLE_KEY]?.get(0) ?: error("No transformation statistics table found in GetPlan response") + return MAPPER.readValue(statsTable) +} + +// columns and name are shared between all PlanTables, so just combine the rows here +fun combineTableRows(tables: List?): PlanTable? { + if (tables == null) { + return null + } + val combinedTable = PlanTable(tables.first().columns, mutableListOf(), tables.first().name) + tables.forEach { table -> + table.rows.forEach { row -> + combinedTable.rows.add(row) } - } else { - error("GetPlan response missing step 0 progress updates with table data") } + return combinedTable } -fun parseTableMapping(tableMapping: Map): PlanTable? = - tableMapping[JOB_STATISTICS_TABLE_KEY]?.let { MAPPER.readValue(it) } - fun getBillingText(linesOfCode: Int): String { val estimatedCost = String.format(Locale.US, "%.2f", linesOfCode.times(BILLING_RATE)) return message("codemodernizer.migration_plan.header.billing_text", linesOfCode, BILLING_RATE, estimatedCost) diff --git a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt index 37482669432..33e8db38bea 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt @@ -3,6 +3,7 @@ package software.aws.toolkits.jetbrains.services.codemodernizer +import com.fasterxml.jackson.module.kotlin.readValue import com.intellij.testFramework.LightVirtualFile import io.mockk.every import io.mockk.just @@ -26,7 +27,10 @@ import software.amazon.awssdk.services.codewhispererruntime.model.Transformation import software.amazon.awssdk.services.codewhispererruntime.model.TransformationStatus import software.amazon.awssdk.services.codewhispererruntime.model.TransformationStep import software.amazon.awssdk.services.ssooidc.model.InvalidGrantException +import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeModernizerArtifact.Companion.MAPPER import software.aws.toolkits.jetbrains.services.codemodernizer.model.CodeTransformType +import software.aws.toolkits.jetbrains.services.codemodernizer.model.PlanTable +import software.aws.toolkits.jetbrains.services.codemodernizer.utils.combineTableRows import software.aws.toolkits.jetbrains.services.codemodernizer.utils.createClientSideBuildUploadZip import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getBillingText import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getClientInstructionArtifactId @@ -224,10 +228,30 @@ class CodeWhispererCodeModernizerUtilsTest : CodeWhispererCodeModernizerTestBase val step0Update2 = TransformationProgressUpdate.builder().name("2").status("COMPLETED").description(apiChanges).build() val step0Update3 = TransformationProgressUpdate.builder().name("-1").status("COMPLETED").description(fileChanges).build() val actual = getTableMapping(listOf(step0Update0, step0Update1, step0Update2, step0Update3)) - val expected = mapOf("0" to jobStats, "1" to depChanges, "2" to apiChanges, "-1" to fileChanges) + val expected = mapOf("0" to listOf(jobStats), "1" to listOf(depChanges), "2" to listOf(apiChanges), "-1" to listOf(fileChanges)) assertThat(expected).isEqualTo(actual) } + @Test + fun `combineTableRows combines multiple dependency tables correctly`() { + val table1Json = """ + {"name":"Dependency changes", "columnNames":["dependencyName","action","currentVersion","targetVersion"], + "rows":[{"dependencyName":"org.springframework.boot","action":"Update","currentVersion":"2.1","targetVersion":"2.4"}]} + """.trimIndent() + val table2Json = """ + {"name":"Dependency changes", "columnNames":["dependencyName","action","currentVersion","targetVersion"], + "rows":[{"dependencyName":"junit","action":"Add","currentVersion":"","targetVersion":"4.13"}]} + """.trimIndent() + val tables = listOf( + MAPPER.readValue(table1Json), + MAPPER.readValue(table2Json) + ) + val combinedTable = combineTableRows(tables) + assertThat(combinedTable?.rows).hasSize(2) + assertThat(combinedTable?.name).isEqualTo("Dependency changes") + assertThat(combinedTable?.columns).hasSize(4) + } + @Test fun `getClientInstructionArtifactId extracts artifact ID from transformation plan`() { val step1 = TransformationStep.builder() From ce644d868c7b31cd9f6d7191f49ba02ec0b2be78 Mon Sep 17 00:00:00 2001 From: David Hasani Date: Sat, 17 May 2025 19:13:20 -0700 Subject: [PATCH 2/7] open plan regularly --- .../codemodernizer/CodeModernizerSession.kt | 75 +------------------ .../codemodernizer/model/ZipManifest.kt | 4 +- 2 files changed, 4 insertions(+), 75 deletions(-) diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt index a6a7084ed43..519fbd57fb1 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt @@ -17,10 +17,8 @@ import software.amazon.awssdk.services.codewhispererruntime.model.StartTransform import software.amazon.awssdk.services.codewhispererruntime.model.TransformationJob import software.amazon.awssdk.services.codewhispererruntime.model.TransformationLanguage import software.amazon.awssdk.services.codewhispererruntime.model.TransformationPlan -import software.amazon.awssdk.services.codewhispererruntime.model.TransformationProgressUpdate import software.amazon.awssdk.services.codewhispererruntime.model.TransformationProgressUpdateStatus import software.amazon.awssdk.services.codewhispererruntime.model.TransformationStatus -import software.amazon.awssdk.services.codewhispererruntime.model.TransformationStep import software.amazon.awssdk.services.codewhispererruntime.model.TransformationUserActionStatus import software.amazon.awssdk.services.codewhispererruntime.model.UploadContext import software.amazon.awssdk.services.codewhispererstreaming.model.TransformationDownloadArtifactType @@ -443,7 +441,6 @@ class CodeModernizerSession( // add delay to avoid the throttling error delay(1000) - var isTransformationPlanEditorOpened = false var passedBuild = false var passedStart = false @@ -480,10 +477,9 @@ class CodeModernizerSession( } } - // Open the transformation plan detail panel once transformation plan is available (no plan for SQL conversions) - if (transformType != CodeTransformType.SQL_CONVERSION && state.transformationPlan != null && !isTransformationPlanEditorOpened) { + // open plan once available (N/A for SQL conversions) + if (transformType != CodeTransformType.SQL_CONVERSION) { tryOpenTransformationPlanEditor() - isTransformationPlanEditorOpened = true } val instant = Instant.now() // Set the job start time @@ -610,72 +606,7 @@ class CodeModernizerSession( } fun tryOpenTransformationPlanEditor() { - // var transformationPlan = getTransformationPlan() - // TODO: remove this mocked API response - val transformationPlan = TransformationPlan.builder() - .transformationSteps( - listOf( - TransformationStep.builder() - .id("0") - .name("Supplement Info") - .status("COMPLETED") - .progressUpdates( - listOf( - TransformationProgressUpdate.builder() - .name("0") - .status("COMPLETED") - .description("{\"type\":\"STATISTICS\",\"name\":\"Plan Statistics\",\"description\":null,\"columnNames\":[\"name\",\"value\"],\"rows\":[{\"name\":\"linesOfCode\",\"value\":\"2532\"},{\"name\":\"plannedDependencyChanges\",\"value\":\"4\"},{\"name\":\"plannedDeprecatedApiChanges\",\"value\":\"0\"},{\"name\":\"plannedFileChanges\",\"value\":\"7\"}]}") - .build(), - TransformationProgressUpdate.builder() - .name("1") - .status("COMPLETED") - .description("{\"type\":\"DEPENDENCIES\",\"name\":\"Dependency Changes\",\"description\":null,\"columnNames\":[\"dependencyName\",\"action\",\"currentVersion\",\"targetVersion\"],\"rows\":[{\"dependencyName\":\"junit:junit\",\"action\":\"REMOVE\",\"currentVersion\":\"4.12\",\"targetVersion\":\"-\"},{\"dependencyName\":\"org.apache.logging.log4j:log4j-slf4j-impl\",\"action\":\"ADD\",\"currentVersion\":\"-\",\"targetVersion\":\"2.x\"},{\"dependencyName\":\"org.apache.maven.plugins:maven-surefire-plugin\",\"action\":\"UPDATE\",\"currentVersion\":\"2.18.1\",\"targetVersion\":\"3.1.x\"},{\"dependencyName\":\"org.slf4j:slf4j-log4j12\",\"action\":\"REMOVE\",\"currentVersion\":\"1.8.0-beta0\",\"targetVersion\":\"-\"}]}") - .build(), - TransformationProgressUpdate.builder() - .name("1") - .status("COMPLETED") - .description("{\"type\":\"DEPENDENCIES\",\"name\":\"Dependency Changes\",\"description\":null,\"columnNames\":[\"dependencyName\",\"action\",\"currentVersion\",\"targetVersion\"],\"rows\":[{\"dependencyName\":\"junit:junit\",\"action\":\"REMOVE\",\"currentVersion\":\"4.12\",\"targetVersion\":\"-\"},{\"dependencyName\":\"org.apache.logging.log4j:log4j-slf4j-impl\",\"action\":\"ADD\",\"currentVersion\":\"-\",\"targetVersion\":\"2.x\"},{\"dependencyName\":\"org.apache.maven.plugins:maven-surefire-plugin\",\"action\":\"UPDATE\",\"currentVersion\":\"2.18.1\",\"targetVersion\":\"3.1.x\"},{\"dependencyName\":\"org.slf4j:slf4j-log4j12\",\"action\":\"REMOVE\",\"currentVersion\":\"1.8.0-beta0\",\"targetVersion\":\"-\"}]}") - .build(), - TransformationProgressUpdate.builder() - .name("1") - .status("COMPLETED") - .description("{\"type\":\"DEPENDENCIES\",\"name\":\"Dependency Changes\",\"description\":null,\"columnNames\":[\"dependencyName\",\"action\",\"currentVersion\",\"targetVersion\"],\"rows\":[{\"dependencyName\":\"com.squareup.okio:okio\",\"action\":\"UPDATE\",\"currentVersion\":\"4.12\",\"targetVersion\":\"-\"},{\"dependencyName\":\"org.apache.logging.log4j:log4j-slf4j-impl\",\"action\":\"ADD\",\"currentVersion\":\"-\",\"targetVersion\":\"2.x\"},{\"dependencyName\":\"org.apache.maven.plugins:maven-surefire-plugin\",\"action\":\"UPDATE\",\"currentVersion\":\"2.18.1\",\"targetVersion\":\"3.1.x\"},{\"dependencyName\":\"org.slf4j:slf4j-log4j12\",\"action\":\"REMOVE\",\"currentVersion\":\"1.8.0-beta0\",\"targetVersion\":\"-\"}]}") - .build(), - TransformationProgressUpdate.builder() - .name("1") - .status("COMPLETED") - .description("{\"type\":\"DEPENDENCIES\",\"name\":\"Dependency Changes\",\"description\":null,\"columnNames\":[\"dependencyName\",\"action\",\"currentVersion\",\"targetVersion\"],\"rows\":[{\"dependencyName\":\"com.squareup.okio:okio\",\"action\":\"UPDATE\",\"currentVersion\":\"4.12\",\"targetVersion\":\"-\"},{\"dependencyName\":\"org.apache.logging.log4j:log4j-slf4j-impl\",\"action\":\"ADD\",\"currentVersion\":\"-\",\"targetVersion\":\"2.x\"},{\"dependencyName\":\"org.apache.maven.plugins:maven-surefire-plugin\",\"action\":\"UPDATE\",\"currentVersion\":\"2.18.1\",\"targetVersion\":\"3.1.x\"},{\"dependencyName\":\"org.slf4j:slf4j-log4j12\",\"action\":\"REMOVE\",\"currentVersion\":\"1.8.0-beta0\",\"targetVersion\":\"-\"}]}") - .build(), - TransformationProgressUpdate.builder() - .name("1") - .status("COMPLETED") - .description("{\"type\":\"DEPENDENCIES\",\"name\":\"Dependency Changes\",\"description\":null,\"columnNames\":[\"dependencyName\",\"action\",\"currentVersion\",\"targetVersion\"],\"rows\":[{\"dependencyName\":\"com.squareup.okio:okio\",\"action\":\"UPDATE\",\"currentVersion\":\"4.12\",\"targetVersion\":\"-\"},{\"dependencyName\":\"org.apache.logging.log4j:log4j-slf4j-impl\",\"action\":\"ADD\",\"currentVersion\":\"-\",\"targetVersion\":\"2.x\"},{\"dependencyName\":\"org.apache.maven.plugins:maven-surefire-plugin\",\"action\":\"UPDATE\",\"currentVersion\":\"2.18.1\",\"targetVersion\":\"3.1.x\"},{\"dependencyName\":\"org.slf4j:slf4j-log4j12\",\"action\":\"REMOVE\",\"currentVersion\":\"1.8.0-beta0\",\"targetVersion\":\"-\"}]}") - .build(), - TransformationProgressUpdate.builder() - .name("-1") - .status("COMPLETED") - .description("{\"type\":\"FILES\",\"name\":\"File Changes\",\"description\":null,\"columnNames\":[\"relativePath\",\"action\"],\"rows\":[{\"relativePath\":\"src/main/test/com/nxllxn/plantuml/java/TopLevelInterfaceTest.java\",\"action\":\"UPDATE\"},{\"relativePath\":\"src/main/test/com/nxllxn/plantuml/java/TopLevelEnumerationTest.java\",\"action\":\"UPDATE\"},{\"relativePath\":\"src/main/test/com/nxllxn/plantuml/java/TopLevelClassTest.java\",\"action\":\"UPDATE\"},{\"relativePath\":\"src/main/test/com/nxllxn/plantuml/java/TopLevelAnnotationTest.java\",\"action\":\"UPDATE\"},{\"relativePath\":\"src/main/test/com/nxllxn/plantuml/java/ParameterTest.java\",\"action\":\"UPDATE\"},{\"relativePath\":\"src/main/test/com/nxllxn/plantuml/java/MethodTest.java\",\"action\":\"UPDATE\"},{\"relativePath\":\"src/main/test/com/nxllxn/plantuml/java/FieldTest.java\",\"action\":\"UPDATE\"}]}") - .build() - ) - ) - .build(), - TransformationStep.builder() - .id("1") - .name("Step 1 - Update JDK version, dependencies and related code (David)") - .description("Amazon Q will attempt to update the JDK version and change the following dependencies and related code.") - .status("CREATED") - .progressUpdates(emptyList()) - .build(), - TransformationStep.builder() - .id("2") - .name("Step 2 - Finalize code changes") - .description("Amazon Q will attempt to replace the following instances of deprecated code.") - .status("CREATED") - .progressUpdates(emptyList()) - .build() - ) - ) - .build() + val transformationPlan = getTransformationPlan() if (transformationPlan != null) { runInEdt { CodeModernizerPlanEditorProvider.openEditor( diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/ZipManifest.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/ZipManifest.kt index c5dcdcbcd67..9fb6b14a380 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/ZipManifest.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/model/ZipManifest.kt @@ -11,9 +11,7 @@ data class ZipManifest( val version: String = UPLOAD_ZIP_MANIFEST_VERSION, val hilCapabilities: List = listOf(HIL_1P_UPGRADE_CAPABILITY), // TODO: add CLIENT_SIDE_BUILD to transformCapabilities when releasing CSB - - // TODO: add AGENTIC_PLAN_V1 or something here - + // TODO: add AGENTIC_PLAN_V1 or something here AND in processCodeTransformSkipTests when backend allowlists everyone val transformCapabilities: List = listOf(EXPLAINABILITY_V1), val customBuildCommand: String = MAVEN_BUILD_RUN_UNIT_TESTS, val requestedConversions: RequestedConversions? = null, // only used for SQL conversions for now From 99503d0c3064ffb447ba8ad89d1bf2a14ee131f4 Mon Sep 17 00:00:00 2001 From: David Hasani Date: Sat, 17 May 2025 19:39:51 -0700 Subject: [PATCH 3/7] fix detekt --- .../services/codemodernizer/utils/CodeTransformApiUtils.kt | 5 ++--- .../codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/utils/CodeTransformApiUtils.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/utils/CodeTransformApiUtils.kt index d8904e15bf0..e1f4f8e26f7 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/utils/CodeTransformApiUtils.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/utils/CodeTransformApiUtils.kt @@ -286,12 +286,11 @@ fun findDownloadArtifactProgressUpdate(transformationSteps: List): Map> { - return stepZeroProgressUpdates.groupBy( +fun getTableMapping(stepZeroProgressUpdates: List): Map> = + stepZeroProgressUpdates.groupBy( { it.name() }, { it.description() } ) -} // ID of '0' reserved for job statistics table; only 1 table there fun parseTableMapping(tableMapping: Map>): PlanTable { diff --git a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt index 33e8db38bea..5fa031bb7bd 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt @@ -237,11 +237,11 @@ class CodeWhispererCodeModernizerUtilsTest : CodeWhispererCodeModernizerTestBase val table1Json = """ {"name":"Dependency changes", "columnNames":["dependencyName","action","currentVersion","targetVersion"], "rows":[{"dependencyName":"org.springframework.boot","action":"Update","currentVersion":"2.1","targetVersion":"2.4"}]} - """.trimIndent() + """.trimIndent() val table2Json = """ {"name":"Dependency changes", "columnNames":["dependencyName","action","currentVersion","targetVersion"], "rows":[{"dependencyName":"junit","action":"Add","currentVersion":"","targetVersion":"4.13"}]} - """.trimIndent() + """.trimIndent() val tables = listOf( MAPPER.readValue(table1Json), MAPPER.readValue(table2Json) From 853133442bc8b3a4d47c733a5d56ac10d3c3676f Mon Sep 17 00:00:00 2001 From: David Hasani Date: Sat, 17 May 2025 20:41:37 -0700 Subject: [PATCH 4/7] fix detekt --- .../services/codemodernizer/plan/CodeModernizerPlanEditor.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/plan/CodeModernizerPlanEditor.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/plan/CodeModernizerPlanEditor.kt index b5ed5ebef64..11372b85283 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/plan/CodeModernizerPlanEditor.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/plan/CodeModernizerPlanEditor.kt @@ -77,7 +77,7 @@ class CodeModernizerPlanEditor(val project: Project, private val virtualFile: Vi // comes from "name" field of each progressUpdate in step zero of plan if (JOB_STATISTICS_TABLE_KEY in tableMapping) { val planTable = parseTableMapping(tableMapping) - val linesOfCode = planTable?.let { getLinesOfCodeSubmitted(it) } + val linesOfCode = getLinesOfCodeSubmitted(planTable) if (linesOfCode != null && linesOfCode > LOC_THRESHOLD && getAuthType(project) == CredentialSourceId.IamIdentityCenter) { val billingText = getBillingText(linesOfCode) val billingTextComponent = @@ -99,7 +99,7 @@ class CodeModernizerPlanEditor(val project: Project, private val virtualFile: Vi add(billingTextComponent, CodeModernizerUIConstants.transformationPlanPlaneConstraint) } add( - planTable?.let { transformationPlanInfo(it) }, + transformationPlanInfo(planTable), CodeModernizerUIConstants.transformationPlanPlaneConstraint, ) } From 6bda8573626a66eabce53b4bd07f745e7344574b Mon Sep 17 00:00:00 2001 From: David Hasani Date: Mon, 19 May 2025 20:33:27 -0700 Subject: [PATCH 5/7] only show plan once --- .../codemodernizer/CodeModernizerSession.kt | 11 ++++-- .../CodeModernizerBottomWindowPanelManager.kt | 3 +- .../utils/CodeTransformApiUtils.kt | 4 +++ .../CodeWhispererCodeModernizerUtilsTest.kt | 36 +++++++++++++++++++ 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt index 519fbd57fb1..b95cadf83b3 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt @@ -51,6 +51,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.utils.STATES_AFTE import software.aws.toolkits.jetbrains.services.codemodernizer.utils.calculateTotalLatency import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getModuleOrProjectNameForFile import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getPathToHilDependencyReportDir +import software.aws.toolkits.jetbrains.services.codemodernizer.utils.isPlanComplete import software.aws.toolkits.jetbrains.services.codemodernizer.utils.isValidCodeTransformConnection import software.aws.toolkits.jetbrains.services.codemodernizer.utils.pollTransformationStatusAndPlan import software.aws.toolkits.jetbrains.services.codemodernizer.utils.toTransformationLanguage @@ -441,6 +442,7 @@ class CodeModernizerSession( // add delay to avoid the throttling error delay(1000) + var isTransformationPlanEditorOpened = false var passedBuild = false var passedStart = false @@ -477,9 +479,12 @@ class CodeModernizerSession( } } - // open plan once available (N/A for SQL conversions) - if (transformType != CodeTransformType.SQL_CONVERSION) { - tryOpenTransformationPlanEditor() + if (!isTransformationPlanEditorOpened) { + val isPlanComplete = isPlanComplete(state.transformationPlan) + if (isPlanComplete) { + tryOpenTransformationPlanEditor() + isTransformationPlanEditorOpened = true + } } val instant = Instant.now() // Set the job start time diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/panels/managers/CodeModernizerBottomWindowPanelManager.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/panels/managers/CodeModernizerBottomWindowPanelManager.kt index 0d51765749d..eec38b73276 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/panels/managers/CodeModernizerBottomWindowPanelManager.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/panels/managers/CodeModernizerBottomWindowPanelManager.kt @@ -28,6 +28,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.panels.CodeModern import software.aws.toolkits.jetbrains.services.codemodernizer.panels.LoadingPanel import software.aws.toolkits.jetbrains.services.codemodernizer.state.CodeModernizerSessionState import software.aws.toolkits.jetbrains.services.codemodernizer.toolwindow.CodeModernizerBottomToolWindowFactory +import software.aws.toolkits.jetbrains.services.codemodernizer.utils.isPlanComplete import software.aws.toolkits.resources.message import java.awt.BorderLayout import java.awt.Component @@ -251,7 +252,7 @@ class CodeModernizerBottomWindowPanelManager(private val project: Project) : JPa TransformationStatus.PAUSED, TransformationStatus.COMPLETED, TransformationStatus.PARTIALLY_COMPLETED - ) && transformType != CodeTransformType.SQL_CONVERSION // no plan for SQL conversions + ) && transformType == CodeTransformType.LANGUAGE_UPGRADE && isPlanComplete(plan) ) { addPlanToBanner() } diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/utils/CodeTransformApiUtils.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/utils/CodeTransformApiUtils.kt index e1f4f8e26f7..730ab8ea267 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/utils/CodeTransformApiUtils.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/utils/CodeTransformApiUtils.kt @@ -4,6 +4,7 @@ package software.aws.toolkits.jetbrains.services.codemodernizer.utils import com.fasterxml.jackson.module.kotlin.readValue +import com.intellij.grazie.utils.orFalse import com.intellij.notification.NotificationAction import com.intellij.openapi.application.runInEdt import com.intellij.openapi.application.runWriteAction @@ -285,6 +286,9 @@ fun findDownloadArtifactProgressUpdate(transformationSteps: List update.name() == "1" }.orFalse() + // "name" holds the ID of the corresponding plan step (where table will go) and "description" holds the plan data fun getTableMapping(stepZeroProgressUpdates: List): Map> = stepZeroProgressUpdates.groupBy( diff --git a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt index 5fa031bb7bd..bf671c84eaf 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt @@ -35,6 +35,7 @@ import software.aws.toolkits.jetbrains.services.codemodernizer.utils.createClien import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getBillingText import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getClientInstructionArtifactId import software.aws.toolkits.jetbrains.services.codemodernizer.utils.getTableMapping +import software.aws.toolkits.jetbrains.services.codemodernizer.utils.isPlanComplete import software.aws.toolkits.jetbrains.services.codemodernizer.utils.parseBuildFile import software.aws.toolkits.jetbrains.services.codemodernizer.utils.pollTransformationStatusAndPlan import software.aws.toolkits.jetbrains.services.codemodernizer.utils.refreshToken @@ -252,6 +253,41 @@ class CodeWhispererCodeModernizerUtilsTest : CodeWhispererCodeModernizerTestBase assertThat(combinedTable?.columns).hasSize(4) } + @Test + fun `isPlanComplete returns true when plan has progress update with name '1'`() { + // Arrange + val plan = TransformationPlan.builder() + .transformationSteps(listOf( + TransformationStep.builder() + .progressUpdates(listOf( + TransformationProgressUpdate.builder() + .name("1") + .build() + )) + .build() + )) + .build() + val result = isPlanComplete(plan) + assertThat(result).isTrue() + } + + @Test + fun `isPlanComplete returns false when plan has no progress update with name '1'`() { + val plan = TransformationPlan.builder() + .transformationSteps(listOf( + TransformationStep.builder() + .progressUpdates(listOf( + TransformationProgressUpdate.builder() + .name("2") + .build() + )) + .build() + )) + .build() + val result = isPlanComplete(plan) + assertThat(result).isFalse() + } + @Test fun `getClientInstructionArtifactId extracts artifact ID from transformation plan`() { val step1 = TransformationStep.builder() From c305d7ab72a15c54bf204f6ccf5fd97392248d55 Mon Sep 17 00:00:00 2001 From: David Hasani Date: Mon, 19 May 2025 20:48:04 -0700 Subject: [PATCH 6/7] check transform type --- .../jetbrains/services/codemodernizer/CodeModernizerSession.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt index b95cadf83b3..014c51b5474 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codemodernizer/CodeModernizerSession.kt @@ -479,7 +479,7 @@ class CodeModernizerSession( } } - if (!isTransformationPlanEditorOpened) { + if (!isTransformationPlanEditorOpened && transformType == CodeTransformType.LANGUAGE_UPGRADE) { val isPlanComplete = isPlanComplete(state.transformationPlan) if (isPlanComplete) { tryOpenTransformationPlanEditor() From ad2ce8066252cbcf9c61f7723c6ee4c8a9de494f Mon Sep 17 00:00:00 2001 From: David Hasani Date: Tue, 20 May 2025 09:19:33 -0700 Subject: [PATCH 7/7] fix detekt --- .../CodeWhispererCodeModernizerUtilsTest.kt | 44 +++++++++++-------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt index bf671c84eaf..a257245a23c 100644 --- a/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt +++ b/plugins/amazonq/codetransform/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codemodernizer/CodeWhispererCodeModernizerUtilsTest.kt @@ -257,15 +257,19 @@ class CodeWhispererCodeModernizerUtilsTest : CodeWhispererCodeModernizerTestBase fun `isPlanComplete returns true when plan has progress update with name '1'`() { // Arrange val plan = TransformationPlan.builder() - .transformationSteps(listOf( - TransformationStep.builder() - .progressUpdates(listOf( - TransformationProgressUpdate.builder() - .name("1") - .build() - )) - .build() - )) + .transformationSteps( + listOf( + TransformationStep.builder() + .progressUpdates( + listOf( + TransformationProgressUpdate.builder() + .name("1") + .build() + ) + ) + .build() + ) + ) .build() val result = isPlanComplete(plan) assertThat(result).isTrue() @@ -274,15 +278,19 @@ class CodeWhispererCodeModernizerUtilsTest : CodeWhispererCodeModernizerTestBase @Test fun `isPlanComplete returns false when plan has no progress update with name '1'`() { val plan = TransformationPlan.builder() - .transformationSteps(listOf( - TransformationStep.builder() - .progressUpdates(listOf( - TransformationProgressUpdate.builder() - .name("2") - .build() - )) - .build() - )) + .transformationSteps( + listOf( + TransformationStep.builder() + .progressUpdates( + listOf( + TransformationProgressUpdate.builder() + .name("2") + .build() + ) + ) + .build() + ) + ) .build() val result = isPlanComplete(plan) assertThat(result).isFalse()