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_muddul...@apple.com> Date: Tue, 19 Nov 2024 14:50:24 -0800 Subject: [PATCH 1/2] [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_muddul...@apple.com> Date: Wed, 20 Nov 2024 10:46:06 -0800 Subject: [PATCH 2/2] 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) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits