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