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