WatchingInsertionContext (final List<LookupElement> lookupItems, final LookupElement item, final char completionChar, final StatisticsUpdate update, final Editor editor, final PsiFile psiFile, final int caretOffset, final int idEndOffset, final OffsetMap offsetMap) { editor.getCaretModel().moveToOffset(caretOffset); WatchingInsertionContext context = CompletionUtil.createInsertionContext(lookupItems, item, completionChar, editor, psiFile, caretOffset, idEndOffset, offsetMap); int initialStartOffset = Math.max(0, caretOffset - item.getLookupString().length()); ApplicationManager.getApplication().runWriteAction(() -> { try { if (caretOffset < idEndOffset && completionChar == Lookup.REPLACE_SELECT_CHAR) { Document document = editor.getDocument(); if (document.getRangeGuard(caretOffset, idEndOffset) == null) { document.deleteString(caretOffset, idEndOffset); } } assert context.getStartOffset() >= 0 : "stale startOffset: was " + initialStartOffset + "; selEnd=" + caretOffset + "; idEnd=" + idEndOffset + "; file=" + psiFile; assert context.getTailOffset() >= 0 : "stale tail: was " + initialStartOffset + "; selEnd=" + caretOffset + "; idEnd=" + idEndOffset + "; file=" + psiFile; Project project = psiFile.getProject(); if (item.requiresCommittedDocuments()) { PsiDocumentManager.getInstance(project).commitAllDocuments(); } DumbModeAccessType.RELIABLE_DATA_ONLY.ignoreDumbMode(() -> { item.handleInsert(context); }); PostprocessReformattingAspect.getInstance(project).doPostponedFormatting(); } finally { context.stopWatching(); } EditorModificationUtil.scrollToCaret(editor); }); return context; }