[clang] [ASTMatchers] AST matcher support for ObjC pointers (PR #117021)
Rashmi Mudduluru via cfe-commits
cfe-commits at lists.llvm.org
Fri Nov 22 10:45:05 PST 2024
https://github.com/t-rasmud updated https://github.com/llvm/llvm-project/pull/117021
>From 87ba2a10ca7435fdf6b5c47d2c1c97c1e188cfcd Mon Sep 17 00:00:00 2001
From: Rashmi Mudduluru <r_mudduluru at apple.com>
Date: Tue, 19 Nov 2024 14:50:24 -0800
Subject: [PATCH 1/3] [ASTMatchers] AST matcher support for ObjC pointers
Add `ObjCInterfaceDecl` to the list of types supported by the `hasType` and `hasDeclaration` matchers,
`ObjCObjectPointerType` to the list of types supported by `pointee`.
---
clang/include/clang/ASTMatchers/ASTMatchers.h | 5 +++--
clang/include/clang/ASTMatchers/ASTMatchersInternal.h | 11 ++++++++++-
clang/lib/ASTMatchers/ASTMatchersInternal.cpp | 2 +-
.../ASTMatchers/ASTMatchersTraversalTest.cpp | 7 +++++++
4 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h
index 4bcaa953a61af2..dc6d60a1bcd17f 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchers.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -4033,7 +4033,7 @@ AST_POLYMORPHIC_MATCHER_P_OVERLOAD(
AST_POLYMORPHIC_MATCHER_P_OVERLOAD(
hasType,
AST_POLYMORPHIC_SUPPORTED_TYPES(Expr, FriendDecl, ValueDecl,
- CXXBaseSpecifier),
+ CXXBaseSpecifier, ObjCInterfaceDecl),
internal::Matcher<Decl>, InnerMatcher, 1) {
QualType QT = internal::getUnderlyingType(Node);
if (!QT.isNull())
@@ -7434,7 +7434,8 @@ extern const AstTypeMatcher<RValueReferenceType> rValueReferenceType;
AST_TYPELOC_TRAVERSE_MATCHER_DECL(
pointee, getPointee,
AST_POLYMORPHIC_SUPPORTED_TYPES(BlockPointerType, MemberPointerType,
- PointerType, ReferenceType));
+ PointerType, ReferenceType,
+ ObjCObjectPointerType));
/// Matches typedef types.
///
diff --git a/clang/include/clang/ASTMatchers/ASTMatchersInternal.h b/clang/include/clang/ASTMatchers/ASTMatchersInternal.h
index ab8b146453e761..2c690275dab71f 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchersInternal.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchersInternal.h
@@ -161,6 +161,9 @@ inline QualType getUnderlyingType(const FriendDecl &Node) {
inline QualType getUnderlyingType(const CXXBaseSpecifier &Node) {
return Node.getType();
}
+inline QualType getUnderlyingType(const ObjCInterfaceDecl &Node) {
+ return Node.getTypeForDecl()->getPointeeType();
+}
/// Unifies obtaining a `TypeSourceInfo` from different node types.
template <typename T,
@@ -1113,6 +1116,12 @@ class HasDeclarationMatcher : public MatcherInterface<T> {
return matchesDecl(Node.getDecl(), Finder, Builder);
}
+ bool matchesSpecialized(const ObjCInterfaceDecl &Node,
+ ASTMatchFinder *Finder,
+ BoundNodesTreeBuilder *Builder) const {
+ return matchesDecl(Node.getCanonicalDecl(), Finder, Builder);
+ }
+
/// Extracts the operator new of the new call and returns whether the
/// inner matcher matches on it.
bool matchesSpecialized(const CXXNewExpr &Node,
@@ -1213,7 +1222,7 @@ using HasDeclarationSupportedTypes =
ElaboratedType, InjectedClassNameType, LabelStmt, AddrLabelExpr,
MemberExpr, QualType, RecordType, TagType,
TemplateSpecializationType, TemplateTypeParmType, TypedefType,
- UnresolvedUsingType, ObjCIvarRefExpr>;
+ UnresolvedUsingType, ObjCIvarRefExpr, ObjCInterfaceDecl>;
/// A Matcher that allows binding the node it matches to an id.
///
diff --git a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp
index 46dd44e6f2b24f..8def98ff6dc328 100644
--- a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp
+++ b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp
@@ -1097,7 +1097,7 @@ AST_TYPELOC_TRAVERSE_MATCHER_DEF(hasValueType,
AST_TYPELOC_TRAVERSE_MATCHER_DEF(
pointee,
AST_POLYMORPHIC_SUPPORTED_TYPES(BlockPointerType, MemberPointerType,
- PointerType, ReferenceType));
+ PointerType, ReferenceType, ObjCObjectPointerType));
const internal::VariadicDynCastAllOfMatcher<Stmt, OMPExecutableDirective>
ompExecutableDirective;
diff --git a/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
index 1d18869a6b8afc..adf8749a642fc3 100644
--- a/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
+++ b/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
@@ -283,6 +283,13 @@ TEST(HasDeclaration, HasDeclarationOfTypeAlias) {
hasDeclaration(typeAliasTemplateDecl()))))))));
}
+TEST(HasDeclaration, HasDeclarationOfObjCInterface) {
+ EXPECT_TRUE(matchesObjC(
+ "@interface BaseClass @end void f() {BaseClass* b;}",
+ varDecl(hasType(objcObjectPointerType(pointee(hasDeclaration(
+ objcInterfaceDecl())))))));
+}
+
TEST(HasUnqualifiedDesugaredType, DesugarsUsing) {
EXPECT_TRUE(
matches("struct A {}; using B = A; B b;",
>From 055bf6348a74f0e2ffda94d18e7c2f7372d4719c Mon Sep 17 00:00:00 2001
From: Rashmi Mudduluru <r_mudduluru at apple.com>
Date: Wed, 20 Nov 2024 10:46:06 -0800
Subject: [PATCH 2/3] fix formatting
---
clang/include/clang/ASTMatchers/ASTMatchersInternal.h | 3 +--
clang/lib/ASTMatchers/ASTMatchersInternal.cpp | 3 ++-
clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp | 7 +++----
3 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/clang/include/clang/ASTMatchers/ASTMatchersInternal.h b/clang/include/clang/ASTMatchers/ASTMatchersInternal.h
index 2c690275dab71f..04804d5def0461 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchersInternal.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchersInternal.h
@@ -1116,8 +1116,7 @@ class HasDeclarationMatcher : public MatcherInterface<T> {
return matchesDecl(Node.getDecl(), Finder, Builder);
}
- bool matchesSpecialized(const ObjCInterfaceDecl &Node,
- ASTMatchFinder *Finder,
+ bool matchesSpecialized(const ObjCInterfaceDecl &Node, ASTMatchFinder *Finder,
BoundNodesTreeBuilder *Builder) const {
return matchesDecl(Node.getCanonicalDecl(), Finder, Builder);
}
diff --git a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp
index 8def98ff6dc328..d9749a2b14d403 100644
--- a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp
+++ b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp
@@ -1097,7 +1097,8 @@ AST_TYPELOC_TRAVERSE_MATCHER_DEF(hasValueType,
AST_TYPELOC_TRAVERSE_MATCHER_DEF(
pointee,
AST_POLYMORPHIC_SUPPORTED_TYPES(BlockPointerType, MemberPointerType,
- PointerType, ReferenceType, ObjCObjectPointerType));
+ PointerType, ReferenceType,
+ ObjCObjectPointerType));
const internal::VariadicDynCastAllOfMatcher<Stmt, OMPExecutableDirective>
ompExecutableDirective;
diff --git a/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
index adf8749a642fc3..75d6ca5ba17f8b 100644
--- a/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
+++ b/clang/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
@@ -284,10 +284,9 @@ TEST(HasDeclaration, HasDeclarationOfTypeAlias) {
}
TEST(HasDeclaration, HasDeclarationOfObjCInterface) {
- EXPECT_TRUE(matchesObjC(
- "@interface BaseClass @end void f() {BaseClass* b;}",
- varDecl(hasType(objcObjectPointerType(pointee(hasDeclaration(
- objcInterfaceDecl())))))));
+ EXPECT_TRUE(matchesObjC("@interface BaseClass @end void f() {BaseClass* b;}",
+ varDecl(hasType(objcObjectPointerType(
+ pointee(hasDeclaration(objcInterfaceDecl())))))));
}
TEST(HasUnqualifiedDesugaredType, DesugarsUsing) {
>From 12ea148cde267dfc2da4e22b9305894b2af8756d Mon Sep 17 00:00:00 2001
From: Rashmi Mudduluru <r_mudduluru at apple.com>
Date: Fri, 22 Nov 2024 10:44:48 -0800
Subject: [PATCH 3/3] Add release notes
---
clang/docs/ReleaseNotes.rst | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 6cdd7f0cdf46cc..849960c92a9224 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -885,6 +885,10 @@ AST Matchers
- Ensure ``hasName`` matches template specializations across inline namespaces,
making `matchesNodeFullSlow` and `matchesNodeFullFast` consistent.
+- Ensure ``hasType`` and ``hasDeclaration`` match Objective-C interface declarations.
+
+- Ensure ``pointee`` matches Objective-C pointer types.
+
clang-format
------------
More information about the cfe-commits
mailing list