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