1 //===--- Matchers.h - clang-tidy-------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_MATCHERS_H
10 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_MATCHERS_H
11 
12 #include "TypeTraits.h"
13 #include "clang/ASTMatchers/ASTMatchers.h"
14 
15 namespace clang {
16 namespace tidy {
17 namespace matchers {
18 
AST_MATCHER(BinaryOperator,isRelationalOperator)19 AST_MATCHER(BinaryOperator, isRelationalOperator) {
20   return Node.isRelationalOp();
21 }
22 
AST_MATCHER(BinaryOperator,isEqualityOperator)23 AST_MATCHER(BinaryOperator, isEqualityOperator) { return Node.isEqualityOp(); }
24 
AST_MATCHER(QualType,isExpensiveToCopy)25 AST_MATCHER(QualType, isExpensiveToCopy) {
26   llvm::Optional<bool> IsExpensive =
27       utils::type_traits::isExpensiveToCopy(Node, Finder->getASTContext());
28   return IsExpensive && *IsExpensive;
29 }
30 
AST_MATCHER(RecordDecl,isTriviallyDefaultConstructible)31 AST_MATCHER(RecordDecl, isTriviallyDefaultConstructible) {
32   return utils::type_traits::recordIsTriviallyDefaultConstructible(
33       Node, Finder->getASTContext());
34 }
35 
AST_MATCHER(QualType,isTriviallyDestructible)36 AST_MATCHER(QualType, isTriviallyDestructible) {
37   return utils::type_traits::isTriviallyDestructible(Node);
38 }
39 
40 // Returns QualType matcher for references to const.
AST_MATCHER_FUNCTION(ast_matchers::TypeMatcher,isReferenceToConst)41 AST_MATCHER_FUNCTION(ast_matchers::TypeMatcher, isReferenceToConst) {
42   using namespace ast_matchers;
43   return referenceType(pointee(qualType(isConstQualified())));
44 }
45 
AST_MATCHER_P(NamedDecl,matchesAnyListedName,std::vector<std::string>,NameList)46 AST_MATCHER_P(NamedDecl, matchesAnyListedName, std::vector<std::string>,
47               NameList) {
48   return llvm::any_of(NameList, [&Node](const std::string &Name) {
49       return llvm::Regex(Name).match(Node.getName());
50     });
51 }
52 
53 } // namespace matchers
54 } // namespace tidy
55 } // namespace clang
56 
57 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_MATCHERS_H
58