diff options
| author | Manuel Klimek <klimek@google.com> | 2013-02-20 15:25:48 +0000 |
|---|---|---|
| committer | Manuel Klimek <klimek@google.com> | 2013-02-20 15:25:48 +0000 |
| commit | 02f640a3ab800df9912269dff25bf186785be1a4 (patch) | |
| tree | 34183a5921572eb8857de0f6c1d0001470632ab5 | |
| parent | 3389c55e10c29dad7c19bbe6241490c443f7174b (diff) | |
| download | bcm5719-llvm-02f640a3ab800df9912269dff25bf186785be1a4.tar.gz bcm5719-llvm-02f640a3ab800df9912269dff25bf186785be1a4.zip | |
Fixes bug in string literal alignment.
We now indent the following correctly:
1. some + "literal" /* comment */
"literal";
2. breaking string literals after which we have another string literal.
llvm-svn: 175628
| -rw-r--r-- | clang/lib/Format/Format.cpp | 17 | ||||
| -rw-r--r-- | clang/unittests/Format/FormatTest.cpp | 13 |
2 files changed, 28 insertions, 2 deletions
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 625f93151ff..aca5d36aefc 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -284,6 +284,7 @@ public: State.VariablePos = 0; State.LineContainsContinuedForLoopSection = false; State.ParenLevel = 0; + State.StartOfStringLiteral = 0; State.StartOfLineLevel = State.ParenLevel; DEBUG({ @@ -421,6 +422,10 @@ private: /// \brief The \c ParenLevel at the start of this line. unsigned StartOfLineLevel; + /// \brief The start column of the string literal, if we're in a string + /// literal sequence, 0 otherwise. + unsigned StartOfStringLiteral; + /// \brief A stack keeping track of properties applying to parenthesis /// levels. std::vector<ParenState> Stack; @@ -440,6 +445,8 @@ private: return ParenLevel < Other.ParenLevel; if (StartOfLineLevel != Other.StartOfLineLevel) return StartOfLineLevel < Other.StartOfLineLevel; + if (StartOfStringLiteral != Other.StartOfStringLiteral) + return StartOfStringLiteral < Other.StartOfStringLiteral; return Stack < Other.Stack; } }; @@ -472,8 +479,8 @@ private: if (Current.is(tok::r_brace)) { State.Column = Line.Level * 2; } else if (Current.is(tok::string_literal) && - Previous.is(tok::string_literal)) { - State.Column = State.Column - Previous.FormatTok.TokenLength; + State.StartOfStringLiteral != 0) { + State.Column = State.StartOfStringLiteral; State.Stack.back().BreakBeforeParameter = true; } else if (Current.is(tok::lessless) && State.Stack.back().FirstLessLess != 0) { @@ -685,6 +692,12 @@ private: State.Stack.pop_back(); } + if (Current.is(tok::string_literal) && State.StartOfStringLiteral == 0) { + State.StartOfStringLiteral = State.Column; + } else if (Current.isNot(tok::comment)) { + State.StartOfStringLiteral = 0; + } + State.Column += Current.FormatTok.TokenLength; if (State.NextToken->Children.empty()) diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index dba6183e09c..ab4825b3145 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -1439,6 +1439,19 @@ TEST_F(FormatTest, AlignsStringLiterals) { verifyFormat("someFunction(\"Always break between multi-line\"\n" " \" string literals\",\n" " and, other, parameters);"); + EXPECT_EQ("fun + \"1243\" /* comment */\n" + " \"5678\";", + format("fun + \"1243\" /* comment */\n" + " \"5678\";", + getLLVMStyleWithColumns(28))); + EXPECT_EQ( + "aaaaaa = \"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa \"\n" + " \"aaaaaaaaaaaaaaaaaaaaa\"\n" + " \"aaaaaaaaaaaaaaaa\";", + format("aaaaaa =" + "\"aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaa " + "aaaaaaaaaaaaaaaaaaaaa\" " + "\"aaaaaaaaaaaaaaaa\";")); } TEST_F(FormatTest, AlignsPipes) { |

