[clang-format] CSharp don't allow there not to be a space between `is` and `[`
authormydeveloperday <mydeveloperday@gmail.com>
Mon, 17 Apr 2023 18:38:53 +0000 (19:38 +0100)
committermydeveloperday <mydeveloperday@gmail.com>
Mon, 17 Apr 2023 18:38:53 +0000 (19:38 +0100)
as `is` is a keyword in C# ensure there is always a space before the `[` regardless of `SpaceBeforeSquareBrackets` setting

Fixes: #61965

https://github.com/llvm/llvm-project/issues/61965

Reviewed By: owenpan, HazardyKnusperkeks

Differential Revision: https://reviews.llvm.org/D148472

clang/lib/Format/TokenAnnotator.cpp
clang/unittests/Format/FormatTestCSharp.cpp

index 28e21f9..8b00b1c 100644 (file)
@@ -3917,6 +3917,8 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line,
       }
     }
   }
+  if (Style.isCSharp() && Left.is(Keywords.kw_is) && Right.is(tok::l_square))
+    return true;
   const auto SpaceRequiredForArrayInitializerLSquare =
       [](const FormatToken &LSquareTok, const FormatStyle &Style) {
         return Style.SpacesInContainerLiterals ||
index 1928a0d..9f91262 100644 (file)
@@ -1176,6 +1176,14 @@ foreach ((A a, B b) in someList) {
   verifyFormat(R"(override (string name, int age) methodTuple() {})", Style);
   verifyFormat(R"(async (string name, int age) methodTuple() {})", Style);
   verifyFormat(R"(unsafe (string name, int age) methodTuple() {})", Style);
+
+  Style.SpacesInSquareBrackets = false;
+  Style.SpaceBeforeSquareBrackets = true;
+  verifyFormat("return a is [1, 2, 3];", Style);
+  verifyFormat("return a is [..];", Style);
+  Style.SpaceBeforeSquareBrackets = false;
+  verifyFormat("return a is [1, 2, 3];", Style);
+  verifyFormat("return a is [..];", Style);
 }
 
 TEST_F(FormatTestCSharp, CSharpNullableTypes) {