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" <[email protected]> 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 > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
