boolean (@NotNull Project project, @NotNull Editor editor, char quote, @NotNull PsiFile file) { if (!CodeInsightSettings.getInstance().AUTOINSERT_PAIR_QUOTE) return false; final QuoteHandler quoteHandler = getQuoteHandler(file, editor); if (quoteHandler == null) return false; int offset = editor.getCaretModel().getOffset(); final Document document = editor.getDocument(); CharSequence chars = document.getCharsSequence(); int length = document.getTextLength(); if (isTypingEscapeQuote(editor, quoteHandler, offset)) return false; if (offset < length && chars.charAt(offset) == quote){ if (isClosingQuote(editor, quoteHandler, offset)){ EditorModificationUtil.moveCaretRelatively(editor, 1); return true; } } HighlighterIterator iterator = editor.getHighlighter().createIterator(offset); if (!iterator.atEnd()){ IElementType tokenType = iterator.getTokenType(); if (quoteHandler instanceof JavaLikeQuoteHandler) { try { if (!((JavaLikeQuoteHandler)quoteHandler).isAppropriateElementTypeForLiteral(tokenType)) return false; } catch (AbstractMethodError incompatiblePluginErrorThatDoesNotInterestUs) { // ignore } } } type(editor, file.getProject(), quote); offset = editor.getCaretModel().getOffset(); if (quoteHandler instanceof MultiCharQuoteHandler) { CharSequence closingQuote = getClosingQuote(editor, (MultiCharQuoteHandler)quoteHandler, offset); if (closingQuote != null && hasNonClosedLiterals(editor, quoteHandler, offset - 1)) { if (offset == document.getTextLength() || !Character.isUnicodeIdentifierPart(document.getCharsSequence().charAt(offset))) { //any better heuristic or an API? TypedDelegateFunc func = (delegate, c1, p1, e1, f1) -> delegate.beforeClosingQuoteInserted(closingQuote, p1, e1, f1); if (!callDelegates(func, quote, project, editor, file)) { ((MultiCharQuoteHandler)quoteHandler).insertClosingQuote(editor, offset, file, closingQuote); } return true; } } } if (offset > 0 && isOpeningQuote(editor, quoteHandler, offset - 1) && hasNonClosedLiterals(editor, quoteHandler, offset - 1)) { if (offset == document.getTextLength() || !Character.isUnicodeIdentifierPart(document.getCharsSequence().charAt(offset))) { //any better heuristic or an API? String quoteString = String.valueOf(quote); TypedDelegateFunc func = (delegate, c1, p1, e1, f1) -> delegate.beforeClosingQuoteInserted(quoteString, p1, e1, f1); if (!callDelegates(func, quote, project, editor, file)) { document.insertString(offset, quoteString); TabOutScopesTracker.getInstance().registerEmptyScope(editor, offset); } } } return true; }