int (@NotNull SemanticEditorPosition position, boolean ignoreLabels, boolean useParentControlStructures) { Language currLanguage = position.getLanguage(); while (!position.isAtEnd()) { if (currLanguage == Language.ANY || currLanguage == null) currLanguage = position.getLanguage(); if (!ignoreLabels && isColonAfterLabelOrCase(position)) { SemanticEditorPosition afterColon = getPosition(position.getEditor(), position.getStartOffset()) .afterOptionalMix(Whitespace, BlockComment) .after() .afterOptionalMix(Whitespace, LineComment); return afterColon.getStartOffset(); } else if (position.isAt(RightParenthesis)) { position.moveBeforeParentheses(LeftParenthesis, RightParenthesis); continue; } else if (position.isAt(BlockClosingBrace)) { position.moveBeforeParentheses(BlockOpeningBrace, BlockClosingBrace); continue; } else if (position.isAt(ArrayClosingBracket)) { position.moveBeforeParentheses(ArrayOpeningBracket, ArrayClosingBracket); continue; } else if (isStartOfStatementWithOptionalBlock(position)) { return useParentControlStructures ? getFirstUppermostControlStructureKeywordOffset(position) : position.getStartOffset(); } else if (position.isAtAnyOf(Semicolon, BlockOpeningBrace, BlockComment, DocBlockEnd, LeftParenthesis, LanguageStartDelimiter) || (position.getLanguage() != Language.ANY) && !position.isAtLanguage(currLanguage)) { SemanticEditorPosition statementStart = position.copy(); statementStart = statementStart.after().afterOptionalMix(Whitespace, LineComment); if (!isIndentProvider(statementStart, ignoreLabels)) { final SemanticEditorPosition maybeColon = statementStart.afterOptionalMix(Whitespace, BlockComment).after(); final SemanticEditorPosition afterColonStatement = maybeColon.after().after(); if (atColonWithNewLineAfterColonStatement(maybeColon, afterColonStatement)) { return afterColonStatement.getStartOffset(); } if (atBlockStartAndNeedBlockIndent(position)) { return position.getStartOffset(); } } else if (!statementStart.isAtEnd()) { return statementStart.getStartOffset(); } } position.moveBefore(); } return 0; }