void (@NotNull Project project, @NotNull Editor editor, @NotNull FileType fileType, @NotNull PsiFile file, char lparenChar) { int offset = editor.getCaretModel().getOffset(); HighlighterIterator iterator = editor.getHighlighter().createIterator(offset); boolean atEndOfDocument = offset == editor.getDocument().getTextLength(); if (!atEndOfDocument) iterator.retreat(); if (iterator.atEnd()) return; BraceMatcher braceMatcher = BraceMatchingUtil.getBraceMatcher(fileType, iterator); if (iterator.atEnd()) return; IElementType braceTokenType = iterator.getTokenType(); final CharSequence fileText = editor.getDocument().getCharsSequence(); if (!braceMatcher.isLBraceToken(iterator, fileText, fileType)) return; if (!iterator.atEnd()) { iterator.advance(); if (!iterator.atEnd() && !BraceMatchingUtil.isPairedBracesAllowedBeforeTypeInFileType(braceTokenType, iterator.getTokenType(), fileType)) { return; } iterator.retreat(); } int lparenOffset = BraceMatchingUtil.findLeftmostLParen(iterator, braceTokenType, fileText,fileType); if (lparenOffset < 0) lparenOffset = 0; iterator = editor.getHighlighter().createIterator(lparenOffset); boolean matched = BraceMatchingUtil.matchBrace(fileText, fileType, iterator, true, true); if (!matched) { String text = switch (lparenChar) { case '(' -> ")"; case '[' -> "]"; case '<' -> ">"; case '{' -> "}"; default -> throw new AssertionError("Unknown char '" + lparenChar + '\''); }; if (callDelegates(TypedHandlerDelegate::beforeClosingParenInserted, text.charAt(0), project, editor, file)) { return; } editor.getDocument().insertString(offset, text); TabOutScopesTracker.getInstance().registerEmptyScope(editor, offset); } }