xref: /freebsd-src/contrib/llvm-project/clang/lib/ASTMatchers/Dynamic/Registry.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===- Registry.cpp - Matcher registry ------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric /// \file
100b57cec5SDimitry Andric /// Registry map populated at static initialization time.
110b57cec5SDimitry Andric //
120b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #include "clang/ASTMatchers/Dynamic/Registry.h"
150b57cec5SDimitry Andric #include "Marshallers.h"
160b57cec5SDimitry Andric #include "clang/AST/ASTTypeTraits.h"
170b57cec5SDimitry Andric #include "clang/ASTMatchers/ASTMatchers.h"
180b57cec5SDimitry Andric #include "clang/ASTMatchers/Dynamic/Diagnostics.h"
190b57cec5SDimitry Andric #include "clang/ASTMatchers/Dynamic/VariantValue.h"
200b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h"
210b57cec5SDimitry Andric #include "llvm/ADT/StringMap.h"
220b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h"
230b57cec5SDimitry Andric #include "llvm/Support/ManagedStatic.h"
240b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h"
250b57cec5SDimitry Andric #include <cassert>
260b57cec5SDimitry Andric #include <iterator>
270b57cec5SDimitry Andric #include <memory>
28bdd1243dSDimitry Andric #include <optional>
290b57cec5SDimitry Andric #include <set>
300b57cec5SDimitry Andric #include <string>
310b57cec5SDimitry Andric #include <utility>
320b57cec5SDimitry Andric #include <vector>
330b57cec5SDimitry Andric 
340b57cec5SDimitry Andric namespace clang {
350b57cec5SDimitry Andric namespace ast_matchers {
360b57cec5SDimitry Andric namespace dynamic {
370b57cec5SDimitry Andric 
380b57cec5SDimitry Andric namespace {
390b57cec5SDimitry Andric 
400b57cec5SDimitry Andric using internal::MatcherDescriptor;
410b57cec5SDimitry Andric 
42480093f4SDimitry Andric using ConstructorMap =
43480093f4SDimitry Andric     llvm::StringMap<std::unique_ptr<const MatcherDescriptor>>;
440b57cec5SDimitry Andric 
450b57cec5SDimitry Andric class RegistryMaps {
460b57cec5SDimitry Andric public:
470b57cec5SDimitry Andric   RegistryMaps();
480b57cec5SDimitry Andric   ~RegistryMaps();
490b57cec5SDimitry Andric 
500b57cec5SDimitry Andric   const ConstructorMap &constructors() const { return Constructors; }
510b57cec5SDimitry Andric 
520b57cec5SDimitry Andric private:
530b57cec5SDimitry Andric   void registerMatcher(StringRef MatcherName,
540b57cec5SDimitry Andric                        std::unique_ptr<MatcherDescriptor> Callback);
550b57cec5SDimitry Andric 
560b57cec5SDimitry Andric   ConstructorMap Constructors;
570b57cec5SDimitry Andric };
580b57cec5SDimitry Andric 
590b57cec5SDimitry Andric } // namespace
600b57cec5SDimitry Andric 
610b57cec5SDimitry Andric void RegistryMaps::registerMatcher(
620b57cec5SDimitry Andric     StringRef MatcherName, std::unique_ptr<MatcherDescriptor> Callback) {
6306c3fb27SDimitry Andric   assert(!Constructors.contains(MatcherName));
640b57cec5SDimitry Andric   Constructors[MatcherName] = std::move(Callback);
650b57cec5SDimitry Andric }
660b57cec5SDimitry Andric 
670b57cec5SDimitry Andric #define REGISTER_MATCHER(name)                                                 \
680b57cec5SDimitry Andric   registerMatcher(#name, internal::makeMatcherAutoMarshall(                    \
690b57cec5SDimitry Andric                              ::clang::ast_matchers::name, #name));
700b57cec5SDimitry Andric 
710b57cec5SDimitry Andric #define REGISTER_MATCHER_OVERLOAD(name)                                        \
720b57cec5SDimitry Andric   registerMatcher(#name,                                                       \
73a7dea167SDimitry Andric       std::make_unique<internal::OverloadedMatcherDescriptor>(name##Callbacks))
740b57cec5SDimitry Andric 
750b57cec5SDimitry Andric #define SPECIFIC_MATCHER_OVERLOAD(name, Id)                                    \
760b57cec5SDimitry Andric   static_cast<::clang::ast_matchers::name##_Type##Id>(                         \
770b57cec5SDimitry Andric       ::clang::ast_matchers::name)
780b57cec5SDimitry Andric 
790b57cec5SDimitry Andric #define MATCHER_OVERLOAD_ENTRY(name, Id)                                       \
800b57cec5SDimitry Andric         internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, Id), \
810b57cec5SDimitry Andric                                           #name)
820b57cec5SDimitry Andric 
830b57cec5SDimitry Andric #define REGISTER_OVERLOADED_2(name)                                            \
840b57cec5SDimitry Andric   do {                                                                         \
850b57cec5SDimitry Andric     std::unique_ptr<MatcherDescriptor> name##Callbacks[] = {                   \
860b57cec5SDimitry Andric         MATCHER_OVERLOAD_ENTRY(name, 0),                                       \
870b57cec5SDimitry Andric         MATCHER_OVERLOAD_ENTRY(name, 1)};                                      \
880b57cec5SDimitry Andric     REGISTER_MATCHER_OVERLOAD(name);                                           \
890b57cec5SDimitry Andric   } while (false)
900b57cec5SDimitry Andric 
915ffd83dbSDimitry Andric #define REGISTER_REGEX_MATCHER(name)                                           \
925ffd83dbSDimitry Andric   registerMatcher(#name, internal::makeMatcherRegexMarshall(name, name))
935ffd83dbSDimitry Andric 
940b57cec5SDimitry Andric /// Generate a registry map with all the known matchers.
950b57cec5SDimitry Andric /// Please keep sorted alphabetically!
960b57cec5SDimitry Andric RegistryMaps::RegistryMaps() {
970b57cec5SDimitry Andric   // TODO: Here is the list of the missing matchers, grouped by reason.
980b57cec5SDimitry Andric   //
990b57cec5SDimitry Andric   // Polymorphic + argument overload:
1000b57cec5SDimitry Andric   // findAll
1010b57cec5SDimitry Andric   //
1020b57cec5SDimitry Andric   // Other:
1030b57cec5SDimitry Andric   // equalsNode
1040b57cec5SDimitry Andric 
105fe6060f1SDimitry Andric   registerMatcher("mapAnyOf",
106fe6060f1SDimitry Andric                   std::make_unique<internal::MapAnyOfBuilderDescriptor>());
107fe6060f1SDimitry Andric 
1080b57cec5SDimitry Andric   REGISTER_OVERLOADED_2(callee);
1090b57cec5SDimitry Andric   REGISTER_OVERLOADED_2(hasPrefix);
1100b57cec5SDimitry Andric   REGISTER_OVERLOADED_2(hasType);
1110b57cec5SDimitry Andric   REGISTER_OVERLOADED_2(ignoringParens);
1120b57cec5SDimitry Andric   REGISTER_OVERLOADED_2(isDerivedFrom);
113a7dea167SDimitry Andric   REGISTER_OVERLOADED_2(isDirectlyDerivedFrom);
1140b57cec5SDimitry Andric   REGISTER_OVERLOADED_2(isSameOrDerivedFrom);
1150b57cec5SDimitry Andric   REGISTER_OVERLOADED_2(loc);
1160b57cec5SDimitry Andric   REGISTER_OVERLOADED_2(pointsTo);
1170b57cec5SDimitry Andric   REGISTER_OVERLOADED_2(references);
1180b57cec5SDimitry Andric   REGISTER_OVERLOADED_2(thisPointerType);
1190b57cec5SDimitry Andric 
1200b57cec5SDimitry Andric   std::unique_ptr<MatcherDescriptor> equalsCallbacks[] = {
1210b57cec5SDimitry Andric       MATCHER_OVERLOAD_ENTRY(equals, 0),
1220b57cec5SDimitry Andric       MATCHER_OVERLOAD_ENTRY(equals, 1),
1230b57cec5SDimitry Andric       MATCHER_OVERLOAD_ENTRY(equals, 2),
1240b57cec5SDimitry Andric   };
1250b57cec5SDimitry Andric   REGISTER_MATCHER_OVERLOAD(equals);
1260b57cec5SDimitry Andric 
1275ffd83dbSDimitry Andric   REGISTER_REGEX_MATCHER(isExpansionInFileMatching);
1285ffd83dbSDimitry Andric   REGISTER_REGEX_MATCHER(matchesName);
1295ffd83dbSDimitry Andric   REGISTER_REGEX_MATCHER(matchesSelector);
1305ffd83dbSDimitry Andric 
1310b57cec5SDimitry Andric   REGISTER_MATCHER(accessSpecDecl);
1320b57cec5SDimitry Andric   REGISTER_MATCHER(addrLabelExpr);
1330b57cec5SDimitry Andric   REGISTER_MATCHER(alignOfExpr);
1340b57cec5SDimitry Andric   REGISTER_MATCHER(allOf);
1350b57cec5SDimitry Andric   REGISTER_MATCHER(anyOf);
1360b57cec5SDimitry Andric   REGISTER_MATCHER(anything);
13706c3fb27SDimitry Andric   REGISTER_MATCHER(arrayInitIndexExpr);
13806c3fb27SDimitry Andric   REGISTER_MATCHER(arrayInitLoopExpr);
1390b57cec5SDimitry Andric   REGISTER_MATCHER(argumentCountIs);
14006c3fb27SDimitry Andric   REGISTER_MATCHER(argumentCountAtLeast);
1410b57cec5SDimitry Andric   REGISTER_MATCHER(arraySubscriptExpr);
1420b57cec5SDimitry Andric   REGISTER_MATCHER(arrayType);
1430b57cec5SDimitry Andric   REGISTER_MATCHER(asString);
1440b57cec5SDimitry Andric   REGISTER_MATCHER(asmStmt);
1450b57cec5SDimitry Andric   REGISTER_MATCHER(atomicExpr);
1460b57cec5SDimitry Andric   REGISTER_MATCHER(atomicType);
147349cc55cSDimitry Andric   REGISTER_MATCHER(attr);
1480b57cec5SDimitry Andric   REGISTER_MATCHER(autoType);
1490b57cec5SDimitry Andric   REGISTER_MATCHER(autoreleasePoolStmt)
1500b57cec5SDimitry Andric   REGISTER_MATCHER(binaryConditionalOperator);
1510b57cec5SDimitry Andric   REGISTER_MATCHER(binaryOperator);
152e8d8bef9SDimitry Andric   REGISTER_MATCHER(binaryOperation);
153fe6060f1SDimitry Andric   REGISTER_MATCHER(bindingDecl);
1540b57cec5SDimitry Andric   REGISTER_MATCHER(blockDecl);
1550b57cec5SDimitry Andric   REGISTER_MATCHER(blockExpr);
1560b57cec5SDimitry Andric   REGISTER_MATCHER(blockPointerType);
1570b57cec5SDimitry Andric   REGISTER_MATCHER(booleanType);
1580b57cec5SDimitry Andric   REGISTER_MATCHER(breakStmt);
1590b57cec5SDimitry Andric   REGISTER_MATCHER(builtinType);
1600b57cec5SDimitry Andric   REGISTER_MATCHER(cStyleCastExpr);
1610b57cec5SDimitry Andric   REGISTER_MATCHER(callExpr);
162349cc55cSDimitry Andric   REGISTER_MATCHER(capturesThis);
163349cc55cSDimitry Andric   REGISTER_MATCHER(capturesVar);
1640b57cec5SDimitry Andric   REGISTER_MATCHER(caseStmt);
1650b57cec5SDimitry Andric   REGISTER_MATCHER(castExpr);
1660b57cec5SDimitry Andric   REGISTER_MATCHER(characterLiteral);
1670b57cec5SDimitry Andric   REGISTER_MATCHER(chooseExpr);
1680b57cec5SDimitry Andric   REGISTER_MATCHER(classTemplateDecl);
1695ffd83dbSDimitry Andric   REGISTER_MATCHER(classTemplatePartialSpecializationDecl);
1700b57cec5SDimitry Andric   REGISTER_MATCHER(classTemplateSpecializationDecl);
1710b57cec5SDimitry Andric   REGISTER_MATCHER(complexType);
1720b57cec5SDimitry Andric   REGISTER_MATCHER(compoundLiteralExpr);
1730b57cec5SDimitry Andric   REGISTER_MATCHER(compoundStmt);
174fe6060f1SDimitry Andric   REGISTER_MATCHER(coawaitExpr);
17506c3fb27SDimitry Andric   REGISTER_MATCHER(conceptDecl);
1760b57cec5SDimitry Andric   REGISTER_MATCHER(conditionalOperator);
1770b57cec5SDimitry Andric   REGISTER_MATCHER(constantArrayType);
1780b57cec5SDimitry Andric   REGISTER_MATCHER(constantExpr);
1790b57cec5SDimitry Andric   REGISTER_MATCHER(containsDeclaration);
1800b57cec5SDimitry Andric   REGISTER_MATCHER(continueStmt);
1815f757f3fSDimitry Andric   REGISTER_MATCHER(convertVectorExpr);
182fe6060f1SDimitry Andric   REGISTER_MATCHER(coreturnStmt);
18306c3fb27SDimitry Andric   REGISTER_MATCHER(coroutineBodyStmt);
184fe6060f1SDimitry Andric   REGISTER_MATCHER(coyieldExpr);
1850b57cec5SDimitry Andric   REGISTER_MATCHER(cudaKernelCallExpr);
186fe6060f1SDimitry Andric   REGISTER_MATCHER(cxxBaseSpecifier);
1870b57cec5SDimitry Andric   REGISTER_MATCHER(cxxBindTemporaryExpr);
1880b57cec5SDimitry Andric   REGISTER_MATCHER(cxxBoolLiteral);
1890b57cec5SDimitry Andric   REGISTER_MATCHER(cxxCatchStmt);
1900b57cec5SDimitry Andric   REGISTER_MATCHER(cxxConstCastExpr);
1910b57cec5SDimitry Andric   REGISTER_MATCHER(cxxConstructExpr);
1920b57cec5SDimitry Andric   REGISTER_MATCHER(cxxConstructorDecl);
1930b57cec5SDimitry Andric   REGISTER_MATCHER(cxxConversionDecl);
1940b57cec5SDimitry Andric   REGISTER_MATCHER(cxxCtorInitializer);
1950b57cec5SDimitry Andric   REGISTER_MATCHER(cxxDeductionGuideDecl);
1960b57cec5SDimitry Andric   REGISTER_MATCHER(cxxDefaultArgExpr);
1970b57cec5SDimitry Andric   REGISTER_MATCHER(cxxDeleteExpr);
1980b57cec5SDimitry Andric   REGISTER_MATCHER(cxxDependentScopeMemberExpr);
1990b57cec5SDimitry Andric   REGISTER_MATCHER(cxxDestructorDecl);
2000b57cec5SDimitry Andric   REGISTER_MATCHER(cxxDynamicCastExpr);
2017a6dacacSDimitry Andric   REGISTER_MATCHER(cxxFoldExpr);
2020b57cec5SDimitry Andric   REGISTER_MATCHER(cxxForRangeStmt);
2030b57cec5SDimitry Andric   REGISTER_MATCHER(cxxFunctionalCastExpr);
2040b57cec5SDimitry Andric   REGISTER_MATCHER(cxxMemberCallExpr);
2050b57cec5SDimitry Andric   REGISTER_MATCHER(cxxMethodDecl);
2060b57cec5SDimitry Andric   REGISTER_MATCHER(cxxNewExpr);
2075ffd83dbSDimitry Andric   REGISTER_MATCHER(cxxNoexceptExpr);
2080b57cec5SDimitry Andric   REGISTER_MATCHER(cxxNullPtrLiteralExpr);
2090b57cec5SDimitry Andric   REGISTER_MATCHER(cxxOperatorCallExpr);
2100b57cec5SDimitry Andric   REGISTER_MATCHER(cxxRecordDecl);
2110b57cec5SDimitry Andric   REGISTER_MATCHER(cxxReinterpretCastExpr);
212e8d8bef9SDimitry Andric   REGISTER_MATCHER(cxxRewrittenBinaryOperator);
2130b57cec5SDimitry Andric   REGISTER_MATCHER(cxxStaticCastExpr);
2140b57cec5SDimitry Andric   REGISTER_MATCHER(cxxStdInitializerListExpr);
2150b57cec5SDimitry Andric   REGISTER_MATCHER(cxxTemporaryObjectExpr);
2160b57cec5SDimitry Andric   REGISTER_MATCHER(cxxThisExpr);
2170b57cec5SDimitry Andric   REGISTER_MATCHER(cxxThrowExpr);
2180b57cec5SDimitry Andric   REGISTER_MATCHER(cxxTryStmt);
2190b57cec5SDimitry Andric   REGISTER_MATCHER(cxxUnresolvedConstructExpr);
2200b57cec5SDimitry Andric   REGISTER_MATCHER(decayedType);
2210b57cec5SDimitry Andric   REGISTER_MATCHER(decl);
222e8d8bef9SDimitry Andric   REGISTER_MATCHER(decompositionDecl);
2230b57cec5SDimitry Andric   REGISTER_MATCHER(declCountIs);
2240b57cec5SDimitry Andric   REGISTER_MATCHER(declRefExpr);
2250b57cec5SDimitry Andric   REGISTER_MATCHER(declStmt);
2260b57cec5SDimitry Andric   REGISTER_MATCHER(declaratorDecl);
2270b57cec5SDimitry Andric   REGISTER_MATCHER(decltypeType);
2285ffd83dbSDimitry Andric   REGISTER_MATCHER(deducedTemplateSpecializationType);
2290b57cec5SDimitry Andric   REGISTER_MATCHER(defaultStmt);
230fe6060f1SDimitry Andric   REGISTER_MATCHER(dependentCoawaitExpr);
2310b57cec5SDimitry Andric   REGISTER_MATCHER(dependentSizedArrayType);
2325f757f3fSDimitry Andric   REGISTER_MATCHER(dependentSizedExtVectorType);
2330b57cec5SDimitry Andric   REGISTER_MATCHER(designatedInitExpr);
2340b57cec5SDimitry Andric   REGISTER_MATCHER(designatorCountIs);
2350b57cec5SDimitry Andric   REGISTER_MATCHER(doStmt);
2360b57cec5SDimitry Andric   REGISTER_MATCHER(eachOf);
2370b57cec5SDimitry Andric   REGISTER_MATCHER(elaboratedType);
238349cc55cSDimitry Andric   REGISTER_MATCHER(elaboratedTypeLoc);
2390eae32dcSDimitry Andric   REGISTER_MATCHER(usingType);
2400b57cec5SDimitry Andric   REGISTER_MATCHER(enumConstantDecl);
2410b57cec5SDimitry Andric   REGISTER_MATCHER(enumDecl);
2420b57cec5SDimitry Andric   REGISTER_MATCHER(enumType);
2430b57cec5SDimitry Andric   REGISTER_MATCHER(equalsBoundNode);
2440b57cec5SDimitry Andric   REGISTER_MATCHER(equalsIntegralValue);
2450b57cec5SDimitry Andric   REGISTER_MATCHER(explicitCastExpr);
2460b57cec5SDimitry Andric   REGISTER_MATCHER(expr);
2470b57cec5SDimitry Andric   REGISTER_MATCHER(exprWithCleanups);
2480b57cec5SDimitry Andric   REGISTER_MATCHER(fieldDecl);
249fe6060f1SDimitry Andric   REGISTER_MATCHER(fixedPointLiteral);
2500b57cec5SDimitry Andric   REGISTER_MATCHER(floatLiteral);
251fe6060f1SDimitry Andric   REGISTER_MATCHER(forCallable);
252fe6060f1SDimitry Andric   REGISTER_MATCHER(forDecomposition);
2530b57cec5SDimitry Andric   REGISTER_MATCHER(forEach);
2540b57cec5SDimitry Andric   REGISTER_MATCHER(forEachArgumentWithParam);
255e8d8bef9SDimitry Andric   REGISTER_MATCHER(forEachArgumentWithParamType);
2560b57cec5SDimitry Andric   REGISTER_MATCHER(forEachConstructorInitializer);
2570b57cec5SDimitry Andric   REGISTER_MATCHER(forEachDescendant);
258349cc55cSDimitry Andric   REGISTER_MATCHER(forEachLambdaCapture);
2590b57cec5SDimitry Andric   REGISTER_MATCHER(forEachOverridden);
2600b57cec5SDimitry Andric   REGISTER_MATCHER(forEachSwitchCase);
26181ad6265SDimitry Andric   REGISTER_MATCHER(forEachTemplateArgument);
2620b57cec5SDimitry Andric   REGISTER_MATCHER(forField);
2630b57cec5SDimitry Andric   REGISTER_MATCHER(forFunction);
2640b57cec5SDimitry Andric   REGISTER_MATCHER(forStmt);
2650b57cec5SDimitry Andric   REGISTER_MATCHER(friendDecl);
2660b57cec5SDimitry Andric   REGISTER_MATCHER(functionDecl);
2670b57cec5SDimitry Andric   REGISTER_MATCHER(functionProtoType);
2680b57cec5SDimitry Andric   REGISTER_MATCHER(functionTemplateDecl);
2690b57cec5SDimitry Andric   REGISTER_MATCHER(functionType);
270e8d8bef9SDimitry Andric   REGISTER_MATCHER(genericSelectionExpr);
2710b57cec5SDimitry Andric   REGISTER_MATCHER(gnuNullExpr);
2720b57cec5SDimitry Andric   REGISTER_MATCHER(gotoStmt);
2730b57cec5SDimitry Andric   REGISTER_MATCHER(has);
2740b57cec5SDimitry Andric   REGISTER_MATCHER(hasAncestor);
2750b57cec5SDimitry Andric   REGISTER_MATCHER(hasAnyArgument);
2765ffd83dbSDimitry Andric   REGISTER_MATCHER(hasAnyBase);
277fe6060f1SDimitry Andric   REGISTER_MATCHER(hasAnyBinding);
278fe6060f1SDimitry Andric   REGISTER_MATCHER(hasAnyBody);
279349cc55cSDimitry Andric   REGISTER_MATCHER(hasAnyCapture);
2800b57cec5SDimitry Andric   REGISTER_MATCHER(hasAnyClause);
2810b57cec5SDimitry Andric   REGISTER_MATCHER(hasAnyConstructorInitializer);
2820b57cec5SDimitry Andric   REGISTER_MATCHER(hasAnyDeclaration);
2830b57cec5SDimitry Andric   REGISTER_MATCHER(hasAnyName);
2845ffd83dbSDimitry Andric   REGISTER_MATCHER(hasAnyOperatorName);
2855ffd83dbSDimitry Andric   REGISTER_MATCHER(hasAnyOverloadedOperatorName);
2860b57cec5SDimitry Andric   REGISTER_MATCHER(hasAnyParameter);
2875ffd83dbSDimitry Andric   REGISTER_MATCHER(hasAnyPlacementArg);
2880b57cec5SDimitry Andric   REGISTER_MATCHER(hasAnySelector);
2890b57cec5SDimitry Andric   REGISTER_MATCHER(hasAnySubstatement);
2900b57cec5SDimitry Andric   REGISTER_MATCHER(hasAnyTemplateArgument);
291349cc55cSDimitry Andric   REGISTER_MATCHER(hasAnyTemplateArgumentLoc);
2920b57cec5SDimitry Andric   REGISTER_MATCHER(hasAnyUsingShadowDecl);
2930b57cec5SDimitry Andric   REGISTER_MATCHER(hasArgument);
2940b57cec5SDimitry Andric   REGISTER_MATCHER(hasArgumentOfType);
2950b57cec5SDimitry Andric   REGISTER_MATCHER(hasArraySize);
2960b57cec5SDimitry Andric   REGISTER_MATCHER(hasAttr);
2970b57cec5SDimitry Andric   REGISTER_MATCHER(hasAutomaticStorageDuration);
2980b57cec5SDimitry Andric   REGISTER_MATCHER(hasBase);
299fe6060f1SDimitry Andric   REGISTER_MATCHER(hasBinding);
3000b57cec5SDimitry Andric   REGISTER_MATCHER(hasBitWidth);
3010b57cec5SDimitry Andric   REGISTER_MATCHER(hasBody);
3020b57cec5SDimitry Andric   REGISTER_MATCHER(hasCanonicalType);
3030b57cec5SDimitry Andric   REGISTER_MATCHER(hasCaseConstant);
3040b57cec5SDimitry Andric   REGISTER_MATCHER(hasCastKind);
3050b57cec5SDimitry Andric   REGISTER_MATCHER(hasCondition);
3060b57cec5SDimitry Andric   REGISTER_MATCHER(hasConditionVariableStatement);
3070b57cec5SDimitry Andric   REGISTER_MATCHER(hasDecayedType);
3080b57cec5SDimitry Andric   REGISTER_MATCHER(hasDeclContext);
3090b57cec5SDimitry Andric   REGISTER_MATCHER(hasDeclaration);
3100b57cec5SDimitry Andric   REGISTER_MATCHER(hasDeducedType);
3110b57cec5SDimitry Andric   REGISTER_MATCHER(hasDefaultArgument);
3120b57cec5SDimitry Andric   REGISTER_MATCHER(hasDefinition);
3130b57cec5SDimitry Andric   REGISTER_MATCHER(hasDescendant);
3140b57cec5SDimitry Andric   REGISTER_MATCHER(hasDestinationType);
3155ffd83dbSDimitry Andric   REGISTER_MATCHER(hasDirectBase);
3160b57cec5SDimitry Andric   REGISTER_MATCHER(hasDynamicExceptionSpec);
3170b57cec5SDimitry Andric   REGISTER_MATCHER(hasEitherOperand);
3180b57cec5SDimitry Andric   REGISTER_MATCHER(hasElementType);
3190b57cec5SDimitry Andric   REGISTER_MATCHER(hasElse);
3200b57cec5SDimitry Andric   REGISTER_MATCHER(hasExplicitSpecifier);
3210b57cec5SDimitry Andric   REGISTER_MATCHER(hasExternalFormalLinkage);
3220b57cec5SDimitry Andric   REGISTER_MATCHER(hasFalseExpression);
3237a6dacacSDimitry Andric   REGISTER_MATCHER(hasFoldInit);
3240b57cec5SDimitry Andric   REGISTER_MATCHER(hasGlobalStorage);
3250b57cec5SDimitry Andric   REGISTER_MATCHER(hasImplicitDestinationType);
3260b57cec5SDimitry Andric   REGISTER_MATCHER(hasInClassInitializer);
3270b57cec5SDimitry Andric   REGISTER_MATCHER(hasIncrement);
3280b57cec5SDimitry Andric   REGISTER_MATCHER(hasIndex);
3290b57cec5SDimitry Andric   REGISTER_MATCHER(hasInit);
3300b57cec5SDimitry Andric   REGISTER_MATCHER(hasInitializer);
331480093f4SDimitry Andric   REGISTER_MATCHER(hasInitStatement);
3320b57cec5SDimitry Andric   REGISTER_MATCHER(hasKeywordSelector);
3330b57cec5SDimitry Andric   REGISTER_MATCHER(hasLHS);
3340b57cec5SDimitry Andric   REGISTER_MATCHER(hasLocalQualifiers);
3350b57cec5SDimitry Andric   REGISTER_MATCHER(hasLocalStorage);
3360b57cec5SDimitry Andric   REGISTER_MATCHER(hasLoopInit);
3370b57cec5SDimitry Andric   REGISTER_MATCHER(hasLoopVariable);
338e8d8bef9SDimitry Andric   REGISTER_MATCHER(hasMemberName);
3390b57cec5SDimitry Andric   REGISTER_MATCHER(hasMethod);
3400b57cec5SDimitry Andric   REGISTER_MATCHER(hasName);
341349cc55cSDimitry Andric   REGISTER_MATCHER(hasNamedTypeLoc);
3420b57cec5SDimitry Andric   REGISTER_MATCHER(hasNullSelector);
3430b57cec5SDimitry Andric   REGISTER_MATCHER(hasObjectExpression);
3445ffd83dbSDimitry Andric   REGISTER_MATCHER(hasOperands);
3450b57cec5SDimitry Andric   REGISTER_MATCHER(hasOperatorName);
3460b57cec5SDimitry Andric   REGISTER_MATCHER(hasOverloadedOperatorName);
3470b57cec5SDimitry Andric   REGISTER_MATCHER(hasParameter);
3480b57cec5SDimitry Andric   REGISTER_MATCHER(hasParent);
3497a6dacacSDimitry Andric   REGISTER_MATCHER(hasPattern);
350349cc55cSDimitry Andric   REGISTER_MATCHER(hasPointeeLoc);
3510b57cec5SDimitry Andric   REGISTER_MATCHER(hasQualifier);
3520b57cec5SDimitry Andric   REGISTER_MATCHER(hasRHS);
3530b57cec5SDimitry Andric   REGISTER_MATCHER(hasRangeInit);
3540b57cec5SDimitry Andric   REGISTER_MATCHER(hasReceiver);
3550b57cec5SDimitry Andric   REGISTER_MATCHER(hasReceiverType);
356349cc55cSDimitry Andric   REGISTER_MATCHER(hasReferentLoc);
3570b57cec5SDimitry Andric   REGISTER_MATCHER(hasReplacementType);
358349cc55cSDimitry Andric   REGISTER_MATCHER(hasReturnTypeLoc);
3590b57cec5SDimitry Andric   REGISTER_MATCHER(hasReturnValue);
3605ffd83dbSDimitry Andric   REGISTER_MATCHER(hasPlacementArg);
3610b57cec5SDimitry Andric   REGISTER_MATCHER(hasSelector);
3620b57cec5SDimitry Andric   REGISTER_MATCHER(hasSingleDecl);
3630b57cec5SDimitry Andric   REGISTER_MATCHER(hasSize);
3640b57cec5SDimitry Andric   REGISTER_MATCHER(hasSizeExpr);
3650b57cec5SDimitry Andric   REGISTER_MATCHER(hasSourceExpression);
3660b57cec5SDimitry Andric   REGISTER_MATCHER(hasSpecializedTemplate);
3670b57cec5SDimitry Andric   REGISTER_MATCHER(hasStaticStorageDuration);
3680b57cec5SDimitry Andric   REGISTER_MATCHER(hasStructuredBlock);
3690b57cec5SDimitry Andric   REGISTER_MATCHER(hasSyntacticForm);
3700b57cec5SDimitry Andric   REGISTER_MATCHER(hasTargetDecl);
3710b57cec5SDimitry Andric   REGISTER_MATCHER(hasTemplateArgument);
372349cc55cSDimitry Andric   REGISTER_MATCHER(hasTemplateArgumentLoc);
3730b57cec5SDimitry Andric   REGISTER_MATCHER(hasThen);
3740b57cec5SDimitry Andric   REGISTER_MATCHER(hasThreadStorageDuration);
3750b57cec5SDimitry Andric   REGISTER_MATCHER(hasTrailingReturn);
3760b57cec5SDimitry Andric   REGISTER_MATCHER(hasTrueExpression);
3770b57cec5SDimitry Andric   REGISTER_MATCHER(hasTypeLoc);
3780b57cec5SDimitry Andric   REGISTER_MATCHER(hasUnaryOperand);
3790b57cec5SDimitry Andric   REGISTER_MATCHER(hasUnarySelector);
3800b57cec5SDimitry Andric   REGISTER_MATCHER(hasUnderlyingDecl);
3810b57cec5SDimitry Andric   REGISTER_MATCHER(hasUnderlyingType);
3820b57cec5SDimitry Andric   REGISTER_MATCHER(hasUnqualifiedDesugaredType);
383349cc55cSDimitry Andric   REGISTER_MATCHER(hasUnqualifiedLoc);
3840b57cec5SDimitry Andric   REGISTER_MATCHER(hasValueType);
3850b57cec5SDimitry Andric   REGISTER_MATCHER(ifStmt);
3860b57cec5SDimitry Andric   REGISTER_MATCHER(ignoringElidableConstructorCall);
3870b57cec5SDimitry Andric   REGISTER_MATCHER(ignoringImpCasts);
3880b57cec5SDimitry Andric   REGISTER_MATCHER(ignoringImplicit);
3890b57cec5SDimitry Andric   REGISTER_MATCHER(ignoringParenCasts);
3900b57cec5SDimitry Andric   REGISTER_MATCHER(ignoringParenImpCasts);
3910b57cec5SDimitry Andric   REGISTER_MATCHER(imaginaryLiteral);
3920b57cec5SDimitry Andric   REGISTER_MATCHER(implicitCastExpr);
3930b57cec5SDimitry Andric   REGISTER_MATCHER(implicitValueInitExpr);
3940b57cec5SDimitry Andric   REGISTER_MATCHER(incompleteArrayType);
3950b57cec5SDimitry Andric   REGISTER_MATCHER(indirectFieldDecl);
3960b57cec5SDimitry Andric   REGISTER_MATCHER(initListExpr);
3970b57cec5SDimitry Andric   REGISTER_MATCHER(injectedClassNameType);
3980b57cec5SDimitry Andric   REGISTER_MATCHER(innerType);
3990b57cec5SDimitry Andric   REGISTER_MATCHER(integerLiteral);
400fe6060f1SDimitry Andric   REGISTER_MATCHER(invocation);
4010b57cec5SDimitry Andric   REGISTER_MATCHER(isAllowedToContainClauseKind);
4020b57cec5SDimitry Andric   REGISTER_MATCHER(isAnonymous);
4030b57cec5SDimitry Andric   REGISTER_MATCHER(isAnyCharacter);
4040b57cec5SDimitry Andric   REGISTER_MATCHER(isAnyPointer);
4050b57cec5SDimitry Andric   REGISTER_MATCHER(isArray);
4060b57cec5SDimitry Andric   REGISTER_MATCHER(isArrow);
4070b57cec5SDimitry Andric   REGISTER_MATCHER(isAssignmentOperator);
4085ffd83dbSDimitry Andric   REGISTER_MATCHER(isAtPosition);
4090b57cec5SDimitry Andric   REGISTER_MATCHER(isBaseInitializer);
4107a6dacacSDimitry Andric   REGISTER_MATCHER(isBinaryFold);
4110b57cec5SDimitry Andric   REGISTER_MATCHER(isBitField);
4120b57cec5SDimitry Andric   REGISTER_MATCHER(isCatchAll);
4130b57cec5SDimitry Andric   REGISTER_MATCHER(isClass);
4140b57cec5SDimitry Andric   REGISTER_MATCHER(isClassMessage);
4150b57cec5SDimitry Andric   REGISTER_MATCHER(isClassMethod);
4165ffd83dbSDimitry Andric   REGISTER_MATCHER(isComparisonOperator);
4170b57cec5SDimitry Andric   REGISTER_MATCHER(isConst);
4180b57cec5SDimitry Andric   REGISTER_MATCHER(isConstQualified);
41904eeddc0SDimitry Andric   REGISTER_MATCHER(isConsteval);
4200b57cec5SDimitry Andric   REGISTER_MATCHER(isConstexpr);
42104eeddc0SDimitry Andric   REGISTER_MATCHER(isConstinit);
4220b57cec5SDimitry Andric   REGISTER_MATCHER(isCopyAssignmentOperator);
4230b57cec5SDimitry Andric   REGISTER_MATCHER(isCopyConstructor);
4240b57cec5SDimitry Andric   REGISTER_MATCHER(isDefaultConstructor);
4250b57cec5SDimitry Andric   REGISTER_MATCHER(isDefaulted);
4260b57cec5SDimitry Andric   REGISTER_MATCHER(isDefinition);
4270b57cec5SDimitry Andric   REGISTER_MATCHER(isDelegatingConstructor);
4280b57cec5SDimitry Andric   REGISTER_MATCHER(isDeleted);
4295ffd83dbSDimitry Andric   REGISTER_MATCHER(isEnum);
4300b57cec5SDimitry Andric   REGISTER_MATCHER(isExceptionVariable);
4315ffd83dbSDimitry Andric   REGISTER_MATCHER(isExpandedFromMacro);
4320b57cec5SDimitry Andric   REGISTER_MATCHER(isExpansionInMainFile);
4330b57cec5SDimitry Andric   REGISTER_MATCHER(isExpansionInSystemHeader);
4340b57cec5SDimitry Andric   REGISTER_MATCHER(isExplicit);
435*0fca6ea1SDimitry Andric   REGISTER_MATCHER(isExplicitObjectMemberFunction);
4360b57cec5SDimitry Andric   REGISTER_MATCHER(isExplicitTemplateSpecialization);
4370b57cec5SDimitry Andric   REGISTER_MATCHER(isExpr);
4380b57cec5SDimitry Andric   REGISTER_MATCHER(isExternC);
4390b57cec5SDimitry Andric   REGISTER_MATCHER(isFinal);
44081ad6265SDimitry Andric   REGISTER_MATCHER(isPrivateKind);
4415ffd83dbSDimitry Andric   REGISTER_MATCHER(isFirstPrivateKind);
4420b57cec5SDimitry Andric   REGISTER_MATCHER(isImplicit);
443bdd1243dSDimitry Andric   REGISTER_MATCHER(isInAnonymousNamespace);
4440b57cec5SDimitry Andric   REGISTER_MATCHER(isInStdNamespace);
4450b57cec5SDimitry Andric   REGISTER_MATCHER(isInTemplateInstantiation);
446349cc55cSDimitry Andric   REGISTER_MATCHER(isInitCapture);
4470b57cec5SDimitry Andric   REGISTER_MATCHER(isInline);
4480b57cec5SDimitry Andric   REGISTER_MATCHER(isInstanceMessage);
4490b57cec5SDimitry Andric   REGISTER_MATCHER(isInstanceMethod);
4500b57cec5SDimitry Andric   REGISTER_MATCHER(isInstantiated);
4510b57cec5SDimitry Andric   REGISTER_MATCHER(isInstantiationDependent);
4520b57cec5SDimitry Andric   REGISTER_MATCHER(isInteger);
4530b57cec5SDimitry Andric   REGISTER_MATCHER(isIntegral);
4540b57cec5SDimitry Andric   REGISTER_MATCHER(isLambda);
4557a6dacacSDimitry Andric   REGISTER_MATCHER(isLeftFold);
4560b57cec5SDimitry Andric   REGISTER_MATCHER(isListInitialization);
4570b57cec5SDimitry Andric   REGISTER_MATCHER(isMain);
4580b57cec5SDimitry Andric   REGISTER_MATCHER(isMemberInitializer);
4590b57cec5SDimitry Andric   REGISTER_MATCHER(isMoveAssignmentOperator);
4600b57cec5SDimitry Andric   REGISTER_MATCHER(isMoveConstructor);
4610b57cec5SDimitry Andric   REGISTER_MATCHER(isNoReturn);
4620b57cec5SDimitry Andric   REGISTER_MATCHER(isNoThrow);
4630b57cec5SDimitry Andric   REGISTER_MATCHER(isNoneKind);
4640b57cec5SDimitry Andric   REGISTER_MATCHER(isOverride);
4650b57cec5SDimitry Andric   REGISTER_MATCHER(isPrivate);
4660b57cec5SDimitry Andric   REGISTER_MATCHER(isProtected);
4670b57cec5SDimitry Andric   REGISTER_MATCHER(isPublic);
4680b57cec5SDimitry Andric   REGISTER_MATCHER(isPure);
4697a6dacacSDimitry Andric   REGISTER_MATCHER(isRightFold);
4700b57cec5SDimitry Andric   REGISTER_MATCHER(isScoped);
4710b57cec5SDimitry Andric   REGISTER_MATCHER(isSharedKind);
4720b57cec5SDimitry Andric   REGISTER_MATCHER(isSignedInteger);
4730b57cec5SDimitry Andric   REGISTER_MATCHER(isStandaloneDirective);
4740b57cec5SDimitry Andric   REGISTER_MATCHER(isStaticLocal);
4750b57cec5SDimitry Andric   REGISTER_MATCHER(isStaticStorageClass);
4760b57cec5SDimitry Andric   REGISTER_MATCHER(isStruct);
4770b57cec5SDimitry Andric   REGISTER_MATCHER(isTemplateInstantiation);
4780b57cec5SDimitry Andric   REGISTER_MATCHER(isTypeDependent);
4797a6dacacSDimitry Andric   REGISTER_MATCHER(isUnaryFold);
4800b57cec5SDimitry Andric   REGISTER_MATCHER(isUnion);
4810b57cec5SDimitry Andric   REGISTER_MATCHER(isUnsignedInteger);
4820b57cec5SDimitry Andric   REGISTER_MATCHER(isUserProvided);
4830b57cec5SDimitry Andric   REGISTER_MATCHER(isValueDependent);
4840b57cec5SDimitry Andric   REGISTER_MATCHER(isVariadic);
4850b57cec5SDimitry Andric   REGISTER_MATCHER(isVirtual);
4860b57cec5SDimitry Andric   REGISTER_MATCHER(isVirtualAsWritten);
4870b57cec5SDimitry Andric   REGISTER_MATCHER(isVolatileQualified);
488e8d8bef9SDimitry Andric   REGISTER_MATCHER(isWeak);
4890b57cec5SDimitry Andric   REGISTER_MATCHER(isWritten);
4900b57cec5SDimitry Andric   REGISTER_MATCHER(lValueReferenceType);
4910b57cec5SDimitry Andric   REGISTER_MATCHER(labelDecl);
4920b57cec5SDimitry Andric   REGISTER_MATCHER(labelStmt);
493349cc55cSDimitry Andric   REGISTER_MATCHER(lambdaCapture);
4940b57cec5SDimitry Andric   REGISTER_MATCHER(lambdaExpr);
4950b57cec5SDimitry Andric   REGISTER_MATCHER(linkageSpecDecl);
4965f757f3fSDimitry Andric   REGISTER_MATCHER(macroQualifiedType);
4970b57cec5SDimitry Andric   REGISTER_MATCHER(materializeTemporaryExpr);
4980b57cec5SDimitry Andric   REGISTER_MATCHER(member);
4990b57cec5SDimitry Andric   REGISTER_MATCHER(memberExpr);
500e8d8bef9SDimitry Andric   REGISTER_MATCHER(memberHasSameNameAsBoundNode);
5010b57cec5SDimitry Andric   REGISTER_MATCHER(memberPointerType);
5020b57cec5SDimitry Andric   REGISTER_MATCHER(namedDecl);
5030b57cec5SDimitry Andric   REGISTER_MATCHER(namesType);
5040b57cec5SDimitry Andric   REGISTER_MATCHER(namespaceAliasDecl);
5050b57cec5SDimitry Andric   REGISTER_MATCHER(namespaceDecl);
5060b57cec5SDimitry Andric   REGISTER_MATCHER(nestedNameSpecifier);
5070b57cec5SDimitry Andric   REGISTER_MATCHER(nestedNameSpecifierLoc);
5080b57cec5SDimitry Andric   REGISTER_MATCHER(nonTypeTemplateParmDecl);
5090b57cec5SDimitry Andric   REGISTER_MATCHER(nullPointerConstant);
5100b57cec5SDimitry Andric   REGISTER_MATCHER(nullStmt);
5110b57cec5SDimitry Andric   REGISTER_MATCHER(numSelectorArgs);
5120b57cec5SDimitry Andric   REGISTER_MATCHER(objcCatchStmt);
5130b57cec5SDimitry Andric   REGISTER_MATCHER(objcCategoryDecl);
5140b57cec5SDimitry Andric   REGISTER_MATCHER(objcCategoryImplDecl);
5150b57cec5SDimitry Andric   REGISTER_MATCHER(objcFinallyStmt);
5160b57cec5SDimitry Andric   REGISTER_MATCHER(objcImplementationDecl);
5170b57cec5SDimitry Andric   REGISTER_MATCHER(objcInterfaceDecl);
5180b57cec5SDimitry Andric   REGISTER_MATCHER(objcIvarDecl);
5190b57cec5SDimitry Andric   REGISTER_MATCHER(objcIvarRefExpr);
5200b57cec5SDimitry Andric   REGISTER_MATCHER(objcMessageExpr);
5210b57cec5SDimitry Andric   REGISTER_MATCHER(objcMethodDecl);
5220b57cec5SDimitry Andric   REGISTER_MATCHER(objcObjectPointerType);
5230b57cec5SDimitry Andric   REGISTER_MATCHER(objcPropertyDecl);
5240b57cec5SDimitry Andric   REGISTER_MATCHER(objcProtocolDecl);
52581ad6265SDimitry Andric   REGISTER_MATCHER(objcStringLiteral);
5260b57cec5SDimitry Andric   REGISTER_MATCHER(objcThrowStmt);
5270b57cec5SDimitry Andric   REGISTER_MATCHER(objcTryStmt);
5280b57cec5SDimitry Andric   REGISTER_MATCHER(ofClass);
5295ffd83dbSDimitry Andric   REGISTER_MATCHER(ofKind);
5300b57cec5SDimitry Andric   REGISTER_MATCHER(ompDefaultClause);
5310b57cec5SDimitry Andric   REGISTER_MATCHER(ompExecutableDirective);
5320b57cec5SDimitry Andric   REGISTER_MATCHER(on);
5330b57cec5SDimitry Andric   REGISTER_MATCHER(onImplicitObjectArgument);
5340b57cec5SDimitry Andric   REGISTER_MATCHER(opaqueValueExpr);
535480093f4SDimitry Andric   REGISTER_MATCHER(optionally);
5360b57cec5SDimitry Andric   REGISTER_MATCHER(parameterCountIs);
5370b57cec5SDimitry Andric   REGISTER_MATCHER(parenExpr);
5380b57cec5SDimitry Andric   REGISTER_MATCHER(parenListExpr);
5390b57cec5SDimitry Andric   REGISTER_MATCHER(parenType);
5400b57cec5SDimitry Andric   REGISTER_MATCHER(parmVarDecl);
5410b57cec5SDimitry Andric   REGISTER_MATCHER(pointee);
5420b57cec5SDimitry Andric   REGISTER_MATCHER(pointerType);
543349cc55cSDimitry Andric   REGISTER_MATCHER(pointerTypeLoc);
5440b57cec5SDimitry Andric   REGISTER_MATCHER(predefinedExpr);
5450b57cec5SDimitry Andric   REGISTER_MATCHER(qualType);
546349cc55cSDimitry Andric   REGISTER_MATCHER(qualifiedTypeLoc);
5470b57cec5SDimitry Andric   REGISTER_MATCHER(rValueReferenceType);
5480b57cec5SDimitry Andric   REGISTER_MATCHER(realFloatingPointType);
5490b57cec5SDimitry Andric   REGISTER_MATCHER(recordDecl);
5500b57cec5SDimitry Andric   REGISTER_MATCHER(recordType);
5510b57cec5SDimitry Andric   REGISTER_MATCHER(referenceType);
552349cc55cSDimitry Andric   REGISTER_MATCHER(referenceTypeLoc);
5530b57cec5SDimitry Andric   REGISTER_MATCHER(refersToDeclaration);
5540b57cec5SDimitry Andric   REGISTER_MATCHER(refersToIntegralType);
5550b57cec5SDimitry Andric   REGISTER_MATCHER(refersToTemplate);
5560b57cec5SDimitry Andric   REGISTER_MATCHER(refersToType);
5570b57cec5SDimitry Andric   REGISTER_MATCHER(requiresZeroInitialization);
5580b57cec5SDimitry Andric   REGISTER_MATCHER(returnStmt);
5590b57cec5SDimitry Andric   REGISTER_MATCHER(returns);
5600b57cec5SDimitry Andric   REGISTER_MATCHER(sizeOfExpr);
5610b57cec5SDimitry Andric   REGISTER_MATCHER(specifiesNamespace);
5620b57cec5SDimitry Andric   REGISTER_MATCHER(specifiesType);
5630b57cec5SDimitry Andric   REGISTER_MATCHER(specifiesTypeLoc);
5640b57cec5SDimitry Andric   REGISTER_MATCHER(statementCountIs);
5650b57cec5SDimitry Andric   REGISTER_MATCHER(staticAssertDecl);
5660b57cec5SDimitry Andric   REGISTER_MATCHER(stmt);
5670b57cec5SDimitry Andric   REGISTER_MATCHER(stmtExpr);
5680b57cec5SDimitry Andric   REGISTER_MATCHER(stringLiteral);
5690b57cec5SDimitry Andric   REGISTER_MATCHER(substNonTypeTemplateParmExpr);
5700b57cec5SDimitry Andric   REGISTER_MATCHER(substTemplateTypeParmType);
5710b57cec5SDimitry Andric   REGISTER_MATCHER(switchCase);
5720b57cec5SDimitry Andric   REGISTER_MATCHER(switchStmt);
5735ffd83dbSDimitry Andric   REGISTER_MATCHER(tagDecl);
5740b57cec5SDimitry Andric   REGISTER_MATCHER(tagType);
5750b57cec5SDimitry Andric   REGISTER_MATCHER(templateArgument);
5760b57cec5SDimitry Andric   REGISTER_MATCHER(templateArgumentCountIs);
577fe6060f1SDimitry Andric   REGISTER_MATCHER(templateArgumentLoc);
5780b57cec5SDimitry Andric   REGISTER_MATCHER(templateName);
5790b57cec5SDimitry Andric   REGISTER_MATCHER(templateSpecializationType);
580349cc55cSDimitry Andric   REGISTER_MATCHER(templateSpecializationTypeLoc);
581e8d8bef9SDimitry Andric   REGISTER_MATCHER(templateTemplateParmDecl);
5820b57cec5SDimitry Andric   REGISTER_MATCHER(templateTypeParmDecl);
5830b57cec5SDimitry Andric   REGISTER_MATCHER(templateTypeParmType);
5840b57cec5SDimitry Andric   REGISTER_MATCHER(throughUsingDecl);
5850b57cec5SDimitry Andric   REGISTER_MATCHER(to);
5860b57cec5SDimitry Andric   REGISTER_MATCHER(translationUnitDecl);
5870b57cec5SDimitry Andric   REGISTER_MATCHER(type);
5880b57cec5SDimitry Andric   REGISTER_MATCHER(typeAliasDecl);
5890b57cec5SDimitry Andric   REGISTER_MATCHER(typeAliasTemplateDecl);
5900b57cec5SDimitry Andric   REGISTER_MATCHER(typeLoc);
5910b57cec5SDimitry Andric   REGISTER_MATCHER(typedefDecl);
5920b57cec5SDimitry Andric   REGISTER_MATCHER(typedefNameDecl);
5930b57cec5SDimitry Andric   REGISTER_MATCHER(typedefType);
5940b57cec5SDimitry Andric   REGISTER_MATCHER(unaryExprOrTypeTraitExpr);
5950b57cec5SDimitry Andric   REGISTER_MATCHER(unaryOperator);
5960b57cec5SDimitry Andric   REGISTER_MATCHER(unaryTransformType);
5970b57cec5SDimitry Andric   REGISTER_MATCHER(unless);
5980b57cec5SDimitry Andric   REGISTER_MATCHER(unresolvedLookupExpr);
5990b57cec5SDimitry Andric   REGISTER_MATCHER(unresolvedMemberExpr);
6000b57cec5SDimitry Andric   REGISTER_MATCHER(unresolvedUsingTypenameDecl);
6010b57cec5SDimitry Andric   REGISTER_MATCHER(unresolvedUsingValueDecl);
6020b57cec5SDimitry Andric   REGISTER_MATCHER(userDefinedLiteral);
6030b57cec5SDimitry Andric   REGISTER_MATCHER(usesADL);
6040b57cec5SDimitry Andric   REGISTER_MATCHER(usingDecl);
605fe6060f1SDimitry Andric   REGISTER_MATCHER(usingEnumDecl);
6060b57cec5SDimitry Andric   REGISTER_MATCHER(usingDirectiveDecl);
6070b57cec5SDimitry Andric   REGISTER_MATCHER(valueDecl);
6080b57cec5SDimitry Andric   REGISTER_MATCHER(varDecl);
6090b57cec5SDimitry Andric   REGISTER_MATCHER(variableArrayType);
6100b57cec5SDimitry Andric   REGISTER_MATCHER(voidType);
6110b57cec5SDimitry Andric   REGISTER_MATCHER(whileStmt);
6120b57cec5SDimitry Andric   REGISTER_MATCHER(withInitializer);
6130b57cec5SDimitry Andric }
6140b57cec5SDimitry Andric 
6150b57cec5SDimitry Andric RegistryMaps::~RegistryMaps() = default;
6160b57cec5SDimitry Andric 
6170b57cec5SDimitry Andric static llvm::ManagedStatic<RegistryMaps> RegistryData;
6180b57cec5SDimitry Andric 
619fe6060f1SDimitry Andric ASTNodeKind Registry::nodeMatcherType(MatcherCtor Ctor) {
620fe6060f1SDimitry Andric   return Ctor->nodeMatcherType();
621fe6060f1SDimitry Andric }
622fe6060f1SDimitry Andric 
623fe6060f1SDimitry Andric internal::MatcherDescriptorPtr::MatcherDescriptorPtr(MatcherDescriptor *Ptr)
624fe6060f1SDimitry Andric     : Ptr(Ptr) {}
625fe6060f1SDimitry Andric 
626fe6060f1SDimitry Andric internal::MatcherDescriptorPtr::~MatcherDescriptorPtr() { delete Ptr; }
627fe6060f1SDimitry Andric 
628fe6060f1SDimitry Andric bool Registry::isBuilderMatcher(MatcherCtor Ctor) {
629fe6060f1SDimitry Andric   return Ctor->isBuilderMatcher();
630fe6060f1SDimitry Andric }
631fe6060f1SDimitry Andric 
632fe6060f1SDimitry Andric internal::MatcherDescriptorPtr
633fe6060f1SDimitry Andric Registry::buildMatcherCtor(MatcherCtor Ctor, SourceRange NameRange,
634fe6060f1SDimitry Andric                            ArrayRef<ParserValue> Args, Diagnostics *Error) {
635fe6060f1SDimitry Andric   return internal::MatcherDescriptorPtr(
636fe6060f1SDimitry Andric       Ctor->buildMatcherCtor(NameRange, Args, Error).release());
637fe6060f1SDimitry Andric }
638fe6060f1SDimitry Andric 
6390b57cec5SDimitry Andric // static
640bdd1243dSDimitry Andric std::optional<MatcherCtor> Registry::lookupMatcherCtor(StringRef MatcherName) {
6410b57cec5SDimitry Andric   auto it = RegistryData->constructors().find(MatcherName);
642bdd1243dSDimitry Andric   return it == RegistryData->constructors().end() ? std::optional<MatcherCtor>()
6430b57cec5SDimitry Andric                                                   : it->second.get();
6440b57cec5SDimitry Andric }
6450b57cec5SDimitry Andric 
6460b57cec5SDimitry Andric static llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
6470b57cec5SDimitry Andric                                      const std::set<ASTNodeKind> &KS) {
6480b57cec5SDimitry Andric   unsigned Count = 0;
6490b57cec5SDimitry Andric   for (std::set<ASTNodeKind>::const_iterator I = KS.begin(), E = KS.end();
6500b57cec5SDimitry Andric        I != E; ++I) {
6510b57cec5SDimitry Andric     if (I != KS.begin())
6520b57cec5SDimitry Andric       OS << "|";
6530b57cec5SDimitry Andric     if (Count++ == 3) {
6540b57cec5SDimitry Andric       OS << "...";
6550b57cec5SDimitry Andric       break;
6560b57cec5SDimitry Andric     }
6570b57cec5SDimitry Andric     OS << *I;
6580b57cec5SDimitry Andric   }
6590b57cec5SDimitry Andric   return OS;
6600b57cec5SDimitry Andric }
6610b57cec5SDimitry Andric 
6620b57cec5SDimitry Andric std::vector<ArgKind> Registry::getAcceptedCompletionTypes(
6630b57cec5SDimitry Andric     ArrayRef<std::pair<MatcherCtor, unsigned>> Context) {
6640b57cec5SDimitry Andric   ASTNodeKind InitialTypes[] = {
6650b57cec5SDimitry Andric       ASTNodeKind::getFromNodeKind<Decl>(),
6660b57cec5SDimitry Andric       ASTNodeKind::getFromNodeKind<QualType>(),
6670b57cec5SDimitry Andric       ASTNodeKind::getFromNodeKind<Type>(),
6680b57cec5SDimitry Andric       ASTNodeKind::getFromNodeKind<Stmt>(),
6690b57cec5SDimitry Andric       ASTNodeKind::getFromNodeKind<NestedNameSpecifier>(),
6700b57cec5SDimitry Andric       ASTNodeKind::getFromNodeKind<NestedNameSpecifierLoc>(),
6710b57cec5SDimitry Andric       ASTNodeKind::getFromNodeKind<TypeLoc>()};
6720b57cec5SDimitry Andric 
6730b57cec5SDimitry Andric   // Starting with the above seed of acceptable top-level matcher types, compute
6740b57cec5SDimitry Andric   // the acceptable type set for the argument indicated by each context element.
675fe6060f1SDimitry Andric   std::set<ArgKind> TypeSet;
676fe6060f1SDimitry Andric   for (auto IT : InitialTypes) {
677fe6060f1SDimitry Andric     TypeSet.insert(ArgKind::MakeMatcherArg(IT));
678fe6060f1SDimitry Andric   }
6790b57cec5SDimitry Andric   for (const auto &CtxEntry : Context) {
6800b57cec5SDimitry Andric     MatcherCtor Ctor = CtxEntry.first;
6810b57cec5SDimitry Andric     unsigned ArgNumber = CtxEntry.second;
6820b57cec5SDimitry Andric     std::vector<ArgKind> NextTypeSet;
6830b57cec5SDimitry Andric     for (const ArgKind &Kind : TypeSet) {
6840b57cec5SDimitry Andric       if (Kind.getArgKind() == Kind.AK_Matcher &&
6850b57cec5SDimitry Andric           Ctor->isConvertibleTo(Kind.getMatcherKind()) &&
6860b57cec5SDimitry Andric           (Ctor->isVariadic() || ArgNumber < Ctor->getNumArgs()))
6870b57cec5SDimitry Andric         Ctor->getArgKinds(Kind.getMatcherKind(), ArgNumber, NextTypeSet);
6880b57cec5SDimitry Andric     }
6890b57cec5SDimitry Andric     TypeSet.clear();
6900b57cec5SDimitry Andric     TypeSet.insert(NextTypeSet.begin(), NextTypeSet.end());
6910b57cec5SDimitry Andric   }
6920b57cec5SDimitry Andric   return std::vector<ArgKind>(TypeSet.begin(), TypeSet.end());
6930b57cec5SDimitry Andric }
6940b57cec5SDimitry Andric 
6950b57cec5SDimitry Andric std::vector<MatcherCompletion>
6960b57cec5SDimitry Andric Registry::getMatcherCompletions(ArrayRef<ArgKind> AcceptedTypes) {
6970b57cec5SDimitry Andric   std::vector<MatcherCompletion> Completions;
6980b57cec5SDimitry Andric 
6990b57cec5SDimitry Andric   // Search the registry for acceptable matchers.
7000b57cec5SDimitry Andric   for (const auto &M : RegistryData->constructors()) {
7010b57cec5SDimitry Andric     const MatcherDescriptor& Matcher = *M.getValue();
7020b57cec5SDimitry Andric     StringRef Name = M.getKey();
7030b57cec5SDimitry Andric 
7040b57cec5SDimitry Andric     std::set<ASTNodeKind> RetKinds;
7050b57cec5SDimitry Andric     unsigned NumArgs = Matcher.isVariadic() ? 1 : Matcher.getNumArgs();
7060b57cec5SDimitry Andric     bool IsPolymorphic = Matcher.isPolymorphic();
7070b57cec5SDimitry Andric     std::vector<std::vector<ArgKind>> ArgsKinds(NumArgs);
7080b57cec5SDimitry Andric     unsigned MaxSpecificity = 0;
709fe6060f1SDimitry Andric     bool NodeArgs = false;
7100b57cec5SDimitry Andric     for (const ArgKind& Kind : AcceptedTypes) {
711fe6060f1SDimitry Andric       if (Kind.getArgKind() != Kind.AK_Matcher &&
712fe6060f1SDimitry Andric           Kind.getArgKind() != Kind.AK_Node) {
7130b57cec5SDimitry Andric         continue;
714fe6060f1SDimitry Andric       }
715fe6060f1SDimitry Andric 
716fe6060f1SDimitry Andric       if (Kind.getArgKind() == Kind.AK_Node) {
717fe6060f1SDimitry Andric         NodeArgs = true;
718fe6060f1SDimitry Andric         unsigned Specificity;
719fe6060f1SDimitry Andric         ASTNodeKind LeastDerivedKind;
720fe6060f1SDimitry Andric         if (Matcher.isConvertibleTo(Kind.getNodeKind(), &Specificity,
721fe6060f1SDimitry Andric                                     &LeastDerivedKind)) {
722fe6060f1SDimitry Andric           if (MaxSpecificity < Specificity)
723fe6060f1SDimitry Andric             MaxSpecificity = Specificity;
724fe6060f1SDimitry Andric           RetKinds.insert(LeastDerivedKind);
725fe6060f1SDimitry Andric           for (unsigned Arg = 0; Arg != NumArgs; ++Arg)
726fe6060f1SDimitry Andric             Matcher.getArgKinds(Kind.getNodeKind(), Arg, ArgsKinds[Arg]);
727fe6060f1SDimitry Andric           if (IsPolymorphic)
728fe6060f1SDimitry Andric             break;
729fe6060f1SDimitry Andric         }
730fe6060f1SDimitry Andric       } else {
7310b57cec5SDimitry Andric         unsigned Specificity;
7320b57cec5SDimitry Andric         ASTNodeKind LeastDerivedKind;
7330b57cec5SDimitry Andric         if (Matcher.isConvertibleTo(Kind.getMatcherKind(), &Specificity,
7340b57cec5SDimitry Andric                                     &LeastDerivedKind)) {
7350b57cec5SDimitry Andric           if (MaxSpecificity < Specificity)
7360b57cec5SDimitry Andric             MaxSpecificity = Specificity;
7370b57cec5SDimitry Andric           RetKinds.insert(LeastDerivedKind);
7380b57cec5SDimitry Andric           for (unsigned Arg = 0; Arg != NumArgs; ++Arg)
7390b57cec5SDimitry Andric             Matcher.getArgKinds(Kind.getMatcherKind(), Arg, ArgsKinds[Arg]);
7400b57cec5SDimitry Andric           if (IsPolymorphic)
7410b57cec5SDimitry Andric             break;
7420b57cec5SDimitry Andric         }
7430b57cec5SDimitry Andric       }
744fe6060f1SDimitry Andric     }
7450b57cec5SDimitry Andric 
7460b57cec5SDimitry Andric     if (!RetKinds.empty() && MaxSpecificity > 0) {
7470b57cec5SDimitry Andric       std::string Decl;
7480b57cec5SDimitry Andric       llvm::raw_string_ostream OS(Decl);
7490b57cec5SDimitry Andric 
750fe6060f1SDimitry Andric       std::string TypedText = std::string(Name);
751fe6060f1SDimitry Andric 
752fe6060f1SDimitry Andric       if (NodeArgs) {
753fe6060f1SDimitry Andric         OS << Name;
754fe6060f1SDimitry Andric       } else {
755fe6060f1SDimitry Andric 
7560b57cec5SDimitry Andric         if (IsPolymorphic) {
7570b57cec5SDimitry Andric           OS << "Matcher<T> " << Name << "(Matcher<T>";
7580b57cec5SDimitry Andric         } else {
7590b57cec5SDimitry Andric           OS << "Matcher<" << RetKinds << "> " << Name << "(";
7600b57cec5SDimitry Andric           for (const std::vector<ArgKind> &Arg : ArgsKinds) {
7610b57cec5SDimitry Andric             if (&Arg != &ArgsKinds[0])
7620b57cec5SDimitry Andric               OS << ", ";
7630b57cec5SDimitry Andric 
7640b57cec5SDimitry Andric             bool FirstArgKind = true;
7650b57cec5SDimitry Andric             std::set<ASTNodeKind> MatcherKinds;
7660b57cec5SDimitry Andric             // Two steps. First all non-matchers, then matchers only.
7670b57cec5SDimitry Andric             for (const ArgKind &AK : Arg) {
7680b57cec5SDimitry Andric               if (AK.getArgKind() == ArgKind::AK_Matcher) {
7690b57cec5SDimitry Andric                 MatcherKinds.insert(AK.getMatcherKind());
7700b57cec5SDimitry Andric               } else {
771fe6060f1SDimitry Andric                 if (!FirstArgKind)
772fe6060f1SDimitry Andric                   OS << "|";
7730b57cec5SDimitry Andric                 FirstArgKind = false;
7740b57cec5SDimitry Andric                 OS << AK.asString();
7750b57cec5SDimitry Andric               }
7760b57cec5SDimitry Andric             }
7770b57cec5SDimitry Andric             if (!MatcherKinds.empty()) {
7780b57cec5SDimitry Andric               if (!FirstArgKind) OS << "|";
7790b57cec5SDimitry Andric               OS << "Matcher<" << MatcherKinds << ">";
7800b57cec5SDimitry Andric             }
7810b57cec5SDimitry Andric           }
7820b57cec5SDimitry Andric         }
7830b57cec5SDimitry Andric         if (Matcher.isVariadic())
7840b57cec5SDimitry Andric           OS << "...";
7850b57cec5SDimitry Andric         OS << ")";
7860b57cec5SDimitry Andric 
7870b57cec5SDimitry Andric         TypedText += "(";
7880b57cec5SDimitry Andric         if (ArgsKinds.empty())
7890b57cec5SDimitry Andric           TypedText += ")";
7900b57cec5SDimitry Andric         else if (ArgsKinds[0][0].getArgKind() == ArgKind::AK_String)
7910b57cec5SDimitry Andric           TypedText += "\"";
792fe6060f1SDimitry Andric       }
7930b57cec5SDimitry Andric 
7940b57cec5SDimitry Andric       Completions.emplace_back(TypedText, OS.str(), MaxSpecificity);
7950b57cec5SDimitry Andric     }
7960b57cec5SDimitry Andric   }
7970b57cec5SDimitry Andric 
7980b57cec5SDimitry Andric   return Completions;
7990b57cec5SDimitry Andric }
8000b57cec5SDimitry Andric 
8010b57cec5SDimitry Andric VariantMatcher Registry::constructMatcher(MatcherCtor Ctor,
8020b57cec5SDimitry Andric                                           SourceRange NameRange,
8030b57cec5SDimitry Andric                                           ArrayRef<ParserValue> Args,
8040b57cec5SDimitry Andric                                           Diagnostics *Error) {
8050b57cec5SDimitry Andric   return Ctor->create(NameRange, Args, Error);
8060b57cec5SDimitry Andric }
8070b57cec5SDimitry Andric 
8080b57cec5SDimitry Andric VariantMatcher Registry::constructBoundMatcher(MatcherCtor Ctor,
8090b57cec5SDimitry Andric                                                SourceRange NameRange,
8100b57cec5SDimitry Andric                                                StringRef BindID,
8110b57cec5SDimitry Andric                                                ArrayRef<ParserValue> Args,
8120b57cec5SDimitry Andric                                                Diagnostics *Error) {
8130b57cec5SDimitry Andric   VariantMatcher Out = constructMatcher(Ctor, NameRange, Args, Error);
8140b57cec5SDimitry Andric   if (Out.isNull()) return Out;
8150b57cec5SDimitry Andric 
816bdd1243dSDimitry Andric   std::optional<DynTypedMatcher> Result = Out.getSingleMatcher();
81781ad6265SDimitry Andric   if (Result) {
818bdd1243dSDimitry Andric     std::optional<DynTypedMatcher> Bound = Result->tryBind(BindID);
81981ad6265SDimitry Andric     if (Bound) {
8200b57cec5SDimitry Andric       return VariantMatcher::SingleMatcher(*Bound);
8210b57cec5SDimitry Andric     }
8220b57cec5SDimitry Andric   }
8230b57cec5SDimitry Andric   Error->addError(NameRange, Error->ET_RegistryNotBindable);
8240b57cec5SDimitry Andric   return VariantMatcher();
8250b57cec5SDimitry Andric }
8260b57cec5SDimitry Andric 
8270b57cec5SDimitry Andric } // namespace dynamic
8280b57cec5SDimitry Andric } // namespace ast_matchers
8290b57cec5SDimitry Andric } // namespace clang
830