From 40c36c54ca01c3f96644962971da1c23a4cda945 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Mon, 18 Feb 2013 11:05:07 +0000 Subject: [PATCH] Prevent line breaks that make stuff hard to read. Before: aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa).aaaaaaaaaaaaaaaaa( aaaaaaaaaaaaaaaaaaaaa).aaaaaaaaaaaaaaaaaaa( aaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa); After: aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa) .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa) .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa); llvm-svn: 175432 --- clang/lib/Format/Format.cpp | 15 +++++++++++++++ clang/unittests/Format/FormatTest.cpp | 7 +++++++ 2 files changed, 22 insertions(+) diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 939211c..ee3516a 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -251,6 +251,7 @@ public: State.VariablePos = 0; State.LineContainsContinuedForLoopSection = false; State.ParenLevel = 0; + State.StartOfLineLevel = State.ParenLevel; DEBUG({ DebugTokenState(*State.NextToken); @@ -384,6 +385,9 @@ private: /// \brief The level of nesting inside (), [], <> and {}. unsigned ParenLevel; + /// \brief The \c ParenLevel at the start of this line. + unsigned StartOfLineLevel; + /// \brief A stack keeping track of properties applying to parenthesis /// levels. std::vector Stack; @@ -401,6 +405,8 @@ private: return LineContainsContinuedForLoopSection; if (Other.ParenLevel != ParenLevel) return Other.ParenLevel < ParenLevel; + if (Other.StartOfLineLevel < StartOfLineLevel) + return Other.StartOfLineLevel < StartOfLineLevel; return Other.Stack < Stack; } }; @@ -489,6 +495,7 @@ private: } State.Stack.back().LastSpace = State.Column; + State.StartOfLineLevel = State.ParenLevel; if (Current.is(tok::colon) && Current.Type != TT_ConditionalExpr) State.Stack.back().Indent += 2; } else { @@ -772,6 +779,14 @@ private: !(State.NextToken->is(tok::r_brace) && State.Stack.back().BreakBeforeClosingBrace)) return false; + // This prevents breaks like: + // ... + // SomeParameter, OtherParameter).DoSomething( + // ... + // As they hide "DoSomething" and generally bad for readability. + if (State.NextToken->Parent->is(tok::l_paren) && + State.ParenLevel <= State.StartOfLineLevel) + return false; // Trying to insert a parameter on a new line if there are already more than // one parameter on the current line is bin packing. if (State.Stack.back().HasMultiParameterLine && diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index a41c713..fad7998 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -1457,6 +1457,13 @@ TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)]\n" " .insert(ccccccccccccccccccccccc);"); + verifyGoogleFormat( + "aaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" + " .aaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" + " .aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaa,\n" + " aaaaaaaaaaaaaaaaaaa,\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); + // Here, it is not necessary to wrap at "." or "->". verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaa) ||\n" " aaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); -- 2.7.4