boolean (@NotNull Editor editor, @NotNull FileType fileType, char charTyped) { if (!CodeInsightSettings.getInstance().AUTOINSERT_PAIR_BRACKET) return false; int offset = editor.getCaretModel().getOffset(); if (offset == editor.getDocument().getTextLength()) return false; HighlighterIterator iterator = editor.getHighlighter().createIterator(offset); if (iterator.atEnd()) return false; if (iterator.getEnd() - iterator.getStart() != 1 || editor.getDocument().getCharsSequence().charAt(iterator.getStart()) != charTyped) { return false; } BraceMatcher braceMatcher = BraceMatchingUtil.getBraceMatcher(fileType, iterator); CharSequence text = editor.getDocument().getCharsSequence(); if (!braceMatcher.isRBraceToken(iterator, text, fileType)) { return false; } IElementType tokenType = iterator.getTokenType(); iterator.retreat(); IElementType lparenTokenType = braceMatcher.getOppositeBraceTokenType(tokenType); int lparenthOffset = BraceMatchingUtil.findLeftmostLParen(iterator, lparenTokenType, text, fileType); if (lparenthOffset < 0) { if (braceMatcher instanceof NontrivialBraceMatcher) { for(IElementType t:((NontrivialBraceMatcher)braceMatcher).getOppositeBraceTokenTypes(tokenType)) { if (t == lparenTokenType) continue; lparenthOffset = BraceMatchingUtil.findLeftmostLParen( iterator, t, text, fileType ); if (lparenthOffset >= 0) break; } } if (lparenthOffset < 0) return false; } iterator = editor.getHighlighter().createIterator(lparenthOffset); boolean matched = BraceMatchingUtil.matchBrace(text, fileType, iterator, true, true); if (!matched) return false; EditorModificationUtil.moveCaretRelatively(editor, 1); return true; }