public static List getSegmentsFromSuggestion()

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;
    }