in plugin/src/software/aws/toolkits/eclipse/amazonq/util/IQInlineSuggestionSegmentFactory.java [19:77]
public static List<IQInlineSuggestionSegment> getSegmentsFromSuggestion(final QInvocationSession qSes) {
var suggestion = qSes.getCurrentSuggestion().getInsertText();
var suggestionLines = suggestion.split("\\R");
var res = new ArrayList<IQInlineSuggestionSegment>();
var widget = qSes.getViewer().getTextWidget();
int currentOffset = qSes.getInvocationOffset();
int distanceTraversed = 0;
Stack<QInlineSuggestionOpenBracketSegment> unresolvedBrackets = new Stack<>();
for (int i = 0; i < suggestionLines.length; i++) {
int startOffset;
int endOffset;
String currentLine = suggestionLines[i];
StringBuilder sb;
startOffset = currentOffset + distanceTraversed; // this line might not exist yet so we need to think of
// something more robust
sb = new StringBuilder(currentLine);
String currentIndent;
if (i == 0) {
int currentLineInDoc = widget.getLineAtOffset(currentOffset);
String content = widget.getLine(currentLineInDoc);
int leadingWhitespacePosition = !content.isEmpty() ? idxOfFirstNonwhiteSpace(content) : 0;
currentIndent = content.substring(0, leadingWhitespacePosition);
} else {
int leadingWhitespacePosition = idxOfFirstNonwhiteSpace(currentLine);
currentIndent = currentLine.substring(0, leadingWhitespacePosition);
}
for (int j = 0; j < currentLine.length(); j++) {
char c = currentLine.charAt(j);
switch (getBracketType(unresolvedBrackets, suggestion, distanceTraversed + j)) {
case OPEN:
var openBracket = new QInlineSuggestionOpenBracketSegment(startOffset + j, currentIndent, c);
unresolvedBrackets.push(openBracket);
break;
case CLOSE:
if (!unresolvedBrackets.isEmpty()) {
var closeBracket = new QInlineSuggestionCloseBracketSegment(startOffset + j, i,
currentLine.substring(0, j), c, qSes.isMacOS());
var top = unresolvedBrackets.pop();
if (top.isAMatch(closeBracket)) {
top.pairUp(closeBracket);
sb.setCharAt(j, ' ');
res.add(closeBracket);
res.add(top);
}
}
break;
case NONE:
default:
continue;
}
}
distanceTraversed += sb.length() + 1; // plus one because we got rid of a \\R when we split it
endOffset = startOffset + sb.length() - 1;
res.add(new QInlineSuggestionNormalSegment(startOffset, endOffset, i, sb.toString(), qSes.isMacOS()));
}
return res;
}