r187033 - clang-format: Initial (incomplete) support for the WebKit coding style.
Daniel Jasper
djasper at google.com
Wed Jul 24 06:10:59 PDT 2013
Author: djasper
Date: Wed Jul 24 08:10:59 2013
New Revision: 187033
URL: http://llvm.org/viewvc/llvm-project?rev=187033&view=rev
Log:
clang-format: Initial (incomplete) support for the WebKit coding style.
This is far from implementing all the rules given by
http://www.webkit.org/coding/coding-style.html
The important new feature is the support for styles that don't have a
column limit. For such styles, clang-format will (at the moment) simply
respect the input's formatting decisions within statements.
Modified:
cfe/trunk/include/clang/Format/Format.h
cfe/trunk/lib/Format/Format.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=187033&r1=187032&r2=187033&view=diff
==============================================================================
--- cfe/trunk/include/clang/Format/Format.h (original)
+++ cfe/trunk/include/clang/Format/Format.h Wed Jul 24 08:10:59 2013
@@ -31,6 +31,10 @@ namespace format {
/// specific guidelines.
struct FormatStyle {
/// \brief The column limit.
+ ///
+ /// A column limit of \c 0 means that there is no column limit. In this case,
+ /// clang-format will respect the input's line breaking decisions within
+ /// statements.
unsigned ColumnLimit;
/// \brief The maximum number of consecutive empty lines to keep.
@@ -218,6 +222,10 @@ FormatStyle getChromiumStyle();
/// https://developer.mozilla.org/en-US/docs/Developer_Guide/Coding_Style.
FormatStyle getMozillaStyle();
+/// \brief Returns a format style complying with Webkit's style guide:
+/// http://www.webkit.org/coding/coding-style.html
+FormatStyle getWebKitStyle();
+
/// \brief Gets a predefined style by name.
///
/// Currently supported names: LLVM, Google, Chromium, Mozilla. Names are
Modified: cfe/trunk/lib/Format/Format.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=187033&r1=187032&r2=187033&view=diff
==============================================================================
--- cfe/trunk/lib/Format/Format.cpp (original)
+++ cfe/trunk/lib/Format/Format.cpp Wed Jul 24 08:10:59 2013
@@ -219,6 +219,15 @@ FormatStyle getMozillaStyle() {
return MozillaStyle;
}
+FormatStyle getWebKitStyle() {
+ FormatStyle Style = getLLVMStyle();
+ Style.ColumnLimit = 0;
+ Style.IndentWidth = 4;
+ Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
+ Style.PointerBindsToType = true;
+ return Style;
+}
+
bool getPredefinedStyle(StringRef Name, FormatStyle *Style) {
if (Name.equals_lower("llvm"))
*Style = getLLVMStyle();
@@ -228,6 +237,8 @@ bool getPredefinedStyle(StringRef Name,
*Style = getMozillaStyle();
else if (Name.equals_lower("google"))
*Style = getGoogleStyle();
+ else if (Name.equals_lower("webkit"))
+ *Style = getWebKitStyle();
else
return false;
@@ -299,6 +310,11 @@ public:
// The first token has already been indented and thus consumed.
moveStateToNextToken(State, /*DryRun=*/false, /*Newline=*/false);
+ if (Style.ColumnLimit == 0) {
+ formatWithoutColumnLimit(State);
+ return;
+ }
+
// If everything fits on a single line, just put it there.
unsigned ColumnLimit = Style.ColumnLimit;
if (NextLine && NextLine->InPPDirective &&
@@ -506,6 +522,15 @@ private:
}
};
+ /// \brief Formats the line starting at \p State, simply keeping all of the
+ /// input's line breaking decisions.
+ void formatWithoutColumnLimit(LineState &State) {
+ while (State.NextToken != NULL) {
+ bool Newline = State.NextToken->NewlinesBefore > 0;
+ addTokenToState(Newline, /*DryRun=*/false, State);
+ }
+ }
+
/// \brief Appends the next token to \p State and updates information
/// necessary for indentation.
///
@@ -1592,6 +1617,9 @@ private:
if (I->Last->Type == TT_LineComment)
return;
+ if (Indent > Style.ColumnLimit)
+ return;
+
unsigned Limit = Style.ColumnLimit - Indent;
// If we already exceed the column limit, we set 'Limit' to 0. The different
// tryMerge..() functions can then decide whether to still do merging.
Modified: cfe/trunk/unittests/Format/FormatTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=187033&r1=187032&r2=187033&view=diff
==============================================================================
--- cfe/trunk/unittests/Format/FormatTest.cpp (original)
+++ cfe/trunk/unittests/Format/FormatTest.cpp Wed Jul 24 08:10:59 2013
@@ -5361,6 +5361,11 @@ TEST_F(FormatTest, GetsPredefinedStyleBy
EXPECT_TRUE(getPredefinedStyle("moZILla", &Styles[2]));
EXPECT_TRUE(allStylesEqual(Styles));
+ Styles[0] = getWebKitStyle();
+ EXPECT_TRUE(getPredefinedStyle("WebKit", &Styles[1]));
+ EXPECT_TRUE(getPredefinedStyle("wEbKit", &Styles[2]));
+ EXPECT_TRUE(allStylesEqual(Styles));
+
EXPECT_FALSE(getPredefinedStyle("qwerty", &Styles[0]));
}
@@ -5515,6 +5520,79 @@ TEST_F(FormatTest, SplitsUTF8BlockCommen
format("/* ð£ð®ð¼ð½ ð£ð¬ð²ð¯ ððªð¥ð ðð¿ð±-ð */", getLLVMStyleWithColumns(12)));
}
+TEST_F(FormatTest, FormatsWithWebKitStyle) {
+ FormatStyle Style = getWebKitStyle();
+
+ // Don't indent in outer namespaces.
+ verifyFormat("namespace outer {\n"
+ "int i;\n"
+ "namespace inner {\n"
+ "int i;\n" // FIXME: This should be indented.
+ "} // namespace inner\n"
+ "} // namespace outer\n"
+ "namespace other_outer {\n"
+ "int i;\n"
+ "}",
+ Style);
+
+ // Don't indent case labels.
+ verifyFormat("switch (variable) {\n"
+ "case 1:\n"
+ "case 2:\n"
+ " doSomething();\n"
+ " break;\n"
+ "default:\n"
+ " ++variable;\n"
+ "}",
+ Style);
+
+ // Wrap before binary operators.
+ EXPECT_EQ(
+ "void f()\n"
+ "{\n"
+ " if (aaaaaaaaaaaaaaaa\n"
+ " && bbbbbbbbbbbbbbbbbbbbbbbb\n"
+ " && (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
+ " return;\n"
+ "}",
+ format(
+ "void f() {\n"
+ "if (aaaaaaaaaaaaaaaa\n"
+ "&& bbbbbbbbbbbbbbbbbbbbbbbb\n"
+ "&& (cccccccccccccccccccccccccc || dddddddddddddddddddd))\n"
+ "return;\n"
+ "}",
+ Style));
+
+ // Constructor initializers are formatted one per line with the "," on the
+ // new line.
+ // FIXME: This needs to be implemented.
+ // verifyFormat("Constructor()\n"
+ // " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
+ // " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
+ // " aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n"
+ // " , aaaaaaaaaaaaaaaaaaaaaaa() {}",
+ // Style);
+
+ // Do not align comments.
+ // FIXME: Implement option to suppress comment alignment.
+ // verifyFormat("int a; // Do not\n"
+ // "double b; // align comments.");
+
+ // Accept input's line breaks.
+ EXPECT_EQ("if (aaaaaaaaaaaaaaa\n"
+ " || bbbbbbbbbbbbbbb) {\n"
+ " i++;\n"
+ "}",
+ format("if (aaaaaaaaaaaaaaa\n"
+ "|| bbbbbbbbbbbbbbb) { i++; }",
+ Style));
+ EXPECT_EQ("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) {\n"
+ " i++;\n"
+ "}",
+ format("if (aaaaaaaaaaaaaaa || bbbbbbbbbbbbbbb) { i++; }", Style));
+}
+
#endif
} // end namespace tooling
More information about the cfe-commits
mailing list