Skip to content

Commit f3590c1

Browse files
authored
[Clang][ASTMatcher] Add a matcher for the name of a DependentScopeDeclRefExpr (#121656)
Add the `hasDependentName` matcher to match the name of `DependentScopeDeclRefExpr` Fixes #121610
1 parent 510263a commit f3590c1

File tree

5 files changed

+45
-0
lines changed

5 files changed

+45
-0
lines changed

Diff for: clang/docs/LibASTMatchersReference.html

+13
Original file line numberDiff line numberDiff line change
@@ -3449,6 +3449,19 @@ <h2 id="narrowing-matchers">Narrowing Matchers</h2>
34493449
</pre></td></tr>
34503450

34513451

3452+
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentScopeDeclRefExpr.html">DependentScopeDeclRefExpr</a>&gt;</td><td class="name" onclick="toggle('hasDependentName0')"><a name="hasDependentName0Anchor">hasDependentName</a></td><td>std::string N</td></tr>
3453+
<tr><td colspan="4" class="doc" id="hasDependentName0"><pre>Matches the dependent name of a DependentScopeDeclRefExpr.
3454+
3455+
Matches the dependent name of a DependentScopeDeclRefExpr
3456+
3457+
Given:
3458+
3459+
template &lt;class T&lt; class X : T { void f() { T::v; } };
3460+
3461+
dependentScopeDeclRefExpr(hasDependentName("v")) matches `T::v`
3462+
</pre></td></tr>
3463+
3464+
34523465
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1CXXDependentScopeMemberExpr.html">CXXDependentScopeMemberExpr</a>&gt;</td><td class="name" onclick="toggle('memberHasSameNameAsBoundNode0')"><a name="memberHasSameNameAsBoundNode0Anchor">memberHasSameNameAsBoundNode</a></td><td>std::string BindingID</td></tr>
34533466
<tr><td colspan="4" class="doc" id="memberHasSameNameAsBoundNode0"><pre>Matches template-dependent, but known, member names against an already-bound
34543467
node

Diff for: clang/docs/ReleaseNotes.rst

+2
Original file line numberDiff line numberDiff line change
@@ -1116,6 +1116,8 @@ AST Matchers
11161116

11171117
- Add ``dependentTemplateSpecializationType`` matcher to match a dependent template specialization type.
11181118

1119+
- Add ``hasDependentName`` matcher to match the dependent name of a DependentScopeDeclRefExpr.
1120+
11191121
clang-format
11201122
------------
11211123

Diff for: clang/include/clang/ASTMatchers/ASTMatchers.h

+11
Original file line numberDiff line numberDiff line change
@@ -3257,6 +3257,17 @@ AST_MATCHER_P(CXXDependentScopeMemberExpr, memberHasSameNameAsBoundNode,
32573257
});
32583258
}
32593259

3260+
/// Matches the dependent name of a DependentScopeDeclRefExpr
3261+
///
3262+
/// Given:
3263+
/// \code
3264+
/// template <class T> class X : T { void f() { T::v; } };
3265+
/// \endcode
3266+
/// \c dependentScopeDeclRefExpr(hasDependentName("v")) matches `T::v`
3267+
AST_MATCHER_P(DependentScopeDeclRefExpr, hasDependentName, std::string, N) {
3268+
return Node.getDeclName().getAsString() == N;
3269+
}
3270+
32603271
/// Matches C++ classes that are directly or indirectly derived from a class
32613272
/// matching \c Base, or Objective-C classes that directly or indirectly
32623273
/// subclass a class matching \c Base.

Diff for: clang/lib/ASTMatchers/Dynamic/Registry.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ RegistryMaps::RegistryMaps() {
314314
REGISTER_MATCHER(hasDeducedType);
315315
REGISTER_MATCHER(hasDefaultArgument);
316316
REGISTER_MATCHER(hasDefinition);
317+
REGISTER_MATCHER(hasDependentName);
317318
REGISTER_MATCHER(hasDescendant);
318319
REGISTER_MATCHER(hasDestinationType);
319320
REGISTER_MATCHER(hasDirectBase);

Diff for: clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -2235,6 +2235,24 @@ TEST_P(ASTMatchersTest, ArgumentCountIs_CXXConstructExpr) {
22352235
Constructor1Arg));
22362236
}
22372237

2238+
TEST_P(ASTMatchersTest, HasDependentName_DependentScopeDeclRefExpr) {
2239+
if (!GetParam().isCXX() || GetParam().hasDelayedTemplateParsing()) {
2240+
// FIXME: Fix this test to work with delayed template parsing.
2241+
return;
2242+
}
2243+
2244+
EXPECT_TRUE(matches("template <class T> class X : T { void f() { T::v; } };",
2245+
dependentScopeDeclRefExpr(hasDependentName("v"))));
2246+
2247+
EXPECT_TRUE(matches("template <typename T> struct S { static T Foo; };"
2248+
"template <typename T> void x() { (void)S<T>::Foo; }",
2249+
dependentScopeDeclRefExpr(hasDependentName("Foo"))));
2250+
2251+
EXPECT_TRUE(matches("template <typename T> struct S { static T foo(); };"
2252+
"template <typename T> void x() { S<T>::foo(); }",
2253+
dependentScopeDeclRefExpr(hasDependentName("foo"))));
2254+
}
2255+
22382256
TEST(ASTMatchersTest, NamesMember_CXXDependentScopeMemberExpr) {
22392257

22402258
// Member functions:

0 commit comments

Comments
 (0)