public void onNewSuggestion()

in plugin/src/software/aws/toolkits/eclipse/amazonq/util/QInlineInputListener.java [61:136]


    public void onNewSuggestion() {
        QInvocationSession session = QInvocationSession.getInstance();
        // We want to modify the document prior to attaching document listener
        // For that reason, we should move this document listener to onNewSuggestion.
        // - Check to see if the right context exists.
        // - If it does, check to see if the suggestion spans more than 1 line.
        // - If it does, save the right context on the same line.
        // - Add in a segment to render the strike through right context.
        // - Delete the right context (excluding the new line).
        ITextViewer viewer = session.getViewer();
        IDocument doc = viewer.getDocument();
        doc.removeDocumentListener(this);
        int invocationOffset = session.getInvocationOffset();
        int curLineInDoc = widget.getLineAtOffset(invocationOffset);
        int lineIdx = invocationOffset - widget.getOffsetAtLine(curLineInDoc);
        String contentInLine = widget.getLine(curLineInDoc);
        String delimiter = widget.getLineDelimiter();
        if (!rightCtxBuf.isEmpty() && normalSegmentCount > 1) {
            try {
                int adjustedOffset = QEclipseEditorUtils.getOffsetInFullyExpandedDocument(session.getViewer(),
                        session.getInvocationOffset());
                doc.replace(adjustedOffset, 0, rightCtxBuf.split(widget.getLineDelimiter(), 2)[0]);
            } catch (BadLocationException e) {
                Activator.getLogger().error(e.toString());
            }
        }
        if (!suggestionSegments.isEmpty()) {
            suggestionSegments.clear();
        }
        numSuggestionLines = session.getCurrentSuggestion().getInsertText().split("\\R").length;
        List<IQInlineSuggestionSegment> segments = IQInlineSuggestionSegmentFactory.getSegmentsFromSuggestion(session);
        brackets = new IQInlineBracket[session.getCurrentSuggestion().getInsertText().length()];
        if (lineIdx < contentInLine.length()) {
            rightCtxBuf = contentInLine.substring(lineIdx);
        }
        int normalSegmentNum = 0;
        for (var segment : segments) {
            if (segment instanceof IQInlineBracket) {
                int offset = ((IQInlineBracket) segment).getRelevantOffset();
                int idxInSuggestion = offset - invocationOffset;
                if (((IQInlineBracket) segment).getSymbol() == '{'
                        && typeaheadProcessor.isCurlyBracesAutoCloseDelayed()) {
                    int firstNewLineAfter = session.getCurrentSuggestion().getInsertText().indexOf('\n',
                            idxInSuggestion);
                    if (firstNewLineAfter != -1) {
                        brackets[firstNewLineAfter] = (IQInlineBracket) segment;
                    }
                } else {
                    brackets[idxInSuggestion] = (IQInlineBracket) segment;
                }
                // We only add close brackets to be rendered separately
                if (segment instanceof QInlineSuggestionCloseBracketSegment) {
                    suggestionSegments.add(segment);
                }
            } else {
                suggestionSegments.add(segment);
                normalSegmentNum++;
            }
        }
        if (normalSegmentNum > 1 && !rightCtxBuf.isEmpty()) {
            QInlineSuggestionRightContextSegment rightCtxSegment = IQInlineSuggestionSegmentFactory
                    .getRightCtxSegment(rightCtxBuf, session.getCurrentSuggestion().getInsertText().split("\\R", 2)[0]);
            suggestionSegments.add(rightCtxSegment);
            try {
                int expandedOffset = QEclipseEditorUtils.getOffsetInFullyExpandedDocument(viewer, invocationOffset);
                // We want to leave the '\n' on the current line
                int rightCtxEffectiveLength = rightCtxBuf.endsWith("\n") ? rightCtxBuf.length() - 1
                        : rightCtxBuf.length();
                doc.replace(expandedOffset, rightCtxEffectiveLength, "");
            } catch (BadLocationException e) {
                Activator.getLogger().error("Error striking out document right context" + e.toString());
            }
        }
        normalSegmentCount = normalSegmentNum;
        doc.addDocumentListener(this);
    }