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();
23AST_MATCHER(BinaryOperator, isEqualityOperator) {
return Node.isEqualityOp(); }
25AST_MATCHER(CXXMethodDecl, isStatic) {
return Node.isStatic(); }
28 return Node.isOverloadedOperator();
33AST_MATCHER(VarDecl, isLocalVarDecl) {
return Node.isLocalVarDecl(); }
35AST_MATCHER(Expr, isMacroID) {
return Node.getExprLoc().isMacroID(); }
38 std::optional<bool> IsExpensive =
40 return IsExpensive && *IsExpensive;
45 Node, Finder->getASTContext());
55 return referenceType(pointee(qualType(isConstQualified())));
61 return pointerType(pointee(qualType(isConstQualified())));
66 const auto *ActualType = Node.getTypePtr();
68 (ActualType->isSpecificBuiltinType(BuiltinType::Char_S) ||
69 ActualType->isSpecificBuiltinType(BuiltinType::Char_U));
73 if (isa<CXXNoexceptExpr>(Node) || isa<RequiresExpr>(Node))
75 if (
const auto *UnaryExpr = dyn_cast<UnaryExprOrTypeTraitExpr>(&Node)) {
76 switch (UnaryExpr->getKind()) {
84 if (
const auto *TypeIDExpr = dyn_cast<CXXTypeidExpr>(&Node))
85 return !TypeIDExpr->isPotentiallyEvaluated();
96 llvm::ArrayRef<StringRef> NameList) {
97 llvm::transform(NameList, std::back_inserter(NameMatchers),
98 [](
const StringRef Name) {
return NameMatcher(Name); });
103 enum class MatchMode {
118 : Regex(Regex), Mode(determineMatchMode(Regex)) {}
120 bool match(
const NamedDecl &ND)
const {
122 case MatchMode::MatchQualified:
123 return Regex.match(ND.getQualifiedNameAsString());
124 case MatchMode::MatchFullyQualified:
125 return Regex.match(
"::" + ND.getQualifiedNameAsString());
127 if (
const IdentifierInfo *II = ND.getIdentifier())
128 return Regex.match(II->getName());
134 MatchMode determineMatchMode(StringRef Regex) {
135 if (Regex.starts_with(
':') || Regex.starts_with(
"^:"))
136 return MatchMode::MatchFullyQualified;
137 return Regex.contains(
':') ? MatchMode::MatchQualified
138 : MatchMode::MatchUnqualified;
143 const NamedDecl &Node, ast_matchers::internal::ASTMatchFinder *Finder,
144 ast_matchers::internal::BoundNodesTreeBuilder *Builder)
const override {
145 return llvm::any_of(NameMatchers, [&Node](
const NameMatcher &NM) {
146 return NM.
match(Node);
151 std::vector<NameMatcher> NameMatchers;
157inline ::clang::ast_matchers::internal::Matcher<NamedDecl>
159 return ::clang::ast_matchers::internal::Matcher(
166 operator()(
const clang::ast_matchers::internal::BoundNodesMap &Nodes)
const;
177 ID, ::clang::DynTypedNode::create(Node), &Finder->getASTContext()};
178 return Builder->removeBindings(Predicate);
187 bool CanonicalTypes);
190 const QualType &Node, ast_matchers::internal::ASTMatchFinder *Finder,
191 ast_matchers::internal::BoundNodesTreeBuilder *Builder)
const override;
194 std::vector<llvm::Regex> NameMatchers;
199inline ::clang::ast_matchers::internal::Matcher<QualType>
201 bool CanonicalTypes) {
202 return ::clang::ast_matchers::internal::Matcher(
205inline ::clang::ast_matchers::internal::Matcher<QualType>
bool match(const NamedDecl &ND) const
NameMatcher(const StringRef Regex)
bool matches(const NamedDecl &Node, ast_matchers::internal::ASTMatchFinder *Finder, ast_matchers::internal::BoundNodesTreeBuilder *Builder) const override
MatchesAnyListedRegexNameMatcher(llvm::ArrayRef< StringRef > NameList)
~MatchesAnyListedTypeNameMatcher() override
MatchesAnyListedTypeNameMatcher(llvm::ArrayRef< StringRef > NameList, bool CanonicalTypes)
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)
inline ::clang::ast_matchers::internal::Matcher< QualType > matchesAnyListedTypeName(llvm::ArrayRef< StringRef > NameList, bool CanonicalTypes)
AST_MATCHER(BinaryOperator, isRelationalOperator)
AST_MATCHER_FUNCTION(ast_matchers::TypeMatcher, isReferenceToConst)
inline ::clang::ast_matchers::internal::Matcher< NamedDecl > matchesAnyListedRegexName(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