diff --git a/clang-tools-extra/clang-tidy/objc/SuperSelfCheck.cpp b/clang-tools-extra/clang-tidy/objc/SuperSelfCheck.cpp --- a/clang-tools-extra/clang-tidy/objc/SuperSelfCheck.cpp +++ b/clang-tools-extra/clang-tidy/objc/SuperSelfCheck.cpp @@ -35,38 +35,25 @@ return Node.getMethodFamily() == OMF_init; } -/// \brief Matches Objective-C implementations of classes that directly or -/// indirectly have a superclass matching \c InterfaceDecl. -/// -/// Note that a class is not considered to be a subclass of itself. +/// \brief Matches Objective-C implementations with interfaces that match +/// \c Base. /// /// Example matches implementation declarations for Y and Z. -/// (matcher = objcInterfaceDecl(isSubclassOf(hasName("X")))) +/// (matcher = objcImplementationDecl(hasInterface(hasName("X")))) /// \code /// @interface X /// @end -/// @interface Y : X -/// @end -/// @implementation Y // directly derived -/// @end -/// @interface Z : Y +/// @implementation X /// @end -/// @implementation Z // indirectly derived +/// @interface Y +// @end +/// @implementation Y /// @end /// \endcode -AST_MATCHER_P(ObjCImplementationDecl, isSubclassOf, - ast_matchers::internal::Matcher, - InterfaceDecl) { - // Check if any of the superclasses of the class match. - for (const ObjCInterfaceDecl *SuperClass = - Node.getClassInterface()->getSuperClass(); - SuperClass != nullptr; SuperClass = SuperClass->getSuperClass()) { - if (InterfaceDecl.matches(*SuperClass, Finder, Builder)) - return true; - } - - // No matches found. - return false; +AST_MATCHER_P(ObjCImplementationDecl, hasInterface, + ast_matchers::internal::Matcher, Base) { + const ObjCInterfaceDecl *InterfaceDecl = Node.getClassInterface(); + return Base.matches(*InterfaceDecl, Finder, Builder); } /// \brief Matches Objective-C message expressions where the receiver is the @@ -93,11 +80,11 @@ return; Finder->addMatcher( - objcMessageExpr( - hasSelector("self"), isMessagingSuperInstance(), - hasAncestor(objcMethodDecl(isInitializer(), - hasDeclContext(objcImplementationDecl( - isSubclassOf(hasName("NSObject"))))))) + objcMessageExpr(hasSelector("self"), isMessagingSuperInstance(), + hasAncestor(objcMethodDecl( + isInitializer(), + hasDeclContext(objcImplementationDecl(hasInterface( + isDerivedFrom(hasName("NSObject")))))))) .bind("message"), this); }