[clang] [clang-format] Correctly annotate C# nullable value type `?` (PR #138631)
via cfe-commits
cfe-commits at lists.llvm.org
Mon May 5 21:46:26 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-format
Author: Owen Pan (owenca)
<details>
<summary>Changes</summary>
Fix #<!-- -->78666
---
Full diff: https://github.com/llvm/llvm-project/pull/138631.diff
2 Files Affected:
- (modified) clang/lib/Format/TokenAnnotator.cpp (+5-15)
- (modified) clang/unittests/Format/TokenAnnotatorTest.cpp (+13)
``````````diff
diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp
index caf386cffd25b..7257debe94fd5 100644
--- a/clang/lib/Format/TokenAnnotator.cpp
+++ b/clang/lib/Format/TokenAnnotator.cpp
@@ -1719,22 +1719,12 @@ class AnnotatingParser {
break;
}
if (Style.isCSharp()) {
- // `Type?)`, `Type?>`, `Type? name;` and `Type? name =` can only be
+ // `Type?)`, `Type?>`, `Type? name;`, and `Type? name =` can only be
// nullable types.
-
- // `Type?)`, `Type?>`, `Type? name;`
- if (Tok->Next &&
- (Tok->Next->startsSequence(tok::question, tok::r_paren) ||
- Tok->Next->startsSequence(tok::question, tok::greater) ||
- Tok->Next->startsSequence(tok::question, tok::identifier,
- tok::semi))) {
- Tok->setType(TT_CSharpNullable);
- break;
- }
-
- // `Type? name =`
- if (Tok->Next && Tok->Next->is(tok::identifier) && Tok->Next->Next &&
- Tok->Next->Next->is(tok::equal)) {
+ if (const auto *Next = Tok->getNextNonComment();
+ Next && (Next->isOneOf(tok::r_paren, tok::greater) ||
+ Next->startsSequence(tok::identifier, tok::semi) ||
+ Next->startsSequence(tok::identifier, tok::equal))) {
Tok->setType(TT_CSharpNullable);
break;
}
diff --git a/clang/unittests/Format/TokenAnnotatorTest.cpp b/clang/unittests/Format/TokenAnnotatorTest.cpp
index 0fb64ceec5c97..03214edc35e44 100644
--- a/clang/unittests/Format/TokenAnnotatorTest.cpp
+++ b/clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -3106,6 +3106,19 @@ TEST_F(TokenAnnotatorTest, CSharpNullableTypes) {
ASSERT_EQ(Tokens.size(), 4u) << Tokens;
EXPECT_TOKEN(Tokens[1], tok::question, TT_CSharpNullable);
+ Tokens = annotate("{\n"
+ " int? a;\n"
+ " if (b is int?)\n"
+ " f();\n"
+ " var foo = A<Foo?>();\n"
+ "}",
+ Style);
+ ASSERT_EQ(Tokens.size(), 29u) << Tokens;
+ EXPECT_TOKEN(Tokens[2], tok::question, TT_CSharpNullable);
+ EXPECT_TOKEN(Tokens[10], tok::question, TT_CSharpNullable);
+ EXPECT_TOKEN(Tokens[20], tok::less, TT_TemplateOpener);
+ EXPECT_TOKEN(Tokens[22], tok::question, TT_CSharpNullable);
+
Tokens = annotate("cond? id : id2", Style);
ASSERT_EQ(Tokens.size(), 6u) << Tokens;
EXPECT_TOKEN(Tokens[1], tok::question, TT_ConditionalExpr);
``````````
</details>
https://github.com/llvm/llvm-project/pull/138631
More information about the cfe-commits
mailing list