diff --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp --- a/clang/lib/Format/FormatTokenLexer.cpp +++ b/clang/lib/Format/FormatTokenLexer.cpp @@ -120,8 +120,11 @@ Tokens.back()->Tok.setKind(tok::starequal); return; } - if (tryMergeTokens(JSNullishOperator, TT_JsNullishCoalescingOperator)) + if (tryMergeTokens(JSNullishOperator, TT_JsNullishCoalescingOperator)) { + // Treat like the "||" operator (as opposed to the ternary ?). + Tokens.back()->Tok.setKind(tok::pipepipe); return; + } if (tryMergeTokens(JSNullPropagatingOperator, TT_JsNullPropagatingOperator)) { // Treat like a regular "." access. 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 @@ -2294,6 +2294,11 @@ TEST_F(FormatTestJS, NullishCoalescingOperator) { verifyFormat("const val = something ?? 'some other default';\n"); + verifyFormat( + "const val = something ?? otherDefault ??\n" + " evenMore ?? evenMore;\n", + "const val = something ?? otherDefault ?? evenMore ?? evenMore;\n", + getGoogleJSStyleWithColumns(40)); } TEST_F(FormatTestJS, Conditional) {