[PATCH] clang-format: Added option for Allman style brace breaking
Manuel Klimek
klimek at google.com
Thu Aug 1 07:01:40 PDT 2013
Can you make sure that all changes are covered in the test? For example, I
see no 'break' statement in the test.
Thanks!
/Manuel
On Thu, Aug 1, 2013 at 3:17 PM, Frank Miller <fmiller at sjm.com> wrote:
> Allman style is the opposite of attach. Braces are always on their own
> line.
>
> http://llvm-reviews.chandlerc.com/D1257
>
> Files:
> include/clang/Format/Format.h
> lib/Format/Format.cpp
> lib/Format/UnwrappedLineParser.cpp
> unittests/Format/FormatTest.cpp
>
> Index: include/clang/Format/Format.h
> ===================================================================
> --- include/clang/Format/Format.h
> +++ include/clang/Format/Format.h
> @@ -163,7 +163,9 @@
> /// 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.
> Index: lib/Format/Format.cpp
> ===================================================================
> --- lib/Format/Format.cpp
> +++ lib/Format/Format.cpp
> @@ -50,6 +50,7 @@
> 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);
> }
> };
>
> Index: lib/Format/UnwrappedLineParser.cpp
> ===================================================================
> --- lib/Format/UnwrappedLineParser.cpp
> +++ lib/Format/UnwrappedLineParser.cpp
> @@ -594,7 +594,8 @@
> // 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 @@
> 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 @@
> 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 @@
> 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 @@
> 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 @@
> 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 @@
> 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 @@
> 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 @@
> }
> }
> 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);
> Index: unittests/Format/FormatTest.cpp
> ===================================================================
> --- unittests/Format/FormatTest.cpp
> +++ unittests/Format/FormatTest.cpp
> @@ -5419,6 +5419,30 @@
> 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);
> +}
> +
> bool allStylesEqual(ArrayRef<FormatStyle> Styles) {
> for (size_t i = 1; i < Styles.size(); ++i)
> if (!(Styles[0] == Styles[i]))
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130801/4f8528de/attachment.html>
More information about the cfe-commits
mailing list