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 | 88a16a07909b4187296bf53158eb2f7a8d989516 (patch) | |
| tree | 1eee683e8a30366b228d59cdb9fae2bfec17dcd8 /clang/lib | |
| parent | 9d1d0c4c5747bbeca0df0a8e6d37b018d24ecd91 (diff) | |
| download | bcm5719-llvm-88a16a07909b4187296bf53158eb2f7a8d989516.tar.gz bcm5719-llvm-88a16a07909b4187296bf53158eb2f7a8d989516.zip | |
[ASTMatchers] Introduce a matcher for matching any given Objective-C selector
Incudes a tiny related refactoring.
Differential Revision: https://reviews.llvm.org/D44858
llvm-svn: 328747
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/ASTMatchers/ASTMatchersInternal.cpp | 28 | ||||
| -rw-r--r-- | clang/lib/ASTMatchers/Dynamic/Registry.cpp | 1 |
2 files changed, 25 insertions, 4 deletions
diff --git a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp index 0bcdd8e3280..5351ffee54c 100644 --- a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp +++ b/clang/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/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp index fd373bca561..afc5f6a9b87 100644 --- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/clang/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); |

