diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -495,7 +495,10 @@ if (((Current.is(TT_FunctionDeclarationName) && // Don't break before a C# function when no break after return type (!Style.isCSharp() || - Style.AlwaysBreakAfterReturnType != FormatStyle::RTBS_None)) || + Style.AlwaysBreakAfterReturnType != FormatStyle::RTBS_None) && + // Don't always break between a JavaScript `function` and the function + // name. + Style.Language != FormatStyle::LK_JavaScript) || (Current.is(tok::kw_operator) && !Previous.is(tok::coloncolon))) && !Previous.is(tok::kw_template) && State.Stack.back().BreakBeforeParameter) return true; diff --git a/clang/unittests/Format/FormatTestJS.cpp b/clang/unittests/Format/FormatTestJS.cpp --- a/clang/unittests/Format/FormatTestJS.cpp +++ b/clang/unittests/Format/FormatTestJS.cpp @@ -692,6 +692,13 @@ " let x = 1;\n" " console.log(x);\n" "}\n"); + EXPECT_EQ("a = function(x) {}\n" + "\n" + "function f(x) {}", + format("a = function(x) {}\n" + "\n" + "function f(x) {}", + getGoogleJSStyleWithColumns(20))); } TEST_F(FormatTestJS, GeneratorFunctions) {