diff --git a/clang/lib/Format/UnwrappedLineParser.h b/clang/lib/Format/UnwrappedLineParser.h --- a/clang/lib/Format/UnwrappedLineParser.h +++ b/clang/lib/Format/UnwrappedLineParser.h @@ -125,6 +125,8 @@ bool handleCppAttributes(); FormatToken *parseIfThenElse(IfStmtKind *IfKind, bool KeepBraces = false); void parseTryCatch(); + void parseIndentedBlock(bool BracesAreOptional = true, + bool RBraceOnSeparateLine = true); void parseForOrWhileLoop(); void parseDoWhile(); void parseLabel(bool LeftAlignLabel = false); diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -2713,6 +2713,30 @@ } while (!eof()); } +void UnwrappedLineParser::parseIndentedBlock(bool BracesAreOptional, + bool RBraceOnSeparateLine) { + CompoundStatementIndenter Indenter(this, Style, Line->Level); + + keepAncestorBraces(); + + if (FormatTok->is(tok::l_brace)) { + FormatToken *LeftBrace = FormatTok; + parseBlock(); + if (BracesAreOptional && Style.RemoveBracesLLVM) { + assert(!NestedTooDeep.empty()); + if (!NestedTooDeep.back()) + markOptionalBraces(LeftBrace); + } + if (RBraceOnSeparateLine) + addUnwrappedLine(); + } else { + parseUnbracedBody(); + } + + if (Style.RemoveBracesLLVM) + NestedTooDeep.pop_back(); +} + void UnwrappedLineParser::parseForOrWhileLoop() { assert(FormatTok->isOneOf(tok::kw_for, tok::kw_while, TT_ForEachMacro) && "'for', 'while' or foreach macro expected"); @@ -2731,43 +2755,15 @@ parseParens(); } - keepAncestorBraces(); - - if (FormatTok->is(tok::l_brace)) { - FormatToken *LeftBrace = FormatTok; - CompoundStatementIndenter Indenter(this, Style, Line->Level); - parseBlock(); - if (Style.RemoveBracesLLVM) { - assert(!NestedTooDeep.empty()); - if (!NestedTooDeep.back()) - markOptionalBraces(LeftBrace); - } - addUnwrappedLine(); - } else { - parseUnbracedBody(); - } - - if (Style.RemoveBracesLLVM) - NestedTooDeep.pop_back(); + parseIndentedBlock(/*BracesAreOptional=*/true); } void UnwrappedLineParser::parseDoWhile() { assert(FormatTok->is(tok::kw_do) && "'do' expected"); nextToken(); - keepAncestorBraces(); - - if (FormatTok->is(tok::l_brace)) { - CompoundStatementIndenter Indenter(this, Style, Line->Level); - parseBlock(); - if (Style.BraceWrapping.BeforeWhile) - addUnwrappedLine(); - } else { - parseUnbracedBody(); - } - - if (Style.RemoveBracesLLVM) - NestedTooDeep.pop_back(); + parseIndentedBlock(/*BracesAreoptional=*/false, + /*RBraceOnSeparateLine=*/Style.BraceWrapping.BeforeWhile); // FIXME: Add error handling. if (!FormatTok->is(tok::kw_while)) { @@ -2840,21 +2836,7 @@ parseParens(); } - keepAncestorBraces(); - - if (FormatTok->is(tok::l_brace)) { - CompoundStatementIndenter Indenter(this, Style, Line->Level); - parseBlock(); - addUnwrappedLine(); - } else { - addUnwrappedLine(); - ++Line->Level; - parseStructuralElement(); - --Line->Level; - } - - if (Style.RemoveBracesLLVM) - NestedTooDeep.pop_back(); + parseIndentedBlock(); } // Operators that can follow a C variable.