Author: Amr Hesham Date: 2025-01-09T01:18:10-05:00 New Revision: 9ba6e8dc91920b6db40ee76f4fb22c71e9b9cd97
URL: https://github.com/llvm/llvm-project/commit/9ba6e8dc91920b6db40ee76f4fb22c71e9b9cd97 DIFF: https://github.com/llvm/llvm-project/commit/9ba6e8dc91920b6db40ee76f4fb22c71e9b9cd97.diff LOG: [Clang][ASTMatcher] Extend `hasDependentName` to match DependentNameType name (#121975) Extend `hasDependentName` to be a polymorphic matcher that matches the name of either `DependentNameType` or `DependentScopeDeclRefExpr` Added: Modified: clang/docs/LibASTMatchersReference.html clang/docs/ReleaseNotes.rst clang/include/clang/ASTMatchers/ASTMatchers.h clang/include/clang/ASTMatchers/ASTMatchersInternal.h clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp Removed: ################################################################################ diff --git a/clang/docs/LibASTMatchersReference.html b/clang/docs/LibASTMatchersReference.html index 18f9e7d6c0ea06..48dfd9cac00337 100644 --- a/clang/docs/LibASTMatchersReference.html +++ b/clang/docs/LibASTMatchersReference.html @@ -3462,6 +3462,21 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2> </pre></td></tr> +<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentNameType.html">DependentNameType</a>></td><td class="name" onclick="toggle('hasDependentName1')"><a name="hasDependentName1Anchor">hasDependentName</a></td><td>std::string N</td></tr> +<tr><td colspan="4" class="doc" id="hasDependentName1"><pre>Matches the dependent name of a DependentNameType. + +Matches the dependent name of a DependentNameType + +Given: + + template <typename T< struct declToImport { + typedef typename T::type dependent_name; + }; + +dependentNameType(hasDependentName("type")) matches `T::type` +</pre></td></tr> + + <tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>></td><td class="name" onclick="toggle('memberHasSameNameAsBoundNode0')"><a name="memberHasSameNameAsBoundNode0Anchor">memberHasSameNameAsBoundNode</a></td><td>std::string BindingID</td></tr> <tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound node diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 93915e5db7d131..2258452d07ec5a 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -1130,7 +1130,7 @@ AST Matchers - Add ``dependentTemplateSpecializationType`` matcher to match a dependent template specialization type. -- Add ``hasDependentName`` matcher to match the dependent name of a DependentScopeDeclRefExpr. +- Add ``hasDependentName`` matcher to match the dependent name of a DependentScopeDeclRefExpr or DependentNameType. clang-format ------------ diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h index f10135d7a901f1..f32170c93bee26 100644 --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -3257,15 +3257,27 @@ AST_MATCHER_P(CXXDependentScopeMemberExpr, memberHasSameNameAsBoundNode, }); } -/// Matches the dependent name of a DependentScopeDeclRefExpr +/// Matches the dependent name of a DependentScopeDeclRefExpr or +/// DependentNameType /// /// Given: /// \code /// template <class T> class X : T { void f() { T::v; } }; /// \endcode /// \c dependentScopeDeclRefExpr(hasDependentName("v")) matches `T::v` -AST_MATCHER_P(DependentScopeDeclRefExpr, hasDependentName, std::string, N) { - return Node.getDeclName().getAsString() == N; +/// +/// Given: +/// \code +/// template <typename T> struct declToImport { +/// typedef typename T::type dependent_name; +/// }; +/// \endcode +/// \c dependentNameType(hasDependentName("type")) matches `T::type` +AST_POLYMORPHIC_MATCHER_P(hasDependentName, + AST_POLYMORPHIC_SUPPORTED_TYPES( + DependentScopeDeclRefExpr, DependentNameType), + std::string, N) { + return internal::getDependentName(Node) == N; } /// Matches C++ classes that are directly or indirectly derived from a class @@ -7724,7 +7736,7 @@ AST_MATCHER_P(DecayedType, hasDecayedType, internal::Matcher<QualType>, /// Matches a dependent name type /// -/// Example matches T::type +/// Example matches T::type /// \code /// template <typename T> struct declToImport { /// typedef typename T::type dependent_name; diff --git a/clang/include/clang/ASTMatchers/ASTMatchersInternal.h b/clang/include/clang/ASTMatchers/ASTMatchersInternal.h index 04804d5def0461..1f7b5e7cac8465 100644 --- a/clang/include/clang/ASTMatchers/ASTMatchersInternal.h +++ b/clang/include/clang/ASTMatchers/ASTMatchersInternal.h @@ -2343,6 +2343,14 @@ MatchTemplateArgLocAt(const TemplateSpecializationTypeLoc &Node, InnerMatcher.matches(Node.getArgLoc(Index), Finder, Builder); } +inline std::string getDependentName(const DependentScopeDeclRefExpr &node) { + return node.getDeclName().getAsString(); +} + +inline std::string getDependentName(const DependentNameType &node) { + return node.getIdentifier()->getName().str(); +} + } // namespace internal } // namespace ast_matchers diff --git a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp index f3d953454173ca..92ec79d126575a 100644 --- a/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -2253,6 +2253,21 @@ TEST_P(ASTMatchersTest, HasDependentName_DependentScopeDeclRefExpr) { dependentScopeDeclRefExpr(hasDependentName("foo")))); } +TEST_P(ASTMatchersTest, HasDependentName_DependentNameType) { + if (!GetParam().isCXX()) { + // FIXME: Fix this test to work with delayed template parsing. + return; + } + + EXPECT_TRUE(matches( + R"( + template <typename T> struct declToImport { + typedef typename T::type dependent_name; + }; + )", + dependentNameType(hasDependentName("type")))); +} + TEST(ASTMatchersTest, NamesMember_CXXDependentScopeMemberExpr) { // Member functions: _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits