int (Editor editor, int offset, FileType fileType) { if (offset == 0) { return -1; } CharSequence chars = editor.getDocument().getCharsSequence(); if (chars.charAt(offset - 1) != '{') { return -1; } EditorHighlighter highlighter = editor.getHighlighter(); HighlighterIterator iterator = highlighter.createIterator(offset - 1); BraceMatcher braceMatcher = BraceMatchingUtil.getBraceMatcher(fileType, iterator); if (!braceMatcher.isLBraceToken(iterator, chars, fileType) || !braceMatcher.isStructuralBrace(iterator, chars, fileType)) { return -1; } Language language = iterator.getTokenType().getLanguage(); iterator = highlighter.createIterator(0); int lBracesBeforeOffset = 0; int rBracesAfterOffset = 0; for (; !iterator.atEnd(); iterator.advance()) { IElementType tokenType = iterator.getTokenType(); if (!tokenType.getLanguage().equals(language) || !braceMatcher.isStructuralBrace(iterator, chars, fileType)) { continue; } boolean beforeOffset = iterator.getStart() < offset; if (braceMatcher.isLBraceToken(iterator, chars, fileType)) { if (beforeOffset) { lBracesBeforeOffset++; } else { rBracesAfterOffset--; } } else if (braceMatcher.isRBraceToken(iterator, chars, fileType)) { if (beforeOffset) { // If there are more right braces then left - code before is invalid but let's not break the code after. if (lBracesBeforeOffset > 0) { lBracesBeforeOffset--; } } else { rBracesAfterOffset++; if (rBracesAfterOffset == lBracesBeforeOffset) { // Do not calculate further. We've completed all scopes before cursor. return 0; } } } } return lBracesBeforeOffset - rBracesAfterOffset; } }