Skip to content

Commit 38c31d7

Browse files
[clang-format][NFC] Annotate more r_braces
In preparation of #67906.
1 parent 86b44f3 commit 38c31d7

File tree

3 files changed

+28
-6
lines changed

3 files changed

+28
-6
lines changed

clang/lib/Format/FormatToken.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ namespace format {
4242
TYPE(CaseLabelColon) \
4343
TYPE(CastRParen) \
4444
TYPE(ClassLBrace) \
45+
TYPE(ClassRBrace) \
4546
/* ternary ?: expression */ \
4647
TYPE(ConditionalExpr) \
4748
/* the condition in an if statement */ \
@@ -125,6 +126,7 @@ namespace format {
125126
TYPE(PureVirtualSpecifier) \
126127
TYPE(RangeBasedForLoopColon) \
127128
TYPE(RecordLBrace) \
129+
TYPE(RecordRBrace) \
128130
TYPE(RegexLiteral) \
129131
TYPE(RequiresClause) \
130132
TYPE(RequiresClauseInARequiresExpression) \
@@ -141,6 +143,7 @@ namespace format {
141143
* braces need to be added to split it. Not used for other languages. */ \
142144
TYPE(StringInConcatenation) \
143145
TYPE(StructLBrace) \
146+
TYPE(StructRBrace) \
144147
TYPE(StructuredBindingLSquare) \
145148
TYPE(TemplateCloser) \
146149
TYPE(TemplateOpener) \
@@ -153,6 +156,7 @@ namespace format {
153156
TYPE(TypenameMacro) \
154157
TYPE(UnaryOperator) \
155158
TYPE(UnionLBrace) \
159+
TYPE(UnionRBrace) \
156160
TYPE(UntouchableMacroFunc) \
157161
/* Like in 'assign x = 0, y = 1;' . */ \
158162
TYPE(VerilogAssignComma) \

clang/lib/Format/UnwrappedLineParser.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3920,21 +3920,23 @@ void UnwrappedLineParser::parseRecord(bool ParseAsExpr) {
39203920
} while (!eof());
39213921
}
39223922

3923-
auto GetBraceType = [](const FormatToken &RecordTok) {
3923+
auto GetBraceTypes =
3924+
[](const FormatToken &RecordTok) -> std::pair<TokenType, TokenType> {
39243925
switch (RecordTok.Tok.getKind()) {
39253926
case tok::kw_class:
3926-
return TT_ClassLBrace;
3927+
return {TT_ClassLBrace, TT_ClassRBrace};
39273928
case tok::kw_struct:
3928-
return TT_StructLBrace;
3929+
return {TT_StructLBrace, TT_StructRBrace};
39293930
case tok::kw_union:
3930-
return TT_UnionLBrace;
3931+
return {TT_UnionLBrace, TT_UnionRBrace};
39313932
default:
39323933
// Useful for e.g. interface.
3933-
return TT_RecordLBrace;
3934+
return {TT_RecordLBrace, TT_RecordRBrace};
39343935
}
39353936
};
39363937
if (FormatTok->is(tok::l_brace)) {
3937-
FormatTok->setFinalizedType(GetBraceType(InitialToken));
3938+
auto [OpenBraceType, ClosingBraceType] = GetBraceTypes(InitialToken);
3939+
FormatTok->setFinalizedType(OpenBraceType);
39383940
if (ParseAsExpr) {
39393941
parseChildBlock();
39403942
} else {
@@ -3944,6 +3946,10 @@ void UnwrappedLineParser::parseRecord(bool ParseAsExpr) {
39443946
unsigned AddLevels = Style.IndentAccessModifiers ? 2u : 1u;
39453947
parseBlock(/*MustBeDeclaration=*/true, AddLevels, /*MunchSemi=*/false);
39463948
}
3949+
if (auto Prev = FormatTok->getPreviousNonComment();
3950+
Prev && Prev->is(tok::r_brace)) {
3951+
Prev->setFinalizedType(ClosingBraceType);
3952+
}
39473953
}
39483954
// There is no addUnwrappedLine() here so that we fall through to parsing a
39493955
// structural element afterwards. Thus, in "class A {} n, m;",

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,46 +393,55 @@ TEST_F(TokenAnnotatorTest, UnderstandsClasses) {
393393
auto Tokens = annotate("class C {};");
394394
EXPECT_EQ(Tokens.size(), 6u) << Tokens;
395395
EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_ClassLBrace);
396+
EXPECT_TOKEN(Tokens[3], tok::r_brace, TT_ClassRBrace);
396397

397398
Tokens = annotate("const class C {} c;");
398399
EXPECT_EQ(Tokens.size(), 8u) << Tokens;
399400
EXPECT_TOKEN(Tokens[3], tok::l_brace, TT_ClassLBrace);
401+
EXPECT_TOKEN(Tokens[4], tok::r_brace, TT_ClassRBrace);
400402

401403
Tokens = annotate("const class {} c;");
402404
EXPECT_EQ(Tokens.size(), 7u) << Tokens;
403405
EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_ClassLBrace);
406+
EXPECT_TOKEN(Tokens[3], tok::r_brace, TT_ClassRBrace);
404407

405408
Tokens = annotate("class [[deprecated(\"\")]] C { int i; };");
406409
EXPECT_EQ(Tokens.size(), 17u) << Tokens;
407410
EXPECT_TOKEN(Tokens[10], tok::l_brace, TT_ClassLBrace);
411+
EXPECT_TOKEN(Tokens[14], tok::r_brace, TT_ClassRBrace);
408412
}
409413

410414
TEST_F(TokenAnnotatorTest, UnderstandsStructs) {
411415
auto Tokens = annotate("struct S {};");
412416
EXPECT_EQ(Tokens.size(), 6u) << Tokens;
413417
EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_StructLBrace);
418+
EXPECT_TOKEN(Tokens[3], tok::r_brace, TT_StructRBrace);
414419

415420
Tokens = annotate("struct EXPORT_MACRO [[nodiscard]] C { int i; };");
416421
EXPECT_EQ(Tokens.size(), 15u) << Tokens;
417422
EXPECT_TOKEN(Tokens[8], tok::l_brace, TT_StructLBrace);
423+
EXPECT_TOKEN(Tokens[12], tok::r_brace, TT_StructRBrace);
418424

419425
Tokens = annotate("struct [[deprecated]] [[nodiscard]] C { int i; };");
420426
EXPECT_EQ(Tokens.size(), 19u) << Tokens;
421427
EXPECT_TOKEN(Tokens[12], tok::l_brace, TT_StructLBrace);
428+
EXPECT_TOKEN(Tokens[16], tok::r_brace, TT_StructRBrace);
422429

423430
Tokens = annotate("template <typename T> struct S<const T[N]> {};");
424431
EXPECT_EQ(Tokens.size(), 18u) << Tokens;
425432
EXPECT_TOKEN(Tokens[7], tok::less, TT_TemplateOpener);
426433
EXPECT_TOKEN(Tokens[10], tok::l_square, TT_ArraySubscriptLSquare);
427434
EXPECT_TOKEN(Tokens[13], tok::greater, TT_TemplateCloser);
428435
EXPECT_TOKEN(Tokens[14], tok::l_brace, TT_StructLBrace);
436+
EXPECT_TOKEN(Tokens[15], tok::r_brace, TT_StructRBrace);
429437

430438
Tokens = annotate("template <typename T> struct S<T const[N]> {};");
431439
EXPECT_EQ(Tokens.size(), 18u) << Tokens;
432440
EXPECT_TOKEN(Tokens[7], tok::less, TT_TemplateOpener);
433441
EXPECT_TOKEN(Tokens[10], tok::l_square, TT_ArraySubscriptLSquare);
434442
EXPECT_TOKEN(Tokens[13], tok::greater, TT_TemplateCloser);
435443
EXPECT_TOKEN(Tokens[14], tok::l_brace, TT_StructLBrace);
444+
EXPECT_TOKEN(Tokens[15], tok::r_brace, TT_StructRBrace);
436445

437446
Tokens = annotate("template <typename T, unsigned n> struct S<T const[n]> {\n"
438447
" void f(T const (&a)[n]);\n"
@@ -445,17 +454,20 @@ TEST_F(TokenAnnotatorTest, UnderstandsStructs) {
445454
EXPECT_TOKEN(Tokens[23], tok::l_paren, TT_FunctionTypeLParen);
446455
EXPECT_TOKEN(Tokens[24], tok::amp, TT_UnaryOperator);
447456
EXPECT_TOKEN(Tokens[27], tok::l_square, TT_ArraySubscriptLSquare);
457+
EXPECT_TOKEN(Tokens[32], tok::r_brace, TT_StructRBrace);
448458
}
449459

450460
TEST_F(TokenAnnotatorTest, UnderstandsUnions) {
451461
auto Tokens = annotate("union U {};");
452462
EXPECT_EQ(Tokens.size(), 6u) << Tokens;
453463
EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_UnionLBrace);
464+
EXPECT_TOKEN(Tokens[3], tok::r_brace, TT_UnionRBrace);
454465

455466
Tokens = annotate("union U { void f() { return; } };");
456467
EXPECT_EQ(Tokens.size(), 14u) << Tokens;
457468
EXPECT_TOKEN(Tokens[2], tok::l_brace, TT_UnionLBrace);
458469
EXPECT_TOKEN(Tokens[7], tok::l_brace, TT_FunctionLBrace);
470+
EXPECT_TOKEN(Tokens[11], tok::r_brace, TT_UnionRBrace);
459471
}
460472

461473
TEST_F(TokenAnnotatorTest, UnderstandsEnums) {

0 commit comments

Comments
 (0)