Skip to content

Commit 77d0133

Browse files
committed
Merge branch 'main' of https://github.com/mattmcdonald39/aws-toolkit-jetbrains into reopen-diff
2 parents 4d0b248 + ecc73fe commit 77d0133

File tree

16 files changed

+225
-21
lines changed

16 files changed

+225
-21
lines changed

.changes/3.49.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"date" : "2025-01-17",
3+
"version" : "3.49",
4+
"entries" : [ {
5+
"type" : "bugfix",
6+
"description" : "/review: Improved success rate of code reviews for certain workspace configurations"
7+
} ]
8+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "Amazon Q /test: Fix for test generation payload creation to not filter out target file."
4+
}

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# _3.49_ (2025-01-17)
2+
- **(Bug Fix)** /review: Improved success rate of code reviews for certain workspace configurations
3+
14
# _3.48_ (2025-01-16)
25
- **(Feature)** Enhance Q inline completion context fetching for better suggestion quality
36
- **(Feature)** /doc: Add error message if updated README is too large

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# SPDX-License-Identifier: Apache-2.0
33

44
# Toolkit Version
5-
toolkitVersion=3.49-SNAPSHOT
5+
toolkitVersion=3.50-SNAPSHOT
66

77
# Publish Settings
88
publishToken=

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonqCodeTest/controller/CodeTestChatController.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ class CodeTestChatController(
277277

278278
val requestData = ChatRequestData(
279279
tabId = session.tabId,
280-
message = "Generate unit tests for the following part of my code: ${message.prompt}",
280+
message = "Generate unit tests for the following part of my code: ${message.prompt.ifBlank { fileInfo.fileName }}",
281281
activeFileContext = activeFileContext,
282282
userIntent = UserIntent.GENERATE_UNIT_TESTS,
283283
triggerType = TriggerType.ContextMenu,

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/editor/context/focusArea/FocusAreaContextExtractor.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ class FocusAreaContextExtractor(private val fqnWebviewAdapter: FqnWebviewAdapter
180180
val startOffset = 0.coerceAtLeast(offset - halfMaxCharacters)
181181
val endOffset = fileText.length.coerceAtMost(offset + halfMaxCharacters)
182182

183-
// Adjust the start and end offsets if necessary to ensure a total of 40k characters
183+
// Adjust the start and end offsets if necessary to ensure a total of 10k characters
184184
val excessCharacters = maxCharacters - (endOffset - startOffset)
185185
val adjustedStartOffset = 0.coerceAtLeast(startOffset - excessCharacters)
186186
val adjustedEndOffset = fileText.length.coerceAtMost(endOffset + excessCharacters)
@@ -198,7 +198,7 @@ class FocusAreaContextExtractor(private val fqnWebviewAdapter: FqnWebviewAdapter
198198
}
199199

200200
companion object {
201-
const val MAX_LENGTH = 40000
201+
const val MAX_LENGTH = 10000
202202
}
203203
}
204204

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class FeatureDevSessionContextTest : FeatureDevTestBase(HeavyJavaCodeInsightTest
7575
@Test
7676
fun testZipProject() {
7777
addFilesToProjectModule(
78+
".gitignore",
7879
".gradle/cached.jar",
7980
"src/MyClass.java",
8081
"gradlew",
@@ -83,6 +84,19 @@ class FeatureDevSessionContextTest : FeatureDevTestBase(HeavyJavaCodeInsightTest
8384
"settings.gradle",
8485
"build.gradle",
8586
"gradle/wrapper/gradle-wrapper.properties",
87+
"builder/GetTestBuilder.java", // check for false positives
88+
".aws-sam/build/function1",
89+
".gem/specs.rb",
90+
"archive.zip",
91+
"output.bin",
92+
"images/logo.png",
93+
"assets/header.jpg",
94+
"icons/menu.svg",
95+
"license.txt",
96+
"License.md",
97+
"node_modules/express",
98+
"build/outputs",
99+
"dist/bundle.js"
86100
)
87101

88102
val zipResult = featureDevSessionContext.getProjectZip()
@@ -102,9 +116,10 @@ class FeatureDevSessionContextTest : FeatureDevTestBase(HeavyJavaCodeInsightTest
102116
"gradlew",
103117
"gradlew.bat",
104118
"README.md",
119+
"gradle/wrapper/gradle-wrapper.properties",
120+
"builder/GetTestBuilder.java",
105121
"settings.gradle",
106122
"build.gradle",
107-
"gradle/wrapper/gradle-wrapper.properties",
108123
)
109124

110125
assertTrue(zippedFiles == expectedFiles)

plugins/amazonq/chat/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonqFeatureDev/controller/FeatureDevControllerTest.kt

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,121 @@ class FeatureDevControllerTest : FeatureDevTestBase() {
433433
}
434434
}
435435

436+
@Test
437+
fun `test handleChat onCodeGeneration sends correct add code messages`() = runTest {
438+
val totalIterations = 10
439+
440+
for (remainingIterations in 0 until totalIterations) {
441+
val message = if (remainingIterations > 2) {
442+
message("amazonqFeatureDev.code_generation.iteration_counts_ask_to_add_code_or_feedback")
443+
} else if (remainingIterations > 0) {
444+
message(
445+
"amazonqFeatureDev.code_generation.iteration_counts",
446+
remainingIterations,
447+
totalIterations,
448+
)
449+
} else {
450+
message(
451+
"amazonqFeatureDev.code_generation.iteration_counts_ask_to_add_code",
452+
remainingIterations,
453+
totalIterations,
454+
)
455+
}
456+
val mockSession = mock<Session>()
457+
val featureDevService = mockk<FeatureDevService>()
458+
val repoContext = mock<FeatureDevSessionContext>()
459+
val sessionStateConfig = SessionStateConfig(testConversationId, repoContext, featureDevService)
460+
val mockInteraction = mock<Interaction>()
461+
whenever(mockSession.send(userMessage)).thenReturn(mockInteraction)
462+
whenever(mockSession.sessionState).thenReturn(
463+
PrepareCodeGenerationState(
464+
testTabId,
465+
CancellationTokenSource(),
466+
"test-command",
467+
sessionStateConfig,
468+
newFileContents,
469+
deletedFiles,
470+
testReferences,
471+
testUploadId,
472+
1,
473+
messenger,
474+
remainingIterations,
475+
totalIterations,
476+
diffMetricsProcessed = DiffMetricsProcessed(HashSet(), HashSet()),
477+
),
478+
)
479+
480+
controller.onCodeGeneration(mockSession, userMessage, testTabId)
481+
482+
coVerify {
483+
messenger.sendAnswer(
484+
tabId = testTabId,
485+
messageType = FeatureDevMessageType.Answer,
486+
message = message
487+
)
488+
}
489+
}
490+
}
491+
492+
@Test
493+
fun `test handleChat onCodeGeneration sends correct messages after cancellation`() = runTest {
494+
val totalIterations = 10
495+
496+
for (remainingIterations in -1 until totalIterations) {
497+
// remainingIterations < 0 is to represent the null case
498+
val message = if (remainingIterations > 2 || remainingIterations < 0) {
499+
message("amazonqFeatureDev.code_generation.stopped_code_generation_no_iteration_count_display")
500+
} else if (remainingIterations > 0) {
501+
message(
502+
"amazonqFeatureDev.code_generation.stopped_code_generation",
503+
remainingIterations,
504+
totalIterations,
505+
)
506+
} else {
507+
message(
508+
"amazonqFeatureDev.code_generation.stopped_code_generation_no_iterations",
509+
remainingIterations,
510+
totalIterations,
511+
)
512+
}
513+
val mockSession = mock<Session>()
514+
val featureDevService = mockk<FeatureDevService>()
515+
val repoContext = mock<FeatureDevSessionContext>()
516+
val sessionStateConfig = SessionStateConfig(testConversationId, repoContext, featureDevService)
517+
val mockInteraction = mock<Interaction>()
518+
val token = CancellationTokenSource()
519+
token.cancel()
520+
whenever(mockSession.send(userMessage)).thenReturn(mockInteraction)
521+
whenever(mockSession.sessionState).thenReturn(
522+
PrepareCodeGenerationState(
523+
testTabId,
524+
token,
525+
"test-command",
526+
sessionStateConfig,
527+
newFileContents,
528+
deletedFiles,
529+
testReferences,
530+
testUploadId,
531+
1,
532+
messenger,
533+
(if (remainingIterations < 0) null else remainingIterations),
534+
totalIterations,
535+
diffMetricsProcessed = DiffMetricsProcessed(HashSet(), HashSet()),
536+
),
537+
)
538+
539+
controller.onCodeGeneration(mockSession, userMessage, testTabId)
540+
541+
coVerify {
542+
messenger.sendAnswer(
543+
tabId = testTabId,
544+
messageType = FeatureDevMessageType.Answer,
545+
message = message
546+
)
547+
}
548+
}
549+
}
550+
436551
@Test
437552
fun `test handleChat onCodeGeneration sends success metrics`() = runTest {
438553
val mockSession = mock<Session>()

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,8 @@ class CodeTransformChatController(
686686
is CodeModernizerJobCompletedResult.Stopped, CodeModernizerJobCompletedResult.JobAbortedBeforeStarting -> handleCodeTransformStoppedByUser()
687687
is CodeModernizerJobCompletedResult.JobFailed -> handleCodeTransformJobFailed(result.failureReason)
688688
is CodeModernizerJobCompletedResult.JobFailedInitialBuild -> handleCodeTransformJobFailedPreBuild(result)
689+
is CodeModernizerJobCompletedResult.RetryableFailure -> handleCodeTransformJobFailed(result.failureReason)
690+
is CodeModernizerJobCompletedResult.UnableToCreateJob -> handleCodeTransformJobFailed(result.failureReason)
689691
else -> {
690692
if (result is CodeModernizerJobCompletedResult.ZipUploadFailed && result.failureReason is UploadFailureReason.CREDENTIALS_EXPIRED) {
691693
return

plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/sessionconfig/CodeScanSessionConfig.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhisperer
3636
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.CodeAnalysisScope
3737
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.DEFAULT_CODE_SCAN_TIMEOUT_IN_SECONDS
3838
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.DEFAULT_PAYLOAD_LIMIT_IN_BYTES
39+
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.EXPRESS_SCAN_TIMEOUT_IN_SECONDS
3940
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.FILE_SCAN_PAYLOAD_SIZE_LIMIT_IN_BYTES
40-
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.FILE_SCAN_TIMEOUT_IN_SECONDS
41+
import software.aws.toolkits.jetbrains.services.codewhisperer.util.isWithin
4142
import software.aws.toolkits.resources.message
4243
import software.aws.toolkits.telemetry.CodewhispererLanguage
4344
import java.io.File
@@ -67,9 +68,11 @@ class CodeScanSessionConfig(
6768
/**
6869
* Timeout for the overall job - "Run Security Scan".
6970
*/
70-
fun overallJobTimeoutInSeconds(): Long = when (scope) {
71-
CodeAnalysisScope.FILE -> FILE_SCAN_TIMEOUT_IN_SECONDS
72-
else -> DEFAULT_CODE_SCAN_TIMEOUT_IN_SECONDS
71+
fun overallJobTimeoutInSeconds(): Long {
72+
if (scope == CodeAnalysisScope.FILE && !initiatedByChat) {
73+
return EXPRESS_SCAN_TIMEOUT_IN_SECONDS
74+
}
75+
return DEFAULT_CODE_SCAN_TIMEOUT_IN_SECONDS
7376
}
7477

7578
fun getPayloadLimitInBytes(): Long = when (scope) {
@@ -106,7 +109,7 @@ class CodeScanSessionConfig(
106109
null -> getProjectPayloadMetadata()
107110
else -> when (scope) {
108111
CodeAnalysisScope.PROJECT -> getProjectPayloadMetadata()
109-
CodeAnalysisScope.FILE -> if (selectedFile.path.startsWith(projectRoot.path)) {
112+
CodeAnalysisScope.FILE -> if (selectedFile.isWithin(projectRoot)) {
110113
getFilePayloadMetadata(selectedFile, true)
111114
} else {
112115
projectRoot = selectedFile.parent

0 commit comments

Comments
 (0)