From: Daniel Jasper Date: Mon, 30 Jun 2014 13:24:54 +0000 (+0000) Subject: clang-format: [JS] support free-standing functions again. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=96ff76b6423d3b54829002e9d5cb8c17e4882dab;p=clang clang-format: [JS] support free-standing functions again. This worked initially but was broken by r210887. Before: function outer1(a, b) { function inner1(a, b) { return a; } inner1(a, b); } function outer2(a, b) { function inner2(a, b) { return a; } inner2(a, b); } After: function outer1(a, b) { function inner1(a, b) { return a; } inner1(a, b); } function outer2(a, b) { function inner2(a, b) { return a; } inner2(a, b); } Thanks to Adam Strzelecki for working on this. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@212038 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/UnwrappedLineParser.cpp b/lib/Format/UnwrappedLineParser.cpp index 71ba893cf3..20dd573162 100644 --- a/lib/Format/UnwrappedLineParser.cpp +++ b/lib/Format/UnwrappedLineParser.cpp @@ -770,7 +770,10 @@ void UnwrappedLineParser::parseStructuralElement() { return; case tok::identifier: { StringRef Text = FormatTok->TokenText; - if (Style.Language == FormatStyle::LK_JavaScript && Text == "function") { + // Parse function literal unless 'function' is the first token in a line + // in which case this should be treated as a free-standing function. + if (Style.Language == FormatStyle::LK_JavaScript && Text == "function" && + Line->Tokens.size() > 0) { tryToParseJSFunction(); break; } diff --git a/unittests/Format/FormatTestJS.cpp b/unittests/Format/FormatTestJS.cpp index 7f5507ee26..f8802b85d6 100644 --- a/unittests/Format/FormatTestJS.cpp +++ b/unittests/Format/FormatTestJS.cpp @@ -138,6 +138,17 @@ TEST_F(FormatTestJS, GoogScopes) { "}); // goog.scope"); } +TEST_F(FormatTestJS, FormatsFreestandingFunctions) { + verifyFormat("function outer1(a, b) {\n" + " function inner1(a, b) { return a; }\n" + " inner1(a, b);\n" + "}\n" + "function outer2(a, b) {\n" + " function inner2(a, b) { return a; }\n" + " inner2(a, b);\n" + "}"); +} + TEST_F(FormatTestJS, FunctionLiterals) { verifyFormat("doFoo(function() { return 1; });"); verifyFormat("var func = function() { return 1; };");