]> granicus.if.org Git - clang/commitdiff
clang-format: Fix regression introduced by r189337.
authorDaniel Jasper <djasper@google.com>
Fri, 6 Sep 2013 08:08:14 +0000 (08:08 +0000)
committerDaniel Jasper <djasper@google.com>
Fri, 6 Sep 2013 08:08:14 +0000 (08:08 +0000)
Before:
  if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(
          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) ...

After:
  if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(
          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)
      == 5) ...

Also precompute startsBinaryExpression() to improve performance.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190124 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Format/ContinuationIndenter.cpp
lib/Format/FormatToken.h
lib/Format/TokenAnnotator.cpp
unittests/Format/FormatTest.cpp

index d48cb23da940c1f284e65a9c4b2096ef6d8e1333..12cfd48f5b38dfaf3bc9965eac13861743a905b8 100644 (file)
@@ -38,15 +38,6 @@ static unsigned getLengthToMatchingParen(const FormatToken &Tok) {
   return End->TotalLength - Tok.TotalLength + 1;
 }
 
-// Returns \c true if \c Tok starts a binary expression.
-static bool startsBinaryExpression(const FormatToken &Tok) {
-  for (unsigned i = 0, e = Tok.FakeLParens.size(); i != e; ++i) {
-    if (Tok.FakeLParens[i] > prec::Unknown)
-      return true;
-  }
-  return false;
-}
-
 // Returns \c true if \c Tok is the "." or "->" of a call and starts the next
 // segment of a builder type call.
 static bool startsSegmentOfBuilderTypeCall(const FormatToken &Tok) {
@@ -156,7 +147,7 @@ bool ContinuationIndenter::mustBreak(const LineState &State) {
                         Previous.Previous &&
                         Previous.Previous->Type != TT_BinaryOperator; // For >>.
     bool LHSIsBinaryExpr =
-        Previous.Previous && Previous.Previous->FakeRParens > 0;
+        Previous.Previous && Previous.Previous->EndsBinaryExpression;
     if (Previous.Type == TT_BinaryOperator &&
         (!IsComparison || LHSIsBinaryExpr) &&
         Current.Type != TT_BinaryOperator && // For >>.
@@ -394,7 +385,7 @@ unsigned ContinuationIndenter::addTokenToState(LineState &State, bool Newline,
               Previous.Type == TT_UnaryOperator ||
               Previous.Type == TT_CtorInitializerColon) &&
              (Previous.getPrecedence() != prec::Assignment ||
-              startsBinaryExpression(Current)))
+              Current.StartsBinaryExpression))
       // Always indent relative to the RHS of the expression unless this is a
       // simple assignment without binary expression on the RHS. Also indent
       // relative to unary operators and the colons of constructor initializers.
@@ -455,7 +446,7 @@ unsigned ContinuationIndenter::moveStateToNextToken(LineState &State,
   }
 
   // If return returns a binary expression, align after it.
-  if (Current.is(tok::kw_return) && startsBinaryExpression(Current))
+  if (Current.is(tok::kw_return) && Current.StartsBinaryExpression)
     State.Stack.back().LastSpace = State.Column + 7;
 
   // In ObjC method declaration we align on the ":" of parameters, but we need
index e4342dd1317789533ac9a55df8b93905e6520b7b..e374f835d1895d5f7b4db91afaf75434681fd494 100644 (file)
@@ -89,9 +89,10 @@ struct FormatToken {
         CanBreakBefore(false), ClosesTemplateDeclaration(false),
         ParameterCount(0), PackingKind(PPK_Inconclusive), TotalLength(0),
         UnbreakableTailLength(0), BindingStrength(0), SplitPenalty(0),
-        LongestObjCSelectorName(0), FakeRParens(0), LastInChainOfCalls(false),
-        PartOfMultiVariableDeclStmt(false), MatchingParen(NULL), Previous(NULL),
-        Next(NULL) {}
+        LongestObjCSelectorName(0), FakeRParens(0),
+        StartsBinaryExpression(false), EndsBinaryExpression(false),
+        LastInChainOfCalls(false), PartOfMultiVariableDeclStmt(false),
+        MatchingParen(NULL), Previous(NULL), Next(NULL) {}
 
   /// \brief The \c Token.
   Token Tok;
@@ -221,6 +222,12 @@ struct FormatToken {
   /// \brief Insert this many fake ) after this token for correct indentation.
   unsigned FakeRParens;
 
+  /// \brief \c true if this token starts a binary expression, i.e. has at least
+  /// one fake l_paren with a precedence greater than prec::Unknown.
+  bool StartsBinaryExpression;
+  /// \brief \c true if this token ends a binary expression.
+  bool EndsBinaryExpression;
+
   /// \brief Is this the last "." or "->" in a builder-type call?
   bool LastInChainOfCalls;
 
index 2f3be557cecc7ef3c6c7976218d687d5ab765a4f..c725f5097e21325042213b15b1a091f405e7abf6 100644 (file)
@@ -928,8 +928,13 @@ private:
 
   void addFakeParenthesis(FormatToken *Start, prec::Level Precedence) {
     Start->FakeLParens.push_back(Precedence);
-    if (Current)
+    if (Precedence > prec::Unknown)
+      Start->StartsBinaryExpression = true;
+    if (Current) {
       ++Current->Previous->FakeRParens;
+      if (Precedence > prec::Unknown)
+        Current->Previous->EndsBinaryExpression = true;
+    }
   }
 
   /// \brief Parse unary operator expressions and surround them with fake
index 3eaa69a8b6cadf1524c77c33e365fc49e09a3ca2..6e9516da252ba99628a7f4e74fc9191d10002bfc 100644 (file)
@@ -2341,6 +2341,10 @@ TEST_F(FormatTest, LineBreakingInBinaryExpressions) {
       "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
       "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
       "}");
+  verifyFormat(
+      "if (aaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaa(\n"
+      "        aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) == 5) {\n"
+      "}");
   // Even explicit parentheses stress the precedence enough to make the
   // additional break unnecessary.
   verifyFormat(