Index: include/clang/Format/Format.h =================================================================== --- include/clang/Format/Format.h +++ include/clang/Format/Format.h @@ -94,6 +94,10 @@ /// A > instead of \c A> for LS_Cpp03. LanguageStandard Standard; + /// \brief When \c true, blocks (including braces) get an additional level of + /// indentation. + bool IndentBlocks; + /// \brief Indent case labels one level from the switch statement. /// /// When \c false, use the same indentation level as for the switch statement. @@ -308,6 +312,7 @@ DerivePointerBinding == R.DerivePointerBinding && ExperimentalAutoDetectBinPacking == R.ExperimentalAutoDetectBinPacking && + IndentBlocks == R.IndentBlocks && IndentCaseLabels == R.IndentCaseLabels && IndentFunctionDeclarationAfterType == R.IndentFunctionDeclarationAfterType && @@ -359,6 +364,10 @@ /// http://www.webkit.org/coding/coding-style.html FormatStyle getWebKitStyle(); +/// \brief Returns a format style complying with GNU Coding Standards: +/// http://www.gnu.org/prep/standards/standards.html +FormatStyle getGNUStyle(); + /// \brief Gets a predefined style for the specified language by name. /// /// Currently supported names: LLVM, Google, Chromium, Mozilla. Names are Index: lib/Format/Format.cpp =================================================================== --- lib/Format/Format.cpp +++ lib/Format/Format.cpp @@ -103,7 +103,7 @@ if (IO.outputting()) { StringRef StylesArray[] = { "LLVM", "Google", "Chromium", - "Mozilla", "WebKit" }; + "Mozilla", "WebKit", "GNU" }; ArrayRef Styles(StylesArray); for (size_t i = 0, e = Styles.size(); i < e; ++i) { StringRef StyleName(Styles[i]); @@ -233,13 +233,6 @@ namespace clang { namespace format { -void setDefaultPenalties(FormatStyle &Style) { - Style.PenaltyBreakComment = 60; - Style.PenaltyBreakFirstLessLess = 120; - Style.PenaltyBreakString = 1000; - Style.PenaltyExcessCharacter = 1000000; -} - FormatStyle getLLVMStyle() { FormatStyle LLVMStyle; LLVMStyle.Language = FormatStyle::LK_Cpp; @@ -263,6 +256,7 @@ LLVMStyle.Cpp11BracedListStyle = false; LLVMStyle.DerivePointerBinding = false; LLVMStyle.ExperimentalAutoDetectBinPacking = false; + LLVMStyle.IndentBlocks = false; LLVMStyle.IndentCaseLabels = false; LLVMStyle.IndentFunctionDeclarationAfterType = false; LLVMStyle.IndentWidth = 2; @@ -282,7 +276,10 @@ LLVMStyle.ContinuationIndentWidth = 4; LLVMStyle.SpacesInAngles = false; - setDefaultPenalties(LLVMStyle); + LLVMStyle.PenaltyBreakComment = 60; + LLVMStyle.PenaltyBreakFirstLessLess = 120; + LLVMStyle.PenaltyBreakString = 1000; + LLVMStyle.PenaltyExcessCharacter = 1000000; LLVMStyle.PenaltyReturnTypeOnItsOwnLine = 60; LLVMStyle.PenaltyBreakBeforeFirstCallParameter = 19; @@ -290,48 +287,23 @@ } FormatStyle getGoogleStyle() { - FormatStyle GoogleStyle; - GoogleStyle.Language = FormatStyle::LK_Cpp; + FormatStyle GoogleStyle = getLLVMStyle(); GoogleStyle.AccessModifierOffset = -1; GoogleStyle.AlignEscapedNewlinesLeft = true; - GoogleStyle.AlignTrailingComments = true; - GoogleStyle.AllowAllParametersOfDeclarationOnNextLine = true; - GoogleStyle.AllowShortFunctionsOnASingleLine = true; GoogleStyle.AllowShortIfStatementsOnASingleLine = true; GoogleStyle.AllowShortLoopsOnASingleLine = true; GoogleStyle.AlwaysBreakBeforeMultilineStrings = true; GoogleStyle.AlwaysBreakTemplateDeclarations = true; - GoogleStyle.BinPackParameters = true; - GoogleStyle.BreakBeforeBinaryOperators = false; - GoogleStyle.BreakBeforeTernaryOperators = true; - GoogleStyle.BreakBeforeBraces = FormatStyle::BS_Attach; - GoogleStyle.BreakConstructorInitializersBeforeComma = false; - GoogleStyle.ColumnLimit = 80; GoogleStyle.ConstructorInitializerAllOnOneLineOrOnePerLine = true; - GoogleStyle.ConstructorInitializerIndentWidth = 4; GoogleStyle.Cpp11BracedListStyle = true; GoogleStyle.DerivePointerBinding = true; - GoogleStyle.ExperimentalAutoDetectBinPacking = false; GoogleStyle.IndentCaseLabels = true; GoogleStyle.IndentFunctionDeclarationAfterType = true; - GoogleStyle.IndentWidth = 2; - GoogleStyle.TabWidth = 8; - GoogleStyle.MaxEmptyLinesToKeep = 1; - GoogleStyle.NamespaceIndentation = FormatStyle::NI_None; GoogleStyle.ObjCSpaceBeforeProtocolList = false; GoogleStyle.PointerBindsToType = true; GoogleStyle.SpacesBeforeTrailingComments = 2; GoogleStyle.Standard = FormatStyle::LS_Auto; - GoogleStyle.UseTab = FormatStyle::UT_Never; - GoogleStyle.SpacesInParentheses = false; - GoogleStyle.SpaceInEmptyParentheses = false; - GoogleStyle.SpacesInCStyleCastParentheses = false; - GoogleStyle.SpaceBeforeParens = FormatStyle::SBPO_ControlStatements; - GoogleStyle.SpaceBeforeAssignmentOperators = true; - GoogleStyle.ContinuationIndentWidth = 4; - GoogleStyle.SpacesInAngles = false; - setDefaultPenalties(GoogleStyle); GoogleStyle.PenaltyReturnTypeOnItsOwnLine = 200; GoogleStyle.PenaltyBreakBeforeFirstCallParameter = 1; @@ -385,6 +357,17 @@ return Style; } +FormatStyle getGNUStyle() { + FormatStyle Style = getLLVMStyle(); + Style.BreakBeforeBinaryOperators = true; + Style.BreakBeforeBraces = FormatStyle::BS_Allman; + Style.BreakBeforeTernaryOperators = true; + Style.ColumnLimit = 79; + Style.IndentBlocks = true; + Style.SpaceBeforeParens = FormatStyle::SBPO_Always; + return Style; +} + bool getPredefinedStyle(StringRef Name, FormatStyle::LanguageKind Language, FormatStyle *Style) { if (Name.equals_lower("llvm")) { @@ -398,6 +381,8 @@ : getGoogleStyle(); } else if (Name.equals_lower("webkit")) { *Style = getWebKitStyle(); + } else if (Name.equals_lower("gnu")) { + *Style = getGNUStyle(); } else { return false; } Index: unittests/Format/FormatTest.cpp =================================================================== --- unittests/Format/FormatTest.cpp +++ unittests/Format/FormatTest.cpp @@ -6992,6 +6992,11 @@ EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2])); EXPECT_ALL_STYLES_EQUAL(Styles); + Styles[0] = getGNUStyle(); + EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1])); + EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2])); + EXPECT_ALL_STYLES_EQUAL(Styles); + EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0])); }