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/AST/ExprConcepts.h"
14#include "clang/ASTMatchers/ASTMatchers.h"
20 return Node.isRelationalOp();
26 std::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())));
53 if (isa<CXXNoexceptExpr>(
Node) || isa<RequiresExpr>(
Node))
55 if (
const auto *UnaryExpr = dyn_cast<UnaryExprOrTypeTraitExpr>(&
Node)) {
56 switch (UnaryExpr->getKind()) {
64 if (
const auto *TypeIDExpr = dyn_cast<CXXTypeidExpr>(&
Node))
65 return !TypeIDExpr->isPotentiallyEvaluated();
77 NameList.begin(), NameList.end(), std::back_inserter(NameMatchers),
78 [](
const llvm::StringRef
Name) { return NameMatcher(Name); });
81 const NamedDecl &Node, ast_matchers::internal::ASTMatchFinder *Finder,
82 ast_matchers::internal::BoundNodesTreeBuilder *
Builder)
const override {
83 return llvm::any_of(NameMatchers, [&
Node](
const NameMatcher &NM) {
84 return NM.match(
Node);
91 enum class MatchMode {
105 NameMatcher(
const llvm::StringRef Regex)
106 : Regex(Regex), Mode(determineMatchMode(Regex)) {}
108 bool match(
const NamedDecl &ND)
const {
110 case MatchMode::MatchQualified:
111 return Regex.match(ND.getQualifiedNameAsString());
112 case MatchMode::MatchFullyQualified:
113 return Regex.match(
"::" + ND.getQualifiedNameAsString());
115 if (
const IdentifierInfo *II = ND.getIdentifier())
116 return Regex.match(II->getName());
122 MatchMode determineMatchMode(llvm::StringRef Regex) {
123 if (Regex.startswith(
":") || Regex.startswith(
"^:")) {
124 return MatchMode::MatchFullyQualified;
126 return Regex.contains(
":") ? MatchMode::MatchQualified
127 : MatchMode::MatchUnqualified;
131 std::vector<NameMatcher> NameMatchers;
137inline ::clang::ast_matchers::internal::Matcher<NamedDecl>
139 return ::clang::ast_matchers::internal::makeMatcher(
146 operator()(
const clang::ast_matchers::internal::BoundNodesMap &Nodes)
const;
157 ID, ::clang::DynTypedNode::create(
Node), &(Finder->getASTContext())};
158 return Builder->removeBindings(Predicate);
169 const QualType &Node, ast_matchers::internal::ASTMatchFinder *Finder,
170 ast_matchers::internal::BoundNodesTreeBuilder *
Builder)
const override;
173 std::vector<llvm::Regex> NameMatchers;
177inline ::clang::ast_matchers::internal::Matcher<QualType>
179 return ::clang::ast_matchers::internal::makeMatcher(
CodeCompletionBuilder Builder
::clang::DynTypedNode Node
MatchesAnyListedNameMatcher(llvm::ArrayRef< StringRef > NameList)
bool matches(const NamedDecl &Node, ast_matchers::internal::ASTMatchFinder *Finder, ast_matchers::internal::BoundNodesTreeBuilder *Builder) const override
~MatchesAnyListedTypeNameMatcher() override
bool matches(const QualType &Node, ast_matchers::internal::ASTMatchFinder *Finder, ast_matchers::internal::BoundNodesTreeBuilder *Builder) const override
AST_MATCHER_P(Stmt, isStatementIdenticalToBoundNode, std::string, ID)
AST_MATCHER(BinaryOperator, isRelationalOperator)
AST_MATCHER_FUNCTION(ast_matchers::TypeMatcher, isReferenceToConst)
inline ::clang::ast_matchers::internal::Matcher< NamedDecl > matchesAnyListedName(llvm::ArrayRef< StringRef > NameList)
inline ::clang::ast_matchers::internal::Matcher< QualType > matchesAnyListedTypeName(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.
bool operator()(const clang::ast_matchers::internal::BoundNodesMap &Nodes) const
::clang::DynTypedNode Node