From: Manuel Klimek Date: Fri, 2 Aug 2013 21:31:59 +0000 (+0000) Subject: Implement Allman style. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e490705e6678a2e830cecacbe8142d9b369d8341;p=clang Implement Allman style. Patch by Frank Miller. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@187678 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Format/Format.h b/include/clang/Format/Format.h index 9eb7afba2c..d357d01663 100644 --- a/include/clang/Format/Format.h +++ b/include/clang/Format/Format.h @@ -163,7 +163,9 @@ struct FormatStyle { /// class definitions. BS_Linux, /// Like \c Attach, but break before function definitions. - BS_Stroustrup + BS_Stroustrup, + /// Always break before braces + BS_Allman }; /// \brief The brace breaking style to use. diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 02cbc316c1..140bda2193 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -50,6 +50,7 @@ struct ScalarEnumerationTraits { IO.enumCase(Value, "Attach", clang::format::FormatStyle::BS_Attach); IO.enumCase(Value, "Linux", clang::format::FormatStyle::BS_Linux); IO.enumCase(Value, "Stroustrup", clang::format::FormatStyle::BS_Stroustrup); + IO.enumCase(Value, "Allman", clang::format::FormatStyle::BS_Allman); } }; diff --git a/lib/Format/UnwrappedLineParser.cpp b/lib/Format/UnwrappedLineParser.cpp index 94fbf078dc..c80c297de2 100644 --- a/lib/Format/UnwrappedLineParser.cpp +++ b/lib/Format/UnwrappedLineParser.cpp @@ -594,7 +594,8 @@ void UnwrappedLineParser::parseStructuralElement() { // FIXME: Figure out cases where this is not true, and add projections // for them (the one we know is missing are lambdas). if (Style.BreakBeforeBraces == FormatStyle::BS_Linux || - Style.BreakBeforeBraces == FormatStyle::BS_Stroustrup) + Style.BreakBeforeBraces == FormatStyle::BS_Stroustrup || + Style.BreakBeforeBraces == FormatStyle::BS_Allman) addUnwrappedLine(); parseBlock(/*MustBeDeclaration=*/false); addUnwrappedLine(); @@ -759,8 +760,13 @@ void UnwrappedLineParser::parseIfThenElse() { parseParens(); bool NeedsUnwrappedLine = false; if (FormatTok->Tok.is(tok::l_brace)) { + if (Style.BreakBeforeBraces == FormatStyle::BS_Allman) + addUnwrappedLine(); parseBlock(/*MustBeDeclaration=*/false); - NeedsUnwrappedLine = true; + if (Style.BreakBeforeBraces == FormatStyle::BS_Allman) + addUnwrappedLine(); + else + NeedsUnwrappedLine = true; } else { addUnwrappedLine(); ++Line->Level; @@ -770,6 +776,8 @@ void UnwrappedLineParser::parseIfThenElse() { if (FormatTok->Tok.is(tok::kw_else)) { nextToken(); if (FormatTok->Tok.is(tok::l_brace)) { + if (Style.BreakBeforeBraces == FormatStyle::BS_Allman) + addUnwrappedLine(); parseBlock(/*MustBeDeclaration=*/false); addUnwrappedLine(); } else if (FormatTok->Tok.is(tok::kw_if)) { @@ -791,7 +799,8 @@ void UnwrappedLineParser::parseNamespace() { if (FormatTok->Tok.is(tok::identifier)) nextToken(); if (FormatTok->Tok.is(tok::l_brace)) { - if (Style.BreakBeforeBraces == FormatStyle::BS_Linux) + if (Style.BreakBeforeBraces == FormatStyle::BS_Linux || + Style.BreakBeforeBraces == FormatStyle::BS_Allman) addUnwrappedLine(); bool AddLevel = Style.NamespaceIndentation == FormatStyle::NI_All || @@ -814,6 +823,8 @@ void UnwrappedLineParser::parseForOrWhileLoop() { if (FormatTok->Tok.is(tok::l_paren)) parseParens(); if (FormatTok->Tok.is(tok::l_brace)) { + if (Style.BreakBeforeBraces == FormatStyle::BS_Allman) + addUnwrappedLine(); parseBlock(/*MustBeDeclaration=*/false); addUnwrappedLine(); } else { @@ -828,6 +839,8 @@ void UnwrappedLineParser::parseDoWhile() { assert(FormatTok->Tok.is(tok::kw_do) && "'do' expected"); nextToken(); if (FormatTok->Tok.is(tok::l_brace)) { + if (Style.BreakBeforeBraces == FormatStyle::BS_Allman) + addUnwrappedLine(); parseBlock(/*MustBeDeclaration=*/false); } else { addUnwrappedLine(); @@ -854,9 +867,15 @@ void UnwrappedLineParser::parseLabel() { if (Line->Level > 1 || (!Line->InPPDirective && Line->Level > 0)) --Line->Level; if (CommentsBeforeNextToken.empty() && FormatTok->Tok.is(tok::l_brace)) { + if (Style.BreakBeforeBraces == FormatStyle::BS_Allman) + addUnwrappedLine(); parseBlock(/*MustBeDeclaration=*/false); - if (FormatTok->Tok.is(tok::kw_break)) - parseStructuralElement(); // "break;" after "}" goes on the same line. + if (FormatTok->Tok.is(tok::kw_break)) { + // "break;" after "}" on its own line only for BS_Allman + if (Style.BreakBeforeBraces == FormatStyle::BS_Allman) + addUnwrappedLine(); + parseStructuralElement(); + } } addUnwrappedLine(); Line->Level = OldLineLevel; @@ -877,6 +896,8 @@ void UnwrappedLineParser::parseSwitch() { if (FormatTok->Tok.is(tok::l_paren)) parseParens(); if (FormatTok->Tok.is(tok::l_brace)) { + if (Style.BreakBeforeBraces == FormatStyle::BS_Allman) + addUnwrappedLine(); parseBlock(/*MustBeDeclaration=*/false); addUnwrappedLine(); } else { @@ -973,7 +994,8 @@ void UnwrappedLineParser::parseRecord() { } } if (FormatTok->Tok.is(tok::l_brace)) { - if (Style.BreakBeforeBraces == FormatStyle::BS_Linux) + if (Style.BreakBeforeBraces == FormatStyle::BS_Linux || + Style.BreakBeforeBraces == FormatStyle::BS_Allman) addUnwrappedLine(); parseBlock(/*MustBeDeclaration=*/true); diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index ba78995eb5..2e955383ce 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -5454,6 +5454,84 @@ TEST_F(FormatTest, StroustrupBraceBreaking) { BreakBeforeBrace); } +TEST_F(FormatTest, AllmanBraceBreaking) { + FormatStyle BreakBeforeBrace = getLLVMStyle(); + BreakBeforeBrace.BreakBeforeBraces = FormatStyle::BS_Allman; + verifyFormat("namespace a\n" + "{\n" + "class A\n" + "{\n" + " void f()\n" + " {\n" + " if (true)\n" + " {\n" + " a();\n" + " b();\n" + " }\n" + " }\n" + " void g()\n" + " {\n" + " return;\n" + " }\n" + "}\n" + "}", + BreakBeforeBrace); + + verifyFormat("void f()\n" + "{\n" + " if (true)\n" + " {\n" + " a();\n" + " }\n" + " else if (false)\n" + " {\n" + " b();\n" + " }\n" + " else\n" + " {\n" + " c();\n" + " }\n" + "}\n", + BreakBeforeBrace); + + verifyFormat("void f()\n" + "{\n" + " for (int i = 0; i < 10; ++i)\n" + " {\n" + " a();\n" + " }\n" + " while (false)\n" + " {\n" + " b();\n" + " }\n" + " do\n" + " {\n" + " c();\n" + " } while (false)\n" + "}\n", + BreakBeforeBrace); + + verifyFormat("void f(int a)\n" + "{\n" + " switch (a)\n" + " {\n" + " case 0:\n" + " break;\n" + " case 1:\n" + " {\n" + " break;\n" + " }\n" + " case 2:\n" + " {\n" + " }\n" + " break;\n" + " default:\n" + " break;\n" + " }\n" + "}\n", + BreakBeforeBrace); +} + bool allStylesEqual(ArrayRef Styles) { for (size_t i = 1; i < Styles.size(); ++i) if (!(Styles[0] == Styles[i]))