owenpan created this revision.
owenpan added reviewers: HazardyKnusperkeks, curdeius, MyDeveloperDay.
owenpan added a project: clang-format.
Herald added a project: All.
owenpan requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D129982

Files:
  clang/unittests/Format/TokenAnnotatorTest.cpp

Index: clang/unittests/Format/TokenAnnotatorTest.cpp
===================================================================
--- clang/unittests/Format/TokenAnnotatorTest.cpp
+++ clang/unittests/Format/TokenAnnotatorTest.cpp
@@ -549,259 +549,107 @@
 }
 
 TEST_F(TokenAnnotatorTest, RequiresDoesNotChangeParsingOfTheRest) {
-  auto NumberOfAdditionalRequiresClauseTokens = 5u;
-  auto NumberOfTokensBeforeRequires = 5u;
-
-  auto BaseTokens = annotate("template<typename T>\n"
-                             "T Pi = 3.14;");
-  auto ConstrainedTokens = annotate("template<typename T>\n"
-                                    "  requires Foo<T>\n"
-                                    "T Pi = 3.14;");
-
-  auto NumberOfBaseTokens = 11u;
-
-  ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
-  ASSERT_EQ(ConstrainedTokens.size(),
-            NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
-      << ConstrainedTokens;
-
-  for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
-    if (I < NumberOfTokensBeforeRequires) {
-      EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
-    } else {
-      EXPECT_EQ(*BaseTokens[I],
-                *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
-          << I;
+  StringRef Requires;
+  StringRef Prefix;
+  StringRef Suffix;
+  auto RequiresTokenCount = 0u;
+  auto PrefixTokenCount = 0u;
+  auto SuffixTokenCount = 0u;
+
+  auto TestRequires = [&](int Line) {
+    const auto BaseTokenCount = PrefixTokenCount + SuffixTokenCount;
+
+    auto BaseCode = std::string(Prefix);
+    BaseCode += Suffix;
+    auto BaseTokens = annotate(BaseCode);
+
+    auto ConstrainedCode = std::string(Prefix);
+    ConstrainedCode += Requires;
+    ConstrainedCode += Suffix;
+    auto ConstrainedTokens = annotate(ConstrainedCode);
+
+    ASSERT_EQ(BaseTokens.size(), BaseTokenCount)
+        << BaseTokens << " (Line " << Line << ')';
+    ASSERT_EQ(ConstrainedTokens.size(), BaseTokenCount + RequiresTokenCount)
+        << ConstrainedTokens << " (Line " << Line << ')';
+
+    for (auto I = 0u; I < BaseTokenCount; ++I) {
+      EXPECT_EQ(
+          *BaseTokens[I],
+          *ConstrainedTokens[I < PrefixTokenCount ? I : I + RequiresTokenCount])
+          << I << " (Line " << Line << ')';
     }
-  }
-
-  BaseTokens = annotate("template<typename T>\n"
-                        "struct Bar;");
-  ConstrainedTokens = annotate("template<typename T>\n"
-                               "  requires Foo<T>\n"
-                               "struct Bar;");
-  NumberOfBaseTokens = 9u;
-
-  ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
-  ASSERT_EQ(ConstrainedTokens.size(),
-            NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
-      << ConstrainedTokens;
-
-  for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
-    if (I < NumberOfTokensBeforeRequires) {
-      EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
-    } else {
-      EXPECT_EQ(*BaseTokens[I],
-                *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
-          << I;
-    }
-  }
-
-  BaseTokens = annotate("template<typename T>\n"
-                        "struct Bar {"
-                        "  T foo();\n"
-                        "  T bar();\n"
-                        "};");
-  ConstrainedTokens = annotate("template<typename T>\n"
-                               "  requires Foo<T>\n"
-                               "struct Bar {"
-                               "  T foo();\n"
-                               "  T bar();\n"
-                               "};");
-  NumberOfBaseTokens = 21u;
-
-  ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
-  ASSERT_EQ(ConstrainedTokens.size(),
-            NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
-      << ConstrainedTokens;
-
-  for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
-    if (I < NumberOfTokensBeforeRequires) {
-      EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
-    } else {
-      EXPECT_EQ(*BaseTokens[I],
-                *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
-          << I;
-    }
-  }
-
-  BaseTokens = annotate("template<typename T>\n"
-                        "Bar(T) -> Bar<T>;");
-  ConstrainedTokens = annotate("template<typename T>\n"
-                               "  requires Foo<T>\n"
-                               "Bar(T) -> Bar<T>;");
-  NumberOfBaseTokens = 16u;
-
-  ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
-  ASSERT_EQ(ConstrainedTokens.size(),
-            NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
-      << ConstrainedTokens;
-
-  for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
-    if (I < NumberOfTokensBeforeRequires) {
-      EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
-    } else {
-      EXPECT_EQ(*BaseTokens[I],
-                *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
-          << I;
-    }
-  }
-
-  BaseTokens = annotate("template<typename T>\n"
-                        "T foo();");
-  ConstrainedTokens = annotate("template<typename T>\n"
-                               "  requires Foo<T>\n"
-                               "T foo();");
-  NumberOfBaseTokens = 11u;
-
-  ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
-  ASSERT_EQ(ConstrainedTokens.size(),
-            NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
-      << ConstrainedTokens;
-
-  for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
-    if (I < NumberOfTokensBeforeRequires) {
-      EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
-    } else {
-      EXPECT_EQ(*BaseTokens[I],
-                *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
-          << I;
-    }
-  }
-
-  BaseTokens = annotate("template<typename T>\n"
-                        "T foo() {\n"
-                        "  auto bar = baz();\n"
-                        "  return bar + T{};\n"
-                        "}");
-  ConstrainedTokens = annotate("template<typename T>\n"
-                               "  requires Foo<T>\n"
-                               "T foo() {\n"
-                               "  auto bar = baz();\n"
-                               "  return bar + T{};\n"
-                               "}");
-  NumberOfBaseTokens = 26u;
-
-  ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
-  ASSERT_EQ(ConstrainedTokens.size(),
-            NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
-      << ConstrainedTokens;
-
-  for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
-    if (I < NumberOfTokensBeforeRequires) {
-      EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
-    } else {
-      EXPECT_EQ(*BaseTokens[I],
-                *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
-          << I;
-    }
-  }
-
-  BaseTokens = annotate("template<typename T>\n"
-                        "T foo();");
-  ConstrainedTokens = annotate("template<typename T>\n"
-                               "T foo() requires Foo<T>;");
-  NumberOfBaseTokens = 11u;
-  NumberOfTokensBeforeRequires = 9u;
-
-  ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
-  ASSERT_EQ(ConstrainedTokens.size(),
-            NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
-      << ConstrainedTokens;
-
-  for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
-    if (I < NumberOfTokensBeforeRequires) {
-      EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
-    } else {
-      EXPECT_EQ(*BaseTokens[I],
-                *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
-          << I;
-    }
-  }
-
-  BaseTokens = annotate("template<typename T>\n"
-                        "T foo() {\n"
-                        "  auto bar = baz();\n"
-                        "  return bar + T{};\n"
-                        "}");
-  ConstrainedTokens = annotate("template<typename T>\n"
-                               "T foo() requires Foo<T> {\n"
-                               "  auto bar = baz();\n"
-                               "  return bar + T{};\n"
-                               "}");
-  NumberOfBaseTokens = 26u;
-
-  ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
-  ASSERT_EQ(ConstrainedTokens.size(),
-            NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
-      << ConstrainedTokens;
-
-  for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
-    if (I < NumberOfTokensBeforeRequires) {
-      EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
-    } else {
-      EXPECT_EQ(*BaseTokens[I],
-                *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
-          << I;
-    }
-  }
-
-  BaseTokens = annotate("template<typename T>\n"
-                        "Bar(T) -> Bar<typename T::I>;");
-  ConstrainedTokens = annotate("template<typename T>\n"
-                               "  requires requires(T &&t) {\n"
-                               "             typename T::I;\n"
-                               "           }\n"
-                               "Bar(T) -> Bar<typename T::I>;");
-  NumberOfBaseTokens = 19u;
-  NumberOfAdditionalRequiresClauseTokens = 14u;
-  NumberOfTokensBeforeRequires = 5u;
-
-  ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
-  ASSERT_EQ(ConstrainedTokens.size(),
-            NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
-      << ConstrainedTokens;
-
-  for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
-    if (I < NumberOfTokensBeforeRequires) {
-      EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
-    } else {
-      EXPECT_EQ(*BaseTokens[I],
-                *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
-          << I;
-    }
-  }
-
-  BaseTokens = annotate("struct [[nodiscard]] zero_t {\n"
-                        "  template<class T>\n"
-                        "  [[nodiscard]] constexpr operator T() const { "
-                        "return number_zero_v<T>; }\n"
-                        "};");
-
-  ConstrainedTokens = annotate("struct [[nodiscard]] zero_t {\n"
-                               "  template<class T>\n"
-                               "    requires requires { number_zero_v<T>; }\n"
-                               "  [[nodiscard]] constexpr operator T() const { "
-                               "return number_zero_v<T>; }\n"
-                               "};");
-  NumberOfBaseTokens = 35u;
-  NumberOfAdditionalRequiresClauseTokens = 9u;
-  NumberOfTokensBeforeRequires = 13u;
-
-  ASSERT_EQ(BaseTokens.size(), NumberOfBaseTokens) << BaseTokens;
-  ASSERT_EQ(ConstrainedTokens.size(),
-            NumberOfBaseTokens + NumberOfAdditionalRequiresClauseTokens)
-      << ConstrainedTokens;
-
-  for (auto I = 0u; I < NumberOfBaseTokens; ++I) {
-    if (I < NumberOfTokensBeforeRequires) {
-      EXPECT_EQ(*BaseTokens[I], *ConstrainedTokens[I]) << I;
-    } else {
-      EXPECT_EQ(*BaseTokens[I],
-                *ConstrainedTokens[I + NumberOfAdditionalRequiresClauseTokens])
-          << I;
-    }
-  }
+  };
+
+  Requires = "  requires Foo<T>\n";
+  Prefix = "template<typename T>\n";
+  Suffix = "T Pi = 3.14;";
+  RequiresTokenCount = 5;
+  PrefixTokenCount = 5;
+  SuffixTokenCount = 6;
+  TestRequires(__LINE__);
+
+  Suffix = "struct Bar;";
+  SuffixTokenCount = 4;
+  TestRequires(__LINE__);
+
+  Suffix = "struct Bar {\n"
+           "  T foo();\n"
+           "  T bar();\n"
+           "};";
+  SuffixTokenCount = 16;
+  TestRequires(__LINE__);
+
+  Suffix = "Bar(T) -> Bar<T>;";
+  SuffixTokenCount = 11;
+  TestRequires(__LINE__);
+
+  Suffix = "T foo();";
+  SuffixTokenCount = 6;
+  TestRequires(__LINE__);
+
+  Suffix = "T foo() {\n"
+           "  auto bar = baz();\n"
+           "  return bar + T{};\n"
+           "}";
+  SuffixTokenCount = 21;
+  TestRequires(__LINE__);
+
+  Requires = " requires Foo<T>";
+  Prefix = "template<typename T>\n"
+           "T foo()";
+  Suffix = ";";
+  PrefixTokenCount = 9;
+  SuffixTokenCount = 2;
+  TestRequires(__LINE__);
+
+  Suffix = " {\n"
+           "  auto bar = baz();\n"
+           "  return bar + T{};\n"
+           "}";
+  SuffixTokenCount = 17;
+  TestRequires(__LINE__);
+
+  Requires = "  requires requires(T &&t) {\n"
+             "             typename T::I;\n"
+             "           }\n";
+  Prefix = "template<typename T>\n";
+  Suffix = "Bar(T) -> Bar<typename T::I>;";
+  RequiresTokenCount = 14;
+  PrefixTokenCount = 5;
+  SuffixTokenCount = 14;
+  TestRequires(__LINE__);
+
+  Requires = "    requires requires { number_zero_v<T>; }\n";
+  Prefix = "struct [[nodiscard]] zero_t {\n"
+           "  template<class T>\n";
+  Suffix = "  [[nodiscard]] constexpr operator T() const { "
+           "return number_zero_v<T>; }\n"
+           "};";
+  RequiresTokenCount = 9;
+  PrefixTokenCount = 13;
+  SuffixTokenCount = 22;
+  TestRequires(__LINE__);
 }
 
 TEST_F(TokenAnnotatorTest, UnderstandsAsm) {
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to