diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index 1727ed93822b1..40f77266fabdc 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -4042,7 +4042,7 @@ void UnwrappedLineParser::parseRecord(bool ParseAsExpr) { } auto IsListInitialization = [&] { - if (!ClassName || IsDerived) + if (!ClassName || IsDerived || JSPastExtendsOrImplements) return false; assert(FormatTok->is(tok::l_brace)); const auto *Prev = FormatTok->getPreviousNonComment(); diff --git a/clang/unittests/Format/FormatTestJS.cpp b/clang/unittests/Format/FormatTestJS.cpp index c25228a69a748..57c021c76867f 100644 --- a/clang/unittests/Format/FormatTestJS.cpp +++ b/clang/unittests/Format/FormatTestJS.cpp @@ -579,12 +579,17 @@ TEST_F(FormatTestJS, GoogScopes) { "});"); } -TEST_F(FormatTestJS, GoogAnonymousClass) { +TEST_F(FormatTestJS, ClassExtends) { verifyFormat("a = class extends goog.structs.a {\n" " a() {\n" " return 0;\n" " }\n" "};"); + verifyFormat("a = class Foo extends goog.structs.a {\n" + " a() {\n" + " return 0;\n" + " }\n" + "};"); } TEST_F(FormatTestJS, IIFEs) { diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp index 5c28e3a4ea5a1..baa5ab0ac5e45 100644 --- a/clang/unittests/Format/TokenAnnotatorTest.cpp +++ b/clang/unittests/Format/TokenAnnotatorTest.cpp @@ -3277,6 +3277,14 @@ TEST_F(TokenAnnotatorTest, BraceKind) { EXPECT_TOKEN(Tokens[8], tok::r_brace, TT_ClassRBrace); EXPECT_BRACE_KIND(Tokens[8], BK_Block); + Tokens = annotate("a = class Foo extends goog.a {};", + getGoogleStyle(FormatStyle::LK_JavaScript)); + ASSERT_EQ(Tokens.size(), 12u) << Tokens; + EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_ClassLBrace); + EXPECT_BRACE_KIND(Tokens[8], BK_Block); + EXPECT_TOKEN(Tokens[9], tok::r_brace, TT_ClassRBrace); + EXPECT_BRACE_KIND(Tokens[9], BK_Block); + Tokens = annotate("#define FOO(X) \\\n" " struct X##_tag_ {};"); ASSERT_EQ(Tokens.size(), 14u) << Tokens;