Skip to content

Commit f5971b8

Browse files
authored
AmazonQ: Fix for incorrect code selection range values (#4127)
Problem: Intermittent 5xx errors are being returned from the backend due to invalid request payloads when customers have selected code on the first line of the file. Solution: The root cause was identified as incorrect payload formatting that occurred under specific conditions. The payload generation logic has been updated to properly handle these edge cases, and additional unit tests have been written to validate the payload structure in these scenarios
1 parent 71a2434 commit f5971b8

File tree

2 files changed

+378
-30
lines changed

2 files changed

+378
-30
lines changed

src/codewhispererChat/editor/context/focusArea/focusAreaExtractor.ts

Lines changed: 66 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,11 @@ export class FocusAreaContextExtractor {
4646

4747
importantRange = this.trimRangeAccordingToLimits(editor.document, importantRange)
4848
const codeBlock = this.getRangeText(editor.document, importantRange)
49-
const extendedCodeBlockRange = this.getExtendedCodeBlockRange(editor.document, importantRange)
49+
const extendedCodeBlockRange = this.getExtendedCodeBlockRange(
50+
editor.document,
51+
importantRange,
52+
focusAreaCharLimit
53+
)
5054

5155
return {
5256
extendedCodeBlock: this.getRangeText(editor.document, extendedCodeBlockRange),
@@ -86,45 +90,77 @@ export class FocusAreaContextExtractor {
8690
)
8791
}
8892

89-
private getExtendedCodeBlockRange(document: TextDocument, importantRange: Range): Range {
93+
// Function to extend the code block range
94+
private getExtendedCodeBlockRange(
95+
document: TextDocument,
96+
importantRange: Range,
97+
focusAreaCharLimit: number
98+
): Range {
99+
// Flag to add line before or after
90100
let addLineBefore = true
101+
// Loop while range can still be extended
91102
while (
92-
this.getRangeText(document, importantRange).length < focusAreaCharLimit &&
93-
(importantRange.start.line !== 0 || importantRange.end.line !== document.lineCount - 1)
103+
!(importantRange.start.line === 0 && importantRange.start.character === 0) ||
104+
!(
105+
importantRange.end.line === document.lineCount - 1 &&
106+
importantRange.end.character === document.lineAt(document.lineCount - 1).range.end.character
107+
)
94108
) {
95-
if (addLineBefore && importantRange.start.line !== 0) {
96-
const tmpRange = new Range(
97-
importantRange.start.line - 1,
98-
0,
99-
importantRange.end.line,
100-
importantRange.end.character
101-
)
102-
addLineBefore = false
109+
let tmpRange: Range | undefined = undefined
110+
if (addLineBefore) {
111+
// Check if we have characters left in the beginning of the current line
112+
if (importantRange.start.character !== 0) {
113+
tmpRange = new Range(
114+
importantRange.start.line,
115+
0,
116+
importantRange.end.line,
117+
importantRange.end.character
118+
)
119+
} else if (importantRange.start.line !== 0) {
120+
tmpRange = new Range(
121+
importantRange.start.line - 1,
122+
document.lineAt(importantRange.start.line - 1).range.end.character,
123+
importantRange.end.line,
124+
importantRange.end.character
125+
)
126+
}
103127

104-
if (this.getRangeText(document, tmpRange).length >= focusAreaCharLimit) {
105-
break
128+
// Flip flag for next iteration
129+
addLineBefore = false
130+
} else {
131+
// Check if we have characters left in the end of the current line
132+
if (importantRange.end.character !== document.lineAt(importantRange.end.line).range.end.character) {
133+
tmpRange = new Range(
134+
importantRange.start.line,
135+
importantRange.start.character,
136+
importantRange.end.line,
137+
document.lineAt(importantRange.end.line).range.end.character
138+
)
139+
} else if (importantRange.end.line !== document.lineCount - 1) {
140+
tmpRange = new Range(
141+
importantRange.start.line,
142+
importantRange.start.character,
143+
importantRange.end.line + 1,
144+
0
145+
)
106146
}
107147

108-
importantRange = tmpRange
109-
continue
148+
// Flip flag for next iteration
149+
addLineBefore = true
110150
}
111151

112-
if (importantRange.end.line !== document.lineCount - 1) {
113-
const tmpRange = new Range(
114-
importantRange.start.line,
115-
importantRange.start.character,
116-
importantRange.end.line + 1,
117-
document.lineAt(importantRange.end.line + 1).range.end.character
118-
)
119-
120-
if (this.getRangeText(document, tmpRange).length >= focusAreaCharLimit) {
121-
break
122-
}
123-
124-
importantRange = tmpRange
152+
// Check if tmp range was set
153+
if (tmpRange === undefined) {
154+
continue
155+
}
156+
// Check character length of tmp range
157+
if (this.getRangeText(document, tmpRange).length >= focusAreaCharLimit) {
158+
// Break loop if too long
159+
break
125160
}
126161

127-
addLineBefore = true
162+
// Update important range
163+
importantRange = tmpRange
128164
}
129165

130166
return importantRange

0 commit comments

Comments
 (0)