void (@NotNull InsertionContext context, @NotNull LookupElement item) { Project project = context.getProject(); Editor editor = context.getEditor(); int startOffset = context.getStartOffset(); Document document = InjectedLanguageUtil.getTopLevelEditor(editor).getDocument(); Ref<PsiElement> currentElementRef = Ref.create(); // Need to insert " " to prevent creating tags like <tagThis is my text XmlTagNameSynchronizer.runWithoutCancellingSyncTagsEditing(document, () -> { final int offset = editor.getCaretModel().getOffset(); editor.getDocument().insertString(offset, " "); PsiDocumentManager.getInstance(project).commitDocument(editor.getDocument()); currentElementRef.set(context.getFile().findElementAt(startOffset)); editor.getDocument().deleteString(offset, offset + 1); }); final XmlTag tag = PsiTreeUtil.getContextOfType(currentElementRef.get(), XmlTag.class, true); if (tag == null) return; if (context.getCompletionChar() != Lookup.COMPLETE_STATEMENT_SELECT_CHAR) { context.setAddCompletionChar(false); } if (XmlUtil.getTokenOfType(tag, XmlTokenType.XML_TAG_END) == null && XmlUtil.getTokenOfType(tag, XmlTokenType.XML_EMPTY_ELEMENT_END) == null) { insertIncompleteTag(context.getCompletionChar(), editor, tag); } else if (context.getCompletionChar() == Lookup.REPLACE_SELECT_CHAR) { PsiDocumentManager.getInstance(project).commitAllDocuments(); int caretOffset = editor.getCaretModel().getOffset(); XmlTag otherTag = PsiTreeUtil.getParentOfType(context.getFile().findElementAt(caretOffset), XmlTag.class); PsiElement endTagStart = XmlUtil.getTokenOfType(otherTag, XmlTokenType.XML_END_TAG_START); if (endTagStart != null) { PsiElement sibling = endTagStart.getNextSibling(); assert sibling != null; ASTNode node = sibling.getNode(); assert node != null; if (node.getElementType() == XmlTokenType.XML_NAME) { int sOffset = sibling.getTextRange().getStartOffset(); int eOffset = sibling.getTextRange().getEndOffset(); editor.getDocument().deleteString(sOffset, eOffset); editor.getDocument().insertString(sOffset, otherTag.getName()); } } editor.getCaretModel().moveToOffset(caretOffset + 1); editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); editor.getSelectionModel().removeSelection(); } if (context.getCompletionChar() == ' ' && TemplateManager.getInstance(project).getActiveTemplate(editor) != null) { return; } final TailType tailType = LookupItem.handleCompletionChar(editor, item, context.getCompletionChar()); tailType.processTail(editor, editor.getCaretModel().getOffset()); }