9 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_MATCHERS_H
10 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_MATCHERS_H
13 #include "clang/ASTMatchers/ASTMatchers.h"
20 return Node.isRelationalOp();
23 AST_MATCHER(BinaryOperator, isEqualityOperator) {
return Node.isEqualityOp(); }
26 llvm::Optional<bool> IsExpensive =
28 return IsExpensive && *IsExpensive;
33 Node, Finder->getASTContext());
42 using namespace ast_matchers;
43 return referenceType(pointee(qualType(isConstQualified())));
48 using namespace ast_matchers;
49 return pointerType(pointee(qualType(isConstQualified())));
56 :
public ast_matchers::internal::MatcherInterface<NamedDecl> {
60 NameList.begin(), NameList.end(), std::back_inserter(NameMatchers),
61 [](
const llvm::StringRef
Name) { return NameMatcher(Name); });
64 const NamedDecl &Node, ast_matchers::internal::ASTMatchFinder *Finder,
65 ast_matchers::internal::BoundNodesTreeBuilder *
Builder)
const override {
66 return llvm::any_of(NameMatchers, [&Node](
const NameMatcher &NM) {
67 return NM.match(Node);
74 enum class MatchMode {
88 NameMatcher(
const llvm::StringRef Regex)
89 : Regex(Regex), Mode(determineMatchMode(Regex)) {}
91 bool match(
const NamedDecl &ND)
const {
93 case MatchMode::MatchQualified:
94 return Regex.match(ND.getQualifiedNameAsString());
95 case MatchMode::MatchFullyQualified:
96 return Regex.match(
"::" + ND.getQualifiedNameAsString());
98 return Regex.match(ND.getName());
103 MatchMode determineMatchMode(llvm::StringRef Regex) {
104 if (Regex.startswith(
":") || Regex.startswith(
"^:")) {
105 return MatchMode::MatchFullyQualified;
107 return Regex.contains(
":") ? MatchMode::MatchQualified
108 : MatchMode::MatchUnqualified;
112 std::vector<NameMatcher> NameMatchers;
118 inline ::clang::ast_matchers::internal::Matcher<NamedDecl>
120 return ::clang::ast_matchers::internal::makeMatcher(
128 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_MATCHERS_H