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"
19 return Node.isRelationalOp();
22AST_MATCHER(BinaryOperator, isEqualityOperator) {
return Node.isEqualityOp(); }
25 std::optional<bool> IsExpensive =
27 return IsExpensive && *IsExpensive;
32 Node, Finder->getASTContext());
41 using namespace ast_matchers;
42 return referenceType(pointee(qualType(isConstQualified())));
47 using namespace ast_matchers;
48 return pointerType(pointee(qualType(isConstQualified())));
59 NameList.begin(), NameList.end(), std::back_inserter(NameMatchers),
60 [](
const llvm::StringRef
Name) { return NameMatcher(Name); });
63 const NamedDecl &Node, ast_matchers::internal::ASTMatchFinder *Finder,
64 ast_matchers::internal::BoundNodesTreeBuilder *
Builder)
const override {
65 return llvm::any_of(NameMatchers, [&Node](
const NameMatcher &NM) {
66 return NM.match(Node);
73 enum class MatchMode {
87 NameMatcher(
const llvm::StringRef Regex)
88 : Regex(Regex), Mode(determineMatchMode(Regex)) {}
90 bool match(
const NamedDecl &ND)
const {
92 case MatchMode::MatchQualified:
93 return Regex.match(ND.getQualifiedNameAsString());
94 case MatchMode::MatchFullyQualified:
95 return Regex.match(
"::" + ND.getQualifiedNameAsString());
97 return Regex.match(ND.getName());
102 MatchMode determineMatchMode(llvm::StringRef Regex) {
103 if (Regex.startswith(
":") || Regex.startswith(
"^:")) {
104 return MatchMode::MatchFullyQualified;
106 return Regex.contains(
":") ? MatchMode::MatchQualified
107 : MatchMode::MatchUnqualified;
111 std::vector<NameMatcher> NameMatchers;
117inline ::clang::ast_matchers::internal::Matcher<NamedDecl>
119 return ::clang::ast_matchers::internal::makeMatcher(
CodeCompletionBuilder Builder
MatchesAnyListedNameMatcher(llvm::ArrayRef< StringRef > NameList)
bool matches(const NamedDecl &Node, ast_matchers::internal::ASTMatchFinder *Finder, ast_matchers::internal::BoundNodesTreeBuilder *Builder) const override
AST_MATCHER(BinaryOperator, isRelationalOperator)
AST_MATCHER_FUNCTION(ast_matchers::TypeMatcher, isReferenceToConst)
inline ::clang::ast_matchers::internal::Matcher< NamedDecl > matchesAnyListedName(llvm::ArrayRef< StringRef > NameList)
bool recordIsTriviallyDefaultConstructible(const RecordDecl &RecordDecl, const ASTContext &Context)
Returns true if RecordDecl is trivially default constructible.
std::optional< bool > isExpensiveToCopy(QualType Type, const ASTContext &Context)
Returns true if Type is expensive to copy.
bool isTriviallyDestructible(QualType Type)
Returns true if Type is trivially destructible.