r181700 - Implements brace breaking styles.

Alexander Kornienko alexfh at google.com
Tue May 14 12:46:02 PDT 2013


How about decomposing brace breaking styles to a set of orthogonal flags
(break before braces in: functions, class definitions, namespaces, after
if/for/while, before else, after else, may be something else). Then it
would make code a bit clearer and allow specifying other styles not listed
here (e.g., the one used by Microsoft).
On May 13, 2013 2:54 PM, "Manuel Klimek" <klimek at google.com> wrote:

> Author: klimek
> Date: Mon May 13 07:51:40 2013
> New Revision: 181700
>
> URL: http://llvm.org/viewvc/llvm-project?rev=181700&view=rev
> Log:
> Implements brace breaking styles.
>
> We now support "Linux" and "Stroustrup" brace breaking styles, which
> gets us one step closer to support formatting WebKit, KDE & Linux code.
>
> Linux brace breaking style:
> namespace a
> {
> class A
> {
>   void f()
>   {
>     if (x) {
>       f();
>     } else {
>       g();
>     }
>   }
> }
> }
>
> Stroustrup brace breaking style:
> namespace a {
> class A {
>   void f()
>   {
>     if (x) {
>       f();
>     } else {
>       g();
>     }
>   }
> }
> }
>
> Modified:
>     cfe/trunk/include/clang/Format/Format.h
>     cfe/trunk/lib/Format/Format.cpp
>     cfe/trunk/lib/Format/UnwrappedLineParser.cpp
>     cfe/trunk/unittests/Format/FormatTest.cpp
>
> Modified: cfe/trunk/include/clang/Format/Format.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Format/Format.h?rev=181700&r1=181699&r2=181700&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Format/Format.h (original)
> +++ cfe/trunk/include/clang/Format/Format.h Mon May 13 07:51:40 2013
> @@ -101,6 +101,20 @@ struct FormatStyle {
>    /// tab characters.
>    bool UseTab;
>
> +  /// \brief Different ways to attach braces to their surrounding context.
> +  enum BraceBreakingStyle {
> +    /// Always attach braces to surrounding context.
> +    BS_Attach,
> +    /// Like \c Attach, but break before braces on function, namespace and
> +    /// class definitions.
> +    BS_Linux,
> +    /// Like \c Attach, but break before function definitions.
> +    BS_Stroustrup
> +  };
> +
> +  /// \brief The brace breaking style to use.
> +  BraceBreakingStyle BreakBeforeBraces;
> +
>    bool operator==(const FormatStyle &R) const {
>      return AccessModifierOffset == R.AccessModifierOffset &&
>             AlignEscapedNewlinesLeft == R.AlignEscapedNewlinesLeft &&
> @@ -122,7 +136,8 @@ struct FormatStyle {
>             SpacesBeforeTrailingComments == R.SpacesBeforeTrailingComments
> &&
>             Standard == R.Standard &&
>             IndentWidth == R.IndentWidth &&
> -           UseTab == R.UseTab;
> +           UseTab == R.UseTab &&
> +           BreakBeforeBraces == R.BreakBeforeBraces;
>    }
>
>  };
>
> Modified: cfe/trunk/lib/Format/Format.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=181700&r1=181699&r2=181700&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Format/Format.cpp (original)
> +++ cfe/trunk/lib/Format/Format.cpp Mon May 13 07:51:40 2013
> @@ -36,11 +36,21 @@ namespace llvm {
>  namespace yaml {
>  template <>
>  struct
> ScalarEnumerationTraits<clang::format::FormatStyle::LanguageStandard> {
> -  static void enumeration(IO &io,
> -                          clang::format::FormatStyle::LanguageStandard
> &value) {
> -    io.enumCase(value, "C++03", clang::format::FormatStyle::LS_Cpp03);
> -    io.enumCase(value, "C++11", clang::format::FormatStyle::LS_Cpp11);
> -    io.enumCase(value, "Auto", clang::format::FormatStyle::LS_Auto);
> +  static void enumeration(IO &IO,
> +                          clang::format::FormatStyle::LanguageStandard
> &Value) {
> +    IO.enumCase(Value, "C++03", clang::format::FormatStyle::LS_Cpp03);
> +    IO.enumCase(Value, "C++11", clang::format::FormatStyle::LS_Cpp11);
> +    IO.enumCase(Value, "Auto", clang::format::FormatStyle::LS_Auto);
> +  }
> +};
> +
> +template<>
> +struct
> ScalarEnumerationTraits<clang::format::FormatStyle::BraceBreakingStyle> {
> +  static void
> +  enumeration(IO &IO, clang::format::FormatStyle::BraceBreakingStyle
> &Value) {
> +    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);
>    }
>  };
>
> @@ -87,6 +97,7 @@ template <> struct MappingTraits<clang::
>      IO.mapOptional("Standard", Style.Standard);
>      IO.mapOptional("IndentWidth", Style.IndentWidth);
>      IO.mapOptional("UseTab", Style.UseTab);
> +    IO.mapOptional("BreakBeforeBraces", Style.BreakBeforeBraces);
>    }
>  };
>  }
> @@ -115,6 +126,7 @@ FormatStyle getLLVMStyle() {
>    LLVMStyle.Standard = FormatStyle::LS_Cpp03;
>    LLVMStyle.IndentWidth = 2;
>    LLVMStyle.UseTab = false;
> +  LLVMStyle.BreakBeforeBraces = FormatStyle::BS_Attach;
>    return LLVMStyle;
>  }
>
> @@ -138,6 +150,7 @@ FormatStyle getGoogleStyle() {
>    GoogleStyle.Standard = FormatStyle::LS_Auto;
>    GoogleStyle.IndentWidth = 2;
>    GoogleStyle.UseTab = false;
> +  GoogleStyle.BreakBeforeBraces = FormatStyle::BS_Attach;
>    return GoogleStyle;
>  }
>
>
> Modified: cfe/trunk/lib/Format/UnwrappedLineParser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/UnwrappedLineParser.cpp?rev=181700&r1=181699&r2=181700&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Format/UnwrappedLineParser.cpp (original)
> +++ cfe/trunk/lib/Format/UnwrappedLineParser.cpp Mon May 13 07:51:40 2013
> @@ -402,6 +402,10 @@ void UnwrappedLineParser::parseStructura
>        // structural element.
>        // 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)
> +        addUnwrappedLine();
> +
>        parseBlock(/*MustBeDeclaration=*/ false);
>        addUnwrappedLine();
>        return;
> @@ -577,6 +581,9 @@ void UnwrappedLineParser::parseNamespace
>    if (FormatTok.Tok.is(tok::identifier))
>      nextToken();
>    if (FormatTok.Tok.is(tok::l_brace)) {
> +    if (Style.BreakBeforeBraces == FormatStyle::BS_Linux)
> +      addUnwrappedLine();
> +
>      parseBlock(/*MustBeDeclaration=*/ true, 0);
>      // Munch the semicolon after a namespace. This is more common than
> one would
>      // think. Puttin the semicolon into its own line is very ugly.
> @@ -751,8 +758,12 @@ void UnwrappedLineParser::parseRecord()
>        }
>      }
>    }
> -  if (FormatTok.Tok.is(tok::l_brace))
> +  if (FormatTok.Tok.is(tok::l_brace)) {
> +    if (Style.BreakBeforeBraces == FormatStyle::BS_Linux)
> +      addUnwrappedLine();
> +
>      parseBlock(/*MustBeDeclaration=*/ true);
> +  }
>    // We fall through to parsing a structural element afterwards, so
>    // class A {} n, m;
>    // will end up in one unwrapped line.
>
> Modified: cfe/trunk/unittests/Format/FormatTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=181700&r1=181699&r2=181700&view=diff
>
> ==============================================================================
> --- cfe/trunk/unittests/Format/FormatTest.cpp (original)
> +++ cfe/trunk/unittests/Format/FormatTest.cpp Mon May 13 07:51:40 2013
> @@ -4037,6 +4037,42 @@ TEST_F(FormatTest, ConfigurableUseOfTab)
>                 Tab);
>  }
>
> +TEST_F(FormatTest, LinuxBraceBreaking) {
> +  FormatStyle BreakBeforeBrace = getLLVMStyle();
> +  BreakBeforeBrace.BreakBeforeBraces = FormatStyle::BS_Linux;
> +  verifyFormat("namespace a\n"
> +               "{\n"
> +               "class A\n"
> +               "{\n"
> +               "  void f()\n"
> +               "  {\n"
> +               "    if (true) {\n"
> +               "      a();\n"
> +               "      b();\n"
> +               "    }\n"
> +               "  }\n"
> +               "}\n"
> +               "}",
> +               BreakBeforeBrace);
> +}
> +
> +TEST_F(FormatTest, StroustrupBraceBreaking) {
> +  FormatStyle BreakBeforeBrace = getLLVMStyle();
> +  BreakBeforeBrace.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
> +  verifyFormat("namespace a {\n"
> +               "class A {\n"
> +               "  void f()\n"
> +               "  {\n"
> +               "    if (true) {\n"
> +               "      a();\n"
> +               "      b();\n"
> +               "    }\n"
> +               "  }\n"
> +               "}\n"
> +               "}",
> +               BreakBeforeBrace);
> +}
> +
>  bool allStylesEqual(ArrayRef<FormatStyle> Styles) {
>    for (size_t i = 1; i < Styles.size(); ++i)
>      if (!(Styles[0] == Styles[i]))
> @@ -4113,6 +4149,14 @@ TEST_F(FormatTest, ParsesConfiguration)
>    CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
>    CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit,
> 1234u);
>
> +  Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
> +  CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
> +              FormatStyle::BS_Attach);
> +  CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
> +              FormatStyle::BS_Linux);
> +  CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
> +              FormatStyle::BS_Stroustrup);
> +
>  #undef CHECK_PARSE
>  #undef CHECK_PARSE_BOOL
>  }
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130514/fb56a711/attachment.html>


More information about the cfe-commits mailing list