@@ -479,11 +479,13 @@ TEST_F(TokenAnnotatorTest, UnderstandsUsesOfPlusAndMinus) {
479479TEST_F (TokenAnnotatorTest, UnderstandsClasses) {
480480 auto Tokens = annotate (" class C {};" );
481481 ASSERT_EQ (Tokens.size (), 6u ) << Tokens;
482+ EXPECT_TOKEN (Tokens[1 ], tok::identifier, TT_ClassHeadName);
482483 EXPECT_TOKEN (Tokens[2 ], tok::l_brace, TT_ClassLBrace);
483484 EXPECT_TOKEN (Tokens[3 ], tok::r_brace, TT_ClassRBrace);
484485
485486 Tokens = annotate (" const class C {} c;" );
486487 ASSERT_EQ (Tokens.size (), 8u ) << Tokens;
488+ EXPECT_TOKEN (Tokens[2 ], tok::identifier, TT_ClassHeadName);
487489 EXPECT_TOKEN (Tokens[3 ], tok::l_brace, TT_ClassLBrace);
488490 EXPECT_TOKEN (Tokens[4 ], tok::r_brace, TT_ClassRBrace);
489491
@@ -494,41 +496,48 @@ TEST_F(TokenAnnotatorTest, UnderstandsClasses) {
494496
495497 Tokens = annotate (" class [[deprecated(\"\" )]] C { int i; };" );
496498 ASSERT_EQ (Tokens.size (), 17u ) << Tokens;
499+ EXPECT_TOKEN (Tokens[9 ], tok::identifier, TT_ClassHeadName);
497500 EXPECT_TOKEN (Tokens[10 ], tok::l_brace, TT_ClassLBrace);
498501 EXPECT_TOKEN (Tokens[14 ], tok::r_brace, TT_ClassRBrace);
499502}
500503
501504TEST_F (TokenAnnotatorTest, UnderstandsStructs) {
502505 auto Tokens = annotate (" struct S {};" );
503506 ASSERT_EQ (Tokens.size (), 6u ) << Tokens;
507+ EXPECT_TOKEN (Tokens[1 ], tok::identifier, TT_ClassHeadName);
504508 EXPECT_TOKEN (Tokens[2 ], tok::l_brace, TT_StructLBrace);
505509 EXPECT_TOKEN (Tokens[3 ], tok::r_brace, TT_StructRBrace);
506510
507511 Tokens = annotate (" struct macro(a) S {};" );
508512 ASSERT_EQ (Tokens.size (), 10u ) << Tokens;
513+ EXPECT_TOKEN (Tokens[5 ], tok::identifier, TT_ClassHeadName);
509514 EXPECT_TOKEN (Tokens[6 ], tok::l_brace, TT_StructLBrace);
510515 EXPECT_TOKEN (Tokens[7 ], tok::r_brace, TT_StructRBrace);
511516
512517 Tokens = annotate (" struct EXPORT_MACRO [[nodiscard]] C { int i; };" );
513518 ASSERT_EQ (Tokens.size (), 15u ) << Tokens;
519+ EXPECT_TOKEN (Tokens[7 ], tok::identifier, TT_ClassHeadName);
514520 EXPECT_TOKEN (Tokens[8 ], tok::l_brace, TT_StructLBrace);
515521 EXPECT_TOKEN (Tokens[12 ], tok::r_brace, TT_StructRBrace);
516522
517523 Tokens = annotate (" struct [[deprecated]] [[nodiscard]] C { int i; };" );
518524 ASSERT_EQ (Tokens.size (), 19u ) << Tokens;
525+ EXPECT_TOKEN (Tokens[11 ], tok::identifier, TT_ClassHeadName);
519526 EXPECT_TOKEN (Tokens[12 ], tok::l_brace, TT_StructLBrace);
520527 EXPECT_TOKEN (Tokens[16 ], tok::r_brace, TT_StructRBrace);
521528
522529 Tokens = annotate (" struct macro(a) S {\n "
523530 " void f(T &t);\n "
524531 " };" );
525532 ASSERT_EQ (Tokens.size (), 18u ) << Tokens;
533+ EXPECT_TOKEN (Tokens[5 ], tok::identifier, TT_ClassHeadName);
526534 EXPECT_TOKEN (Tokens[6 ], tok::l_brace, TT_StructLBrace);
527535 EXPECT_TOKEN (Tokens[11 ], tok::amp, TT_PointerOrReference);
528536 EXPECT_TOKEN (Tokens[15 ], tok::r_brace, TT_StructRBrace);
529537
530538 Tokens = annotate (" template <typename T> struct S<const T[N]> {};" );
531539 ASSERT_EQ (Tokens.size (), 18u ) << Tokens;
540+ EXPECT_TOKEN (Tokens[6 ], tok::identifier, TT_ClassHeadName);
532541 EXPECT_TOKEN (Tokens[7 ], tok::less, TT_TemplateOpener);
533542 EXPECT_TOKEN (Tokens[10 ], tok::l_square, TT_ArraySubscriptLSquare);
534543 EXPECT_TOKEN (Tokens[13 ], tok::greater, TT_TemplateCloser);
@@ -537,6 +546,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsStructs) {
537546
538547 Tokens = annotate (" template <typename T> struct S<T const[N]> {};" );
539548 ASSERT_EQ (Tokens.size (), 18u ) << Tokens;
549+ EXPECT_TOKEN (Tokens[6 ], tok::identifier, TT_ClassHeadName);
540550 EXPECT_TOKEN (Tokens[7 ], tok::less, TT_TemplateOpener);
541551 EXPECT_TOKEN (Tokens[10 ], tok::l_square, TT_ArraySubscriptLSquare);
542552 EXPECT_TOKEN (Tokens[13 ], tok::greater, TT_TemplateCloser);
@@ -547,6 +557,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsStructs) {
547557 " void f(T const (&a)[n]);\n "
548558 " };" );
549559 ASSERT_EQ (Tokens.size (), 35u ) << Tokens;
560+ EXPECT_TOKEN (Tokens[9 ], tok::identifier, TT_ClassHeadName);
550561 EXPECT_TOKEN (Tokens[10 ], tok::less, TT_TemplateOpener);
551562 EXPECT_TOKEN (Tokens[13 ], tok::l_square, TT_ArraySubscriptLSquare);
552563 EXPECT_TOKEN (Tokens[16 ], tok::greater, TT_TemplateCloser);
@@ -558,12 +569,24 @@ TEST_F(TokenAnnotatorTest, UnderstandsStructs) {
558569
559570 Tokens = annotate (" template <typename T, enum E e> struct S {};" );
560571 ASSERT_EQ (Tokens.size (), 15u ) << Tokens;
572+ EXPECT_TOKEN (Tokens[10 ], tok::identifier, TT_ClassHeadName);
561573 EXPECT_TOKEN (Tokens[11 ], tok::l_brace, TT_StructLBrace);
562574
575+ Tokens = annotate (
576+ " template <> struct __declspec(foo) Op<Bar *> : OpImpl<Bar *> {};" );
577+ ASSERT_EQ (Tokens.size (), 23u ) << Tokens;
578+ EXPECT_TOKEN (Tokens[5 ], tok::l_paren, TT_AttributeLParen);
579+ EXPECT_TOKEN (Tokens[7 ], tok::r_paren, TT_AttributeRParen);
580+ EXPECT_TOKEN (Tokens[8 ], tok::identifier, TT_ClassHeadName);
581+ EXPECT_TOKEN (Tokens[13 ], tok::colon, TT_InheritanceColon);
582+ EXPECT_TOKEN (Tokens[19 ], tok::l_brace, TT_StructLBrace);
583+ EXPECT_TOKEN (Tokens[20 ], tok::r_brace, TT_StructRBrace);
584+
563585 constexpr StringRef Code{" struct EXPORT StructName {};" };
564586
565587 Tokens = annotate (Code);
566588 ASSERT_EQ (Tokens.size (), 7u ) << Tokens;
589+ EXPECT_TOKEN (Tokens[2 ], tok::identifier, TT_ClassHeadName);
567590 EXPECT_TOKEN (Tokens[3 ], tok::l_brace, TT_StructLBrace);
568591 EXPECT_TOKEN (Tokens[4 ], tok::r_brace, TT_StructRBrace);
569592
@@ -572,18 +595,21 @@ TEST_F(TokenAnnotatorTest, UnderstandsStructs) {
572595 Tokens = annotate (Code, Style);
573596 ASSERT_EQ (Tokens.size (), 7u ) << Tokens;
574597 EXPECT_TOKEN (Tokens[1 ], tok::identifier, TT_AttributeMacro);
598+ EXPECT_TOKEN (Tokens[2 ], tok::identifier, TT_ClassHeadName);
575599 EXPECT_TOKEN (Tokens[3 ], tok::l_brace, TT_StructLBrace);
576600 EXPECT_TOKEN (Tokens[4 ], tok::r_brace, TT_StructRBrace);
577601}
578602
579603TEST_F (TokenAnnotatorTest, UnderstandsUnions) {
580604 auto Tokens = annotate (" union U {};" );
581605 ASSERT_EQ (Tokens.size (), 6u ) << Tokens;
606+ EXPECT_TOKEN (Tokens[1 ], tok::identifier, TT_ClassHeadName);
582607 EXPECT_TOKEN (Tokens[2 ], tok::l_brace, TT_UnionLBrace);
583608 EXPECT_TOKEN (Tokens[3 ], tok::r_brace, TT_UnionRBrace);
584609
585610 Tokens = annotate (" union U { void f() { return; } };" );
586611 ASSERT_EQ (Tokens.size (), 14u ) << Tokens;
612+ EXPECT_TOKEN (Tokens[1 ], tok::identifier, TT_ClassHeadName);
587613 EXPECT_TOKEN (Tokens[2 ], tok::l_brace, TT_UnionLBrace);
588614 EXPECT_TOKEN (Tokens[7 ], tok::l_brace, TT_FunctionLBrace);
589615 EXPECT_TOKEN (Tokens[11 ], tok::r_brace, TT_UnionRBrace);
@@ -716,8 +742,10 @@ TEST_F(TokenAnnotatorTest, UnderstandsTemplateTemplateParameters) {
716742 EXPECT_TOKEN (Tokens[11 ], tok::less, TT_TemplateOpener);
717743 EXPECT_TOKEN (Tokens[14 ], tok::greater, TT_TemplateCloser);
718744 EXPECT_FALSE (Tokens[14 ]->ClosesTemplateDeclaration );
745+ EXPECT_TOKEN (Tokens[16 ], tok::identifier, TT_Unknown);
719746 EXPECT_TOKEN (Tokens[21 ], tok::greater, TT_TemplateCloser);
720747 EXPECT_TRUE (Tokens[21 ]->ClosesTemplateDeclaration );
748+ EXPECT_TOKEN (Tokens[23 ], tok::identifier, TT_ClassHeadName);
721749}
722750
723751TEST_F (TokenAnnotatorTest, UnderstandsWhitespaceSensitiveMacros) {
@@ -800,6 +828,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsCasts) {
800828
801829 Tokens = annotate (" return (struct foo){};" );
802830 ASSERT_EQ (Tokens.size (), 9u ) << Tokens;
831+ EXPECT_TOKEN (Tokens[3 ], tok::identifier, TT_Unknown);
803832 EXPECT_TOKEN (Tokens[4 ], tok::r_paren, TT_CastRParen);
804833
805834 Tokens = annotate (" #define FOO(bar) foo((uint64_t)&bar)" );
@@ -1169,6 +1198,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) {
11691198 EXPECT_EQ (Tokens[32 ]->FakeRParens , 1u );
11701199 EXPECT_TOKEN (Tokens[33 ], tok::r_paren, TT_Unknown);
11711200 EXPECT_TRUE (Tokens[33 ]->ClosesRequiresClause );
1201+ EXPECT_TOKEN (Tokens[35 ], tok::identifier, TT_Unknown);
11721202
11731203 Tokens = annotate (" template <typename T>\n "
11741204 " void foo(T) noexcept requires Bar<T>;" );
@@ -1250,6 +1280,8 @@ TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) {
12501280 " return number_zero_v<T>; }\n "
12511281 " };" );
12521282 ASSERT_EQ (Tokens.size (), 44u ) << Tokens;
1283+ EXPECT_TOKEN (Tokens[6 ], tok::identifier, TT_ClassHeadName);
1284+ EXPECT_TOKEN (Tokens[11 ], tok::identifier, TT_Unknown);
12531285 EXPECT_TOKEN (Tokens[13 ], tok::kw_requires, TT_RequiresClause);
12541286 EXPECT_TOKEN (Tokens[14 ], tok::kw_requires, TT_RequiresExpression);
12551287 EXPECT_TOKEN (Tokens[15 ], tok::l_brace, TT_RequiresExpressionLBrace);
@@ -1261,6 +1293,8 @@ TEST_F(TokenAnnotatorTest, UnderstandsRequiresClausesAndConcepts) {
12611293 annotate (" template <class A, class B> concept C ="
12621294 " std::same_as<std::iter_value_t<A>, std::iter_value_t<B>>;" );
12631295 ASSERT_EQ (Tokens.size (), 31u ) << Tokens;
1296+ EXPECT_TOKEN (Tokens[3 ], tok::identifier, TT_Unknown);
1297+ EXPECT_TOKEN (Tokens[6 ], tok::identifier, TT_Unknown);
12641298 EXPECT_TOKEN (Tokens[8 ], tok::kw_concept, TT_Unknown);
12651299 EXPECT_TOKEN (Tokens[14 ], tok::less, TT_TemplateOpener);
12661300 EXPECT_TOKEN (Tokens[18 ], tok::less, TT_TemplateOpener);
@@ -1877,6 +1911,7 @@ TEST_F(TokenAnnotatorTest, UnderstandsLambdas) {
18771911 ASSERT_EQ (Tokens.size (), 12u ) << Tokens;
18781912 EXPECT_TOKEN (Tokens[0 ], tok::l_square, TT_LambdaLSquare);
18791913 EXPECT_TOKEN (Tokens[2 ], tok::arrow, TT_LambdaArrow);
1914+ EXPECT_TOKEN (Tokens[4 ], tok::identifier, TT_Unknown);
18801915 EXPECT_TOKEN (Tokens[5 ], tok::l_brace, TT_LambdaLBrace);
18811916
18821917 Tokens = annotate (" foo([&](u32 bar) __attribute__((attr)) -> void {});" );
@@ -2757,6 +2792,7 @@ TEST_F(TokenAnnotatorTest, UnderstandTableGenTokens) {
27572792
27582793 // Structured statements.
27592794 Tokens = Annotate (" class Foo {}" );
2795+ EXPECT_TOKEN (Tokens[1 ], tok::identifier, TT_StartOfName);
27602796 EXPECT_TOKEN (Tokens[2 ], tok::l_brace, TT_FunctionLBrace);
27612797 Tokens = Annotate (" def Def: Foo {}" );
27622798 EXPECT_TOKEN (Tokens[2 ], tok::colon, TT_InheritanceColon);
@@ -3222,6 +3258,7 @@ TEST_F(TokenAnnotatorTest, BraceKind) {
32223258
32233259 Tokens = annotate (" class Foo<int> f() {}" );
32243260 ASSERT_EQ (Tokens.size (), 11u ) << Tokens;
3261+ EXPECT_TOKEN (Tokens[1 ], tok::identifier, TT_Unknown);
32253262 EXPECT_TOKEN (Tokens[5 ], tok::identifier, TT_FunctionDeclarationName);
32263263 EXPECT_TOKEN (Tokens[6 ], tok::l_paren, TT_FunctionDeclarationLParen);
32273264 EXPECT_TOKEN (Tokens[8 ], tok::l_brace, TT_FunctionLBrace);
@@ -3230,6 +3267,7 @@ TEST_F(TokenAnnotatorTest, BraceKind) {
32303267
32313268 Tokens = annotate (" template <typename T> class Foo<T> f() {}" );
32323269 ASSERT_EQ (Tokens.size (), 16u ) << Tokens;
3270+ EXPECT_TOKEN (Tokens[6 ], tok::identifier, TT_Unknown);
32333271 EXPECT_TOKEN (Tokens[10 ], tok::identifier, TT_FunctionDeclarationName);
32343272 EXPECT_TOKEN (Tokens[11 ], tok::l_paren, TT_FunctionDeclarationLParen);
32353273 EXPECT_TOKEN (Tokens[13 ], tok::l_brace, TT_FunctionLBrace);
@@ -3340,36 +3378,45 @@ TEST_F(TokenAnnotatorTest, BraceKind) {
33403378
33413379 Tokens = annotate (" struct ::Foo {};" );
33423380 ASSERT_EQ (Tokens.size (), 7u ) << Tokens;
3381+ EXPECT_TOKEN (Tokens[2 ], tok::identifier, TT_ClassHeadName);
33433382 EXPECT_BRACE_KIND (Tokens[3 ], BK_Block);
33443383 EXPECT_BRACE_KIND (Tokens[4 ], BK_Block);
33453384
33463385 Tokens = annotate (" struct NS::Foo {};" );
33473386 ASSERT_EQ (Tokens.size (), 8u ) << Tokens;
3387+ EXPECT_TOKEN (Tokens[1 ], tok::identifier, TT_Unknown);
3388+ EXPECT_TOKEN (Tokens[3 ], tok::identifier, TT_ClassHeadName);
33483389 EXPECT_BRACE_KIND (Tokens[4 ], BK_Block);
33493390 EXPECT_BRACE_KIND (Tokens[5 ], BK_Block);
33503391
33513392 Tokens = annotate (" struct Foo<int> {};" );
33523393 ASSERT_EQ (Tokens.size (), 9u ) << Tokens;
3394+ EXPECT_TOKEN (Tokens[1 ], tok::identifier, TT_ClassHeadName);
33533395 EXPECT_BRACE_KIND (Tokens[5 ], BK_Block);
33543396 EXPECT_BRACE_KIND (Tokens[6 ], BK_Block);
33553397
33563398 Tokens = annotate (" struct Foo<int>::Bar {};" );
33573399 ASSERT_EQ (Tokens.size (), 11u ) << Tokens;
3400+ EXPECT_TOKEN (Tokens[1 ], tok::identifier, TT_Unknown);
3401+ EXPECT_TOKEN (Tokens[6 ], tok::identifier, TT_ClassHeadName);
33583402 EXPECT_BRACE_KIND (Tokens[7 ], BK_Block);
33593403 EXPECT_BRACE_KIND (Tokens[8 ], BK_Block);
33603404
33613405 Tokens = annotate (" struct Foo<int> : Base {};" );
33623406 ASSERT_EQ (Tokens.size (), 11u ) << Tokens;
3407+ EXPECT_TOKEN (Tokens[1 ], tok::identifier, TT_ClassHeadName);
33633408 EXPECT_BRACE_KIND (Tokens[7 ], BK_Block);
33643409 EXPECT_BRACE_KIND (Tokens[8 ], BK_Block);
33653410
33663411 Tokens = annotate (" struct Foo final {};" );
33673412 ASSERT_EQ (Tokens.size (), 7u ) << Tokens;
3413+ EXPECT_TOKEN (Tokens[1 ], tok::identifier, TT_ClassHeadName);
33683414 EXPECT_BRACE_KIND (Tokens[3 ], BK_Block);
33693415 EXPECT_BRACE_KIND (Tokens[4 ], BK_Block);
33703416
33713417 Tokens = annotate (" struct [[foo]] [[bar]] Foo final : Base1, Base2 {};" );
33723418 ASSERT_EQ (Tokens.size (), 21u ) << Tokens;
3419+ EXPECT_TOKEN (Tokens[11 ], tok::identifier, TT_ClassHeadName);
33733420 EXPECT_BRACE_KIND (Tokens[17 ], BK_Block);
33743421 EXPECT_BRACE_KIND (Tokens[18 ], BK_Block);
33753422
@@ -3405,6 +3452,7 @@ TEST_F(TokenAnnotatorTest, BraceKind) {
34053452 " #endif\n "
34063453 " };" );
34073454 ASSERT_EQ (Tokens.size (), 29u ) << Tokens;
3455+ EXPECT_TOKEN (Tokens[8 ], tok::identifier, TT_ClassHeadName);
34083456 EXPECT_BRACE_KIND (Tokens[11 ], BK_Block);
34093457 EXPECT_BRACE_KIND (Tokens[17 ], BK_Block);
34103458 EXPECT_BRACE_KIND (Tokens[22 ], BK_Block);
@@ -3456,6 +3504,7 @@ TEST_F(TokenAnnotatorTest, BraceKind) {
34563504 Tokens = annotate (" a = class extends goog.a {};" ,
34573505 getGoogleStyle (FormatStyle::LK_JavaScript));
34583506 ASSERT_EQ (Tokens.size (), 11u ) << Tokens;
3507+ EXPECT_TOKEN (Tokens[3 ], tok::identifier, TT_Unknown);
34593508 EXPECT_TOKEN (Tokens[7 ], tok::l_brace, TT_ClassLBrace);
34603509 EXPECT_BRACE_KIND (Tokens[7 ], BK_Block);
34613510 EXPECT_TOKEN (Tokens[8 ], tok::r_brace, TT_ClassRBrace);
@@ -3464,6 +3513,7 @@ TEST_F(TokenAnnotatorTest, BraceKind) {
34643513 Tokens = annotate (" a = class Foo extends goog.a {};" ,
34653514 getGoogleStyle (FormatStyle::LK_JavaScript));
34663515 ASSERT_EQ (Tokens.size (), 12u ) << Tokens;
3516+ EXPECT_TOKEN (Tokens[3 ], tok::identifier, TT_ClassHeadName);
34673517 EXPECT_TOKEN (Tokens[4 ], tok::identifier, TT_Unknown); // Not TT_StartOfName
34683518 EXPECT_TOKEN (Tokens[8 ], tok::l_brace, TT_ClassLBrace);
34693519 EXPECT_BRACE_KIND (Tokens[8 ], BK_Block);
@@ -3473,6 +3523,8 @@ TEST_F(TokenAnnotatorTest, BraceKind) {
34733523 Tokens = annotate (" #define FOO(X) \\\n "
34743524 " struct X##_tag_ {};" );
34753525 ASSERT_EQ (Tokens.size (), 14u ) << Tokens;
3526+ EXPECT_TOKEN (Tokens[7 ], tok::identifier, TT_Unknown);
3527+ EXPECT_TOKEN (Tokens[9 ], tok::identifier, TT_ClassHeadName);
34763528 EXPECT_TOKEN (Tokens[10 ], tok::l_brace, TT_StructLBrace);
34773529 EXPECT_BRACE_KIND (Tokens[10 ], BK_Block);
34783530 EXPECT_TOKEN (Tokens[11 ], tok::r_brace, TT_StructRBrace);
@@ -3483,6 +3535,7 @@ TEST_F(TokenAnnotatorTest, BraceKind) {
34833535 " void f() { return; } \\\n "
34843536 " };" );
34853537 ASSERT_EQ (Tokens.size (), 20u ) << Tokens;
3538+ EXPECT_TOKEN (Tokens[4 ], tok::identifier, TT_ClassHeadName);
34863539 EXPECT_TOKEN (Tokens[8 ], tok::l_brace, TT_StructLBrace);
34873540 EXPECT_BRACE_KIND (Tokens[8 ], BK_Block);
34883541 EXPECT_TOKEN (Tokens[10 ], tok::identifier, TT_FunctionDeclarationName);
0 commit comments