Skip to content

Commit b1e6c4b

Browse files
authored
[clang-format] Correctly annotate C# nullable value type ? (#138631)
Fix #78666
1 parent 17ea830 commit b1e6c4b

File tree

2 files changed

+18
-15
lines changed

2 files changed

+18
-15
lines changed

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1720,22 +1720,12 @@ class AnnotatingParser {
17201720
break;
17211721
}
17221722
if (Style.isCSharp()) {
1723-
// `Type?)`, `Type?>`, `Type? name;` and `Type? name =` can only be
1723+
// `Type?)`, `Type?>`, `Type? name;`, and `Type? name =` can only be
17241724
// nullable types.
1725-
1726-
// `Type?)`, `Type?>`, `Type? name;`
1727-
if (Tok->Next &&
1728-
(Tok->Next->startsSequence(tok::question, tok::r_paren) ||
1729-
Tok->Next->startsSequence(tok::question, tok::greater) ||
1730-
Tok->Next->startsSequence(tok::question, tok::identifier,
1731-
tok::semi))) {
1732-
Tok->setType(TT_CSharpNullable);
1733-
break;
1734-
}
1735-
1736-
// `Type? name =`
1737-
if (Tok->Next && Tok->Next->is(tok::identifier) && Tok->Next->Next &&
1738-
Tok->Next->Next->is(tok::equal)) {
1725+
if (const auto *Next = Tok->getNextNonComment();
1726+
Next && (Next->isOneOf(tok::r_paren, tok::greater) ||
1727+
Next->startsSequence(tok::identifier, tok::semi) ||
1728+
Next->startsSequence(tok::identifier, tok::equal))) {
17391729
Tok->setType(TT_CSharpNullable);
17401730
break;
17411731
}

clang/unittests/Format/TokenAnnotatorTest.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3106,6 +3106,19 @@ TEST_F(TokenAnnotatorTest, CSharpNullableTypes) {
31063106
ASSERT_EQ(Tokens.size(), 4u) << Tokens;
31073107
EXPECT_TOKEN(Tokens[1], tok::question, TT_CSharpNullable);
31083108

3109+
Tokens = annotate("{\n"
3110+
" int? a;\n"
3111+
" if (b is int?)\n"
3112+
" f();\n"
3113+
" var foo = A<Foo?>();\n"
3114+
"}",
3115+
Style);
3116+
ASSERT_EQ(Tokens.size(), 29u) << Tokens;
3117+
EXPECT_TOKEN(Tokens[2], tok::question, TT_CSharpNullable);
3118+
EXPECT_TOKEN(Tokens[10], tok::question, TT_CSharpNullable);
3119+
EXPECT_TOKEN(Tokens[20], tok::less, TT_TemplateOpener);
3120+
EXPECT_TOKEN(Tokens[22], tok::question, TT_CSharpNullable);
3121+
31093122
Tokens = annotate("cond? id : id2", Style);
31103123
ASSERT_EQ(Tokens.size(), 6u) << Tokens;
31113124
EXPECT_TOKEN(Tokens[1], tok::question, TT_ConditionalExpr);

0 commit comments

Comments
 (0)