]> granicus.if.org Git - clang/commitdiff
clang-format: [JS] Improve formatting of function literals in chains
authorDaniel Jasper <djasper@google.com>
Mon, 29 Sep 2014 07:54:54 +0000 (07:54 +0000)
committerDaniel Jasper <djasper@google.com>
Mon, 29 Sep 2014 07:54:54 +0000 (07:54 +0000)
Before:
  getSomeLongPromise(.....)
      .then(
           function(value) {
             body();
             body();
           })
      .thenCatch(function(error) {
    body();
    body();
  });

After:
  getSomeLongPromise(.....)
      .then(function(value) {
        body();
        body();
      })
      .thenCatch(function(error) {
        body();
        body();
      });

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

lib/Format/ContinuationIndenter.cpp
unittests/Format/FormatTestJS.cpp

index ce6ebd84b6aac21cc1d88d4f73998ac04134f05b..c48df870416bb2c055d213d87627af87c91f8bcd 100644 (file)
@@ -656,7 +656,10 @@ unsigned ContinuationIndenter::moveStateToNextToken(LineState &State,
     }
     if (Current.TokenText == "function")
       State.Stack.back().JSFunctionInlined =
-          !Newline && Previous && Previous->Type != TT_DictLiteral;
+          !Newline && Previous && Previous->Type != TT_DictLiteral &&
+          // If the unnamed function is the only parameter to another function,
+          // we can likely inline it and come up with a good format.
+          (Previous->isNot(tok::l_paren) || Previous->ParameterCount > 1);
   }
 
   moveStatePastFakeLParens(State, Newline);
index 52f45c7ddd1e07ef36caa2791796fa9a8fcaeed9..09d5f1feb2f2ced515d7a7f9bc748a42e7a95966 100644 (file)
@@ -249,6 +249,19 @@ TEST_F(FormatTestJS, MultipleFunctionLiterals) {
                "               doFoo();\n"
                "               doBaz();\n"
                "             });\n");
+
+  verifyFormat("getSomeLongPromise()\n"
+               "    .then(function(value) { body(); })\n"
+               "    .thenCatch(function(error) { body(); });");
+  verifyFormat("getSomeLongPromise()\n"
+               "    .then(function(value) {\n"
+               "      body();\n"
+               "      body();\n"
+               "    })\n"
+               "    .thenCatch(function(error) {\n"
+               "      body();\n"
+               "      body();\n"
+               "    });");
 }
 
 TEST_F(FormatTestJS, ReturnStatements) {