]> granicus.if.org Git - clang/commitdiff
libFormat: Teach the *& usage heuristic that "return" starts a rhs too.
authorNico Weber <nicolasweber@gmx.de>
Sun, 23 Dec 2012 01:07:46 +0000 (01:07 +0000)
committerNico Weber <nicolasweber@gmx.de>
Sun, 23 Dec 2012 01:07:46 +0000 (01:07 +0000)
"return a*b;" was formatted as "return a *b;" and is now formatted as "return a * b;".

Fixes PR14687 partially.

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

lib/Format/Format.cpp
unittests/Format/FormatTest.cpp

index bb18e9a85151aa863b9522722f0d1bd9d250258b..2a8fbd6e5e9a19049e73f41b414c3f1840744609 100644 (file)
@@ -716,19 +716,21 @@ public:
 
 private:
   void determineTokenTypes() {
-    bool AssignmentEncountered = false;
+    bool IsRHS = false;
     for (int i = 0, e = Line.Tokens.size(); i != e; ++i) {
       TokenAnnotation &Annotation = Annotations[i];
       const FormatToken &Tok = Line.Tokens[i];
 
       if (getBinOpPrecedence(Tok.Tok.getKind(), true, true) == prec::Assignment)
-        AssignmentEncountered = true;
+        IsRHS = true;
+      else if (Tok.Tok.is(tok::kw_return))
+        IsRHS = true;
 
       if (Annotation.Type != TokenAnnotation::TT_Unknown)
         continue;
 
       if (Tok.Tok.is(tok::star) || Tok.Tok.is(tok::amp)) {
-        Annotation.Type = determineStarAmpUsage(i, AssignmentEncountered);
+        Annotation.Type = determineStarAmpUsage(i, IsRHS);
       } else if (Tok.Tok.is(tok::minus) || Tok.Tok.is(tok::plus)) {
         Annotation.Type = determinePlusMinusUsage(i);
       } else if (Tok.Tok.is(tok::minusminus) || Tok.Tok.is(tok::plusplus)) {
@@ -754,12 +756,13 @@ private:
   }
 
   TokenAnnotation::TokenType determineStarAmpUsage(unsigned Index,
-                                                   bool AssignmentEncountered) {
+                                                   bool IsRHS) {
     if (Index == Annotations.size())
       return TokenAnnotation::TT_Unknown;
 
     if (Index == 0 || Line.Tokens[Index - 1].Tok.is(tok::l_paren) ||
         Line.Tokens[Index - 1].Tok.is(tok::comma) ||
+        Line.Tokens[Index - 1].Tok.is(tok::kw_return) ||
         Annotations[Index - 1].Type == TokenAnnotation::TT_BinaryOperator)
       return TokenAnnotation::TT_UnaryOperator;
 
@@ -770,7 +773,7 @@ private:
 
     // It is very unlikely that we are going to find a pointer or reference type
     // definition on the RHS of an assignment.
-    if (AssignmentEncountered)
+    if (IsRHS)
       return TokenAnnotation::TT_BinaryOperator;
 
     return TokenAnnotation::TT_PointerOrReference;
index f954c14ef73ab1f4f8ab47407f800658c4e77aa3..b316750a0b6bde27f73965e657aeb546c0753d82 100644 (file)
@@ -592,6 +592,9 @@ TEST_F(FormatTest, UnderstandsUsesOfStar) {
   verifyFormat("int a = *b * c;");
   verifyFormat("int a = b * *c;");
   verifyFormat("int main(int argc, char **argv) {\n}");
+  verifyFormat("return 10 * b;");
+  verifyFormat("return *b * *c;");
+  verifyFormat("return a & ~b;");
 
   // FIXME: Is this desired for LLVM? Fix if not.
   verifyFormat("A<int *> a;");