diff options
author | George Karpenkov <ekarpenkov@apple.com> | 2018-03-29 00:51:12 +0000 |
---|---|---|
committer | George Karpenkov <ekarpenkov@apple.com> | 2018-03-29 00:51:12 +0000 |
commit | 8e76adccd4a0615ae685ba81fc796bfb2c3fbfa1 (patch) | |
tree | f0b0d9d424121f2e351f81fabd6b9432465951d6 /lib/ASTMatchers | |
parent | 9741fa736187b2a767137076e776aae421929cee (diff) |
[ASTMatchers] Introduce a matcher for matching any given Objective-C selector
Incudes a tiny related refactoring.
Differential Revision: https://reviews.llvm.org/D44858
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@328747 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ASTMatchers')
-rw-r--r-- | lib/ASTMatchers/ASTMatchersInternal.cpp | 28 | ||||
-rw-r--r-- | lib/ASTMatchers/Dynamic/Registry.cpp | 1 |
2 files changed, 25 insertions, 4 deletions
diff --git a/lib/ASTMatchers/ASTMatchersInternal.cpp b/lib/ASTMatchers/ASTMatchersInternal.cpp index 0bcdd8e328..5351ffee54 100644 --- a/lib/ASTMatchers/ASTMatchersInternal.cpp +++ b/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -315,12 +315,31 @@ bool AnyOfVariadicOperator(const ast_type_traits::DynTypedNode &DynNode, return false; } -Matcher<NamedDecl> hasAnyNameFunc(ArrayRef<const StringRef *> NameRefs) { +inline static +std::vector<std::string> vectorFromRefs(ArrayRef<const StringRef *> NameRefs) { std::vector<std::string> Names; for (auto *Name : NameRefs) Names.emplace_back(*Name); - return internal::Matcher<NamedDecl>( - new internal::HasNameMatcher(std::move(Names))); + return Names; +} + +Matcher<NamedDecl> hasAnyNameFunc(ArrayRef<const StringRef *> NameRefs) { + std::vector<std::string> Names = vectorFromRefs(NameRefs); + return internal::Matcher<NamedDecl>(new internal::HasNameMatcher(Names)); +} + +AST_MATCHER_P(ObjCMessageExpr, hasAnySelectorMatcher, std::vector<std::string>, + Matches) { + std::string SelString = Node.getSelector().getAsString(); + for (const std::string &S : Matches) + if (S == SelString) + return true; + return false; +} + +Matcher<ObjCMessageExpr> hasAnySelectorFunc( + ArrayRef<const StringRef *> NameRefs) { + return hasAnySelectorMatcher(vectorFromRefs(NameRefs)); } HasNameMatcher::HasNameMatcher(std::vector<std::string> N) @@ -393,7 +412,8 @@ public: /// Return true if there are still any patterns left. bool consumeNameSuffix(StringRef NodeName, bool CanSkip) { for (size_t I = 0; I < Patterns.size();) { - if (internal::consumeNameSuffix(Patterns[I].P, NodeName) || + if (::clang::ast_matchers::internal::consumeNameSuffix(Patterns[I].P, + NodeName) || CanSkip) { ++I; } else { diff --git a/lib/ASTMatchers/Dynamic/Registry.cpp b/lib/ASTMatchers/Dynamic/Registry.cpp index fd373bca56..afc5f6a9b8 100644 --- a/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/lib/ASTMatchers/Dynamic/Registry.cpp @@ -286,6 +286,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(hasReturnValue); REGISTER_MATCHER(hasRHS); REGISTER_MATCHER(hasSelector); + REGISTER_MATCHER(hasAnySelector); REGISTER_MATCHER(hasSingleDecl); REGISTER_MATCHER(hasSize); REGISTER_MATCHER(hasSizeExpr); |