106f32e7eSjoerg //===- Registry.cpp - Matcher registry ------------------------------------===//
206f32e7eSjoerg //
306f32e7eSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406f32e7eSjoerg // See https://llvm.org/LICENSE.txt for license information.
506f32e7eSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606f32e7eSjoerg //
706f32e7eSjoerg //===----------------------------------------------------------------------===//
806f32e7eSjoerg //
906f32e7eSjoerg /// \file
1006f32e7eSjoerg /// Registry map populated at static initialization time.
1106f32e7eSjoerg //
1206f32e7eSjoerg //===----------------------------------------------------------------------===//
1306f32e7eSjoerg 
1406f32e7eSjoerg #include "clang/ASTMatchers/Dynamic/Registry.h"
1506f32e7eSjoerg #include "Marshallers.h"
1606f32e7eSjoerg #include "clang/AST/ASTTypeTraits.h"
1706f32e7eSjoerg #include "clang/ASTMatchers/ASTMatchers.h"
1806f32e7eSjoerg #include "clang/ASTMatchers/Dynamic/Diagnostics.h"
1906f32e7eSjoerg #include "clang/ASTMatchers/Dynamic/VariantValue.h"
2006f32e7eSjoerg #include "llvm/ADT/Optional.h"
2106f32e7eSjoerg #include "llvm/ADT/STLExtras.h"
2206f32e7eSjoerg #include "llvm/ADT/StringMap.h"
2306f32e7eSjoerg #include "llvm/ADT/StringRef.h"
2406f32e7eSjoerg #include "llvm/Support/ManagedStatic.h"
2506f32e7eSjoerg #include "llvm/Support/raw_ostream.h"
2606f32e7eSjoerg #include <cassert>
2706f32e7eSjoerg #include <iterator>
2806f32e7eSjoerg #include <memory>
2906f32e7eSjoerg #include <set>
3006f32e7eSjoerg #include <string>
3106f32e7eSjoerg #include <utility>
3206f32e7eSjoerg #include <vector>
3306f32e7eSjoerg 
3406f32e7eSjoerg namespace clang {
3506f32e7eSjoerg namespace ast_matchers {
3606f32e7eSjoerg namespace dynamic {
3706f32e7eSjoerg 
3806f32e7eSjoerg namespace {
3906f32e7eSjoerg 
4006f32e7eSjoerg using internal::MatcherDescriptor;
4106f32e7eSjoerg 
42*13fbcb42Sjoerg using ConstructorMap =
43*13fbcb42Sjoerg     llvm::StringMap<std::unique_ptr<const MatcherDescriptor>>;
4406f32e7eSjoerg 
4506f32e7eSjoerg class RegistryMaps {
4606f32e7eSjoerg public:
4706f32e7eSjoerg   RegistryMaps();
4806f32e7eSjoerg   ~RegistryMaps();
4906f32e7eSjoerg 
constructors() const5006f32e7eSjoerg   const ConstructorMap &constructors() const { return Constructors; }
5106f32e7eSjoerg 
5206f32e7eSjoerg private:
5306f32e7eSjoerg   void registerMatcher(StringRef MatcherName,
5406f32e7eSjoerg                        std::unique_ptr<MatcherDescriptor> Callback);
5506f32e7eSjoerg 
5606f32e7eSjoerg   ConstructorMap Constructors;
5706f32e7eSjoerg };
5806f32e7eSjoerg 
5906f32e7eSjoerg } // namespace
6006f32e7eSjoerg 
registerMatcher(StringRef MatcherName,std::unique_ptr<MatcherDescriptor> Callback)6106f32e7eSjoerg void RegistryMaps::registerMatcher(
6206f32e7eSjoerg     StringRef MatcherName, std::unique_ptr<MatcherDescriptor> Callback) {
6306f32e7eSjoerg   assert(Constructors.find(MatcherName) == Constructors.end());
6406f32e7eSjoerg   Constructors[MatcherName] = std::move(Callback);
6506f32e7eSjoerg }
6606f32e7eSjoerg 
6706f32e7eSjoerg #define REGISTER_MATCHER(name)                                                 \
6806f32e7eSjoerg   registerMatcher(#name, internal::makeMatcherAutoMarshall(                    \
6906f32e7eSjoerg                              ::clang::ast_matchers::name, #name));
7006f32e7eSjoerg 
7106f32e7eSjoerg #define REGISTER_MATCHER_OVERLOAD(name)                                        \
7206f32e7eSjoerg   registerMatcher(#name,                                                       \
7306f32e7eSjoerg       std::make_unique<internal::OverloadedMatcherDescriptor>(name##Callbacks))
7406f32e7eSjoerg 
7506f32e7eSjoerg #define SPECIFIC_MATCHER_OVERLOAD(name, Id)                                    \
7606f32e7eSjoerg   static_cast<::clang::ast_matchers::name##_Type##Id>(                         \
7706f32e7eSjoerg       ::clang::ast_matchers::name)
7806f32e7eSjoerg 
7906f32e7eSjoerg #define MATCHER_OVERLOAD_ENTRY(name, Id)                                       \
8006f32e7eSjoerg         internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, Id), \
8106f32e7eSjoerg                                           #name)
8206f32e7eSjoerg 
8306f32e7eSjoerg #define REGISTER_OVERLOADED_2(name)                                            \
8406f32e7eSjoerg   do {                                                                         \
8506f32e7eSjoerg     std::unique_ptr<MatcherDescriptor> name##Callbacks[] = {                   \
8606f32e7eSjoerg         MATCHER_OVERLOAD_ENTRY(name, 0),                                       \
8706f32e7eSjoerg         MATCHER_OVERLOAD_ENTRY(name, 1)};                                      \
8806f32e7eSjoerg     REGISTER_MATCHER_OVERLOAD(name);                                           \
8906f32e7eSjoerg   } while (false)
9006f32e7eSjoerg 
91*13fbcb42Sjoerg #define REGISTER_REGEX_MATCHER(name)                                           \
92*13fbcb42Sjoerg   registerMatcher(#name, internal::makeMatcherRegexMarshall(name, name))
93*13fbcb42Sjoerg 
9406f32e7eSjoerg /// Generate a registry map with all the known matchers.
9506f32e7eSjoerg /// Please keep sorted alphabetically!
RegistryMaps()9606f32e7eSjoerg RegistryMaps::RegistryMaps() {
9706f32e7eSjoerg   // TODO: Here is the list of the missing matchers, grouped by reason.
9806f32e7eSjoerg   //
9906f32e7eSjoerg   // Polymorphic + argument overload:
10006f32e7eSjoerg   // findAll
10106f32e7eSjoerg   //
10206f32e7eSjoerg   // Other:
10306f32e7eSjoerg   // equalsNode
10406f32e7eSjoerg 
105*13fbcb42Sjoerg   registerMatcher("mapAnyOf",
106*13fbcb42Sjoerg                   std::make_unique<internal::MapAnyOfBuilderDescriptor>());
107*13fbcb42Sjoerg 
10806f32e7eSjoerg   REGISTER_OVERLOADED_2(callee);
109*13fbcb42Sjoerg   REGISTER_OVERLOADED_2(hasAnyCapture);
11006f32e7eSjoerg   REGISTER_OVERLOADED_2(hasPrefix);
11106f32e7eSjoerg   REGISTER_OVERLOADED_2(hasType);
11206f32e7eSjoerg   REGISTER_OVERLOADED_2(ignoringParens);
11306f32e7eSjoerg   REGISTER_OVERLOADED_2(isDerivedFrom);
11406f32e7eSjoerg   REGISTER_OVERLOADED_2(isDirectlyDerivedFrom);
11506f32e7eSjoerg   REGISTER_OVERLOADED_2(isSameOrDerivedFrom);
11606f32e7eSjoerg   REGISTER_OVERLOADED_2(loc);
11706f32e7eSjoerg   REGISTER_OVERLOADED_2(pointsTo);
11806f32e7eSjoerg   REGISTER_OVERLOADED_2(references);
11906f32e7eSjoerg   REGISTER_OVERLOADED_2(thisPointerType);
12006f32e7eSjoerg 
12106f32e7eSjoerg   std::unique_ptr<MatcherDescriptor> equalsCallbacks[] = {
12206f32e7eSjoerg       MATCHER_OVERLOAD_ENTRY(equals, 0),
12306f32e7eSjoerg       MATCHER_OVERLOAD_ENTRY(equals, 1),
12406f32e7eSjoerg       MATCHER_OVERLOAD_ENTRY(equals, 2),
12506f32e7eSjoerg   };
12606f32e7eSjoerg   REGISTER_MATCHER_OVERLOAD(equals);
12706f32e7eSjoerg 
128*13fbcb42Sjoerg   REGISTER_REGEX_MATCHER(isExpansionInFileMatching);
129*13fbcb42Sjoerg   REGISTER_REGEX_MATCHER(matchesName);
130*13fbcb42Sjoerg   REGISTER_REGEX_MATCHER(matchesSelector);
131*13fbcb42Sjoerg 
13206f32e7eSjoerg   REGISTER_MATCHER(accessSpecDecl);
13306f32e7eSjoerg   REGISTER_MATCHER(addrLabelExpr);
13406f32e7eSjoerg   REGISTER_MATCHER(alignOfExpr);
13506f32e7eSjoerg   REGISTER_MATCHER(allOf);
13606f32e7eSjoerg   REGISTER_MATCHER(anyOf);
13706f32e7eSjoerg   REGISTER_MATCHER(anything);
13806f32e7eSjoerg   REGISTER_MATCHER(argumentCountIs);
13906f32e7eSjoerg   REGISTER_MATCHER(arraySubscriptExpr);
14006f32e7eSjoerg   REGISTER_MATCHER(arrayType);
14106f32e7eSjoerg   REGISTER_MATCHER(asString);
14206f32e7eSjoerg   REGISTER_MATCHER(asmStmt);
14306f32e7eSjoerg   REGISTER_MATCHER(atomicExpr);
14406f32e7eSjoerg   REGISTER_MATCHER(atomicType);
14506f32e7eSjoerg   REGISTER_MATCHER(autoType);
14606f32e7eSjoerg   REGISTER_MATCHER(autoreleasePoolStmt)
14706f32e7eSjoerg   REGISTER_MATCHER(binaryConditionalOperator);
14806f32e7eSjoerg   REGISTER_MATCHER(binaryOperator);
149*13fbcb42Sjoerg   REGISTER_MATCHER(binaryOperation);
150*13fbcb42Sjoerg   REGISTER_MATCHER(bindingDecl);
15106f32e7eSjoerg   REGISTER_MATCHER(blockDecl);
15206f32e7eSjoerg   REGISTER_MATCHER(blockExpr);
15306f32e7eSjoerg   REGISTER_MATCHER(blockPointerType);
15406f32e7eSjoerg   REGISTER_MATCHER(booleanType);
15506f32e7eSjoerg   REGISTER_MATCHER(breakStmt);
15606f32e7eSjoerg   REGISTER_MATCHER(builtinType);
15706f32e7eSjoerg   REGISTER_MATCHER(cStyleCastExpr);
15806f32e7eSjoerg   REGISTER_MATCHER(callExpr);
15906f32e7eSjoerg   REGISTER_MATCHER(caseStmt);
16006f32e7eSjoerg   REGISTER_MATCHER(castExpr);
16106f32e7eSjoerg   REGISTER_MATCHER(characterLiteral);
16206f32e7eSjoerg   REGISTER_MATCHER(chooseExpr);
16306f32e7eSjoerg   REGISTER_MATCHER(classTemplateDecl);
164*13fbcb42Sjoerg   REGISTER_MATCHER(classTemplatePartialSpecializationDecl);
16506f32e7eSjoerg   REGISTER_MATCHER(classTemplateSpecializationDecl);
16606f32e7eSjoerg   REGISTER_MATCHER(complexType);
16706f32e7eSjoerg   REGISTER_MATCHER(compoundLiteralExpr);
16806f32e7eSjoerg   REGISTER_MATCHER(compoundStmt);
169*13fbcb42Sjoerg   REGISTER_MATCHER(coawaitExpr);
17006f32e7eSjoerg   REGISTER_MATCHER(conditionalOperator);
17106f32e7eSjoerg   REGISTER_MATCHER(constantArrayType);
17206f32e7eSjoerg   REGISTER_MATCHER(constantExpr);
17306f32e7eSjoerg   REGISTER_MATCHER(containsDeclaration);
17406f32e7eSjoerg   REGISTER_MATCHER(continueStmt);
175*13fbcb42Sjoerg   REGISTER_MATCHER(coreturnStmt);
176*13fbcb42Sjoerg   REGISTER_MATCHER(coyieldExpr);
17706f32e7eSjoerg   REGISTER_MATCHER(cudaKernelCallExpr);
178*13fbcb42Sjoerg   REGISTER_MATCHER(cxxBaseSpecifier);
17906f32e7eSjoerg   REGISTER_MATCHER(cxxBindTemporaryExpr);
18006f32e7eSjoerg   REGISTER_MATCHER(cxxBoolLiteral);
18106f32e7eSjoerg   REGISTER_MATCHER(cxxCatchStmt);
18206f32e7eSjoerg   REGISTER_MATCHER(cxxConstCastExpr);
18306f32e7eSjoerg   REGISTER_MATCHER(cxxConstructExpr);
18406f32e7eSjoerg   REGISTER_MATCHER(cxxConstructorDecl);
18506f32e7eSjoerg   REGISTER_MATCHER(cxxConversionDecl);
18606f32e7eSjoerg   REGISTER_MATCHER(cxxCtorInitializer);
18706f32e7eSjoerg   REGISTER_MATCHER(cxxDeductionGuideDecl);
18806f32e7eSjoerg   REGISTER_MATCHER(cxxDefaultArgExpr);
18906f32e7eSjoerg   REGISTER_MATCHER(cxxDeleteExpr);
19006f32e7eSjoerg   REGISTER_MATCHER(cxxDependentScopeMemberExpr);
19106f32e7eSjoerg   REGISTER_MATCHER(cxxDestructorDecl);
19206f32e7eSjoerg   REGISTER_MATCHER(cxxDynamicCastExpr);
19306f32e7eSjoerg   REGISTER_MATCHER(cxxForRangeStmt);
19406f32e7eSjoerg   REGISTER_MATCHER(cxxFunctionalCastExpr);
19506f32e7eSjoerg   REGISTER_MATCHER(cxxMemberCallExpr);
19606f32e7eSjoerg   REGISTER_MATCHER(cxxMethodDecl);
19706f32e7eSjoerg   REGISTER_MATCHER(cxxNewExpr);
198*13fbcb42Sjoerg   REGISTER_MATCHER(cxxNoexceptExpr);
19906f32e7eSjoerg   REGISTER_MATCHER(cxxNullPtrLiteralExpr);
20006f32e7eSjoerg   REGISTER_MATCHER(cxxOperatorCallExpr);
20106f32e7eSjoerg   REGISTER_MATCHER(cxxRecordDecl);
20206f32e7eSjoerg   REGISTER_MATCHER(cxxReinterpretCastExpr);
203*13fbcb42Sjoerg   REGISTER_MATCHER(cxxRewrittenBinaryOperator);
20406f32e7eSjoerg   REGISTER_MATCHER(cxxStaticCastExpr);
20506f32e7eSjoerg   REGISTER_MATCHER(cxxStdInitializerListExpr);
20606f32e7eSjoerg   REGISTER_MATCHER(cxxTemporaryObjectExpr);
20706f32e7eSjoerg   REGISTER_MATCHER(cxxThisExpr);
20806f32e7eSjoerg   REGISTER_MATCHER(cxxThrowExpr);
20906f32e7eSjoerg   REGISTER_MATCHER(cxxTryStmt);
21006f32e7eSjoerg   REGISTER_MATCHER(cxxUnresolvedConstructExpr);
21106f32e7eSjoerg   REGISTER_MATCHER(decayedType);
21206f32e7eSjoerg   REGISTER_MATCHER(decl);
213*13fbcb42Sjoerg   REGISTER_MATCHER(decompositionDecl);
21406f32e7eSjoerg   REGISTER_MATCHER(declCountIs);
21506f32e7eSjoerg   REGISTER_MATCHER(declRefExpr);
21606f32e7eSjoerg   REGISTER_MATCHER(declStmt);
21706f32e7eSjoerg   REGISTER_MATCHER(declaratorDecl);
21806f32e7eSjoerg   REGISTER_MATCHER(decltypeType);
219*13fbcb42Sjoerg   REGISTER_MATCHER(deducedTemplateSpecializationType);
22006f32e7eSjoerg   REGISTER_MATCHER(defaultStmt);
221*13fbcb42Sjoerg   REGISTER_MATCHER(dependentCoawaitExpr);
22206f32e7eSjoerg   REGISTER_MATCHER(dependentSizedArrayType);
22306f32e7eSjoerg   REGISTER_MATCHER(designatedInitExpr);
22406f32e7eSjoerg   REGISTER_MATCHER(designatorCountIs);
22506f32e7eSjoerg   REGISTER_MATCHER(doStmt);
22606f32e7eSjoerg   REGISTER_MATCHER(eachOf);
22706f32e7eSjoerg   REGISTER_MATCHER(elaboratedType);
22806f32e7eSjoerg   REGISTER_MATCHER(enumConstantDecl);
22906f32e7eSjoerg   REGISTER_MATCHER(enumDecl);
23006f32e7eSjoerg   REGISTER_MATCHER(enumType);
23106f32e7eSjoerg   REGISTER_MATCHER(equalsBoundNode);
23206f32e7eSjoerg   REGISTER_MATCHER(equalsIntegralValue);
23306f32e7eSjoerg   REGISTER_MATCHER(explicitCastExpr);
23406f32e7eSjoerg   REGISTER_MATCHER(expr);
23506f32e7eSjoerg   REGISTER_MATCHER(exprWithCleanups);
23606f32e7eSjoerg   REGISTER_MATCHER(fieldDecl);
237*13fbcb42Sjoerg   REGISTER_MATCHER(fixedPointLiteral);
23806f32e7eSjoerg   REGISTER_MATCHER(floatLiteral);
239*13fbcb42Sjoerg   REGISTER_MATCHER(forCallable);
240*13fbcb42Sjoerg   REGISTER_MATCHER(forDecomposition);
24106f32e7eSjoerg   REGISTER_MATCHER(forEach);
24206f32e7eSjoerg   REGISTER_MATCHER(forEachArgumentWithParam);
243*13fbcb42Sjoerg   REGISTER_MATCHER(forEachArgumentWithParamType);
24406f32e7eSjoerg   REGISTER_MATCHER(forEachConstructorInitializer);
24506f32e7eSjoerg   REGISTER_MATCHER(forEachDescendant);
24606f32e7eSjoerg   REGISTER_MATCHER(forEachOverridden);
24706f32e7eSjoerg   REGISTER_MATCHER(forEachSwitchCase);
24806f32e7eSjoerg   REGISTER_MATCHER(forField);
24906f32e7eSjoerg   REGISTER_MATCHER(forFunction);
25006f32e7eSjoerg   REGISTER_MATCHER(forStmt);
25106f32e7eSjoerg   REGISTER_MATCHER(friendDecl);
25206f32e7eSjoerg   REGISTER_MATCHER(functionDecl);
25306f32e7eSjoerg   REGISTER_MATCHER(functionProtoType);
25406f32e7eSjoerg   REGISTER_MATCHER(functionTemplateDecl);
25506f32e7eSjoerg   REGISTER_MATCHER(functionType);
256*13fbcb42Sjoerg   REGISTER_MATCHER(genericSelectionExpr);
25706f32e7eSjoerg   REGISTER_MATCHER(gnuNullExpr);
25806f32e7eSjoerg   REGISTER_MATCHER(gotoStmt);
25906f32e7eSjoerg   REGISTER_MATCHER(has);
26006f32e7eSjoerg   REGISTER_MATCHER(hasAncestor);
26106f32e7eSjoerg   REGISTER_MATCHER(hasAnyArgument);
262*13fbcb42Sjoerg   REGISTER_MATCHER(hasAnyBase);
263*13fbcb42Sjoerg   REGISTER_MATCHER(hasAnyBinding);
264*13fbcb42Sjoerg   REGISTER_MATCHER(hasAnyBody);
26506f32e7eSjoerg   REGISTER_MATCHER(hasAnyClause);
26606f32e7eSjoerg   REGISTER_MATCHER(hasAnyConstructorInitializer);
26706f32e7eSjoerg   REGISTER_MATCHER(hasAnyDeclaration);
26806f32e7eSjoerg   REGISTER_MATCHER(hasAnyName);
269*13fbcb42Sjoerg   REGISTER_MATCHER(hasAnyOperatorName);
270*13fbcb42Sjoerg   REGISTER_MATCHER(hasAnyOverloadedOperatorName);
27106f32e7eSjoerg   REGISTER_MATCHER(hasAnyParameter);
272*13fbcb42Sjoerg   REGISTER_MATCHER(hasAnyPlacementArg);
27306f32e7eSjoerg   REGISTER_MATCHER(hasAnySelector);
27406f32e7eSjoerg   REGISTER_MATCHER(hasAnySubstatement);
27506f32e7eSjoerg   REGISTER_MATCHER(hasAnyTemplateArgument);
27606f32e7eSjoerg   REGISTER_MATCHER(hasAnyUsingShadowDecl);
27706f32e7eSjoerg   REGISTER_MATCHER(hasArgument);
27806f32e7eSjoerg   REGISTER_MATCHER(hasArgumentOfType);
27906f32e7eSjoerg   REGISTER_MATCHER(hasArraySize);
28006f32e7eSjoerg   REGISTER_MATCHER(hasAttr);
28106f32e7eSjoerg   REGISTER_MATCHER(hasAutomaticStorageDuration);
28206f32e7eSjoerg   REGISTER_MATCHER(hasBase);
283*13fbcb42Sjoerg   REGISTER_MATCHER(hasBinding);
28406f32e7eSjoerg   REGISTER_MATCHER(hasBitWidth);
28506f32e7eSjoerg   REGISTER_MATCHER(hasBody);
28606f32e7eSjoerg   REGISTER_MATCHER(hasCanonicalType);
28706f32e7eSjoerg   REGISTER_MATCHER(hasCaseConstant);
28806f32e7eSjoerg   REGISTER_MATCHER(hasCastKind);
28906f32e7eSjoerg   REGISTER_MATCHER(hasCondition);
29006f32e7eSjoerg   REGISTER_MATCHER(hasConditionVariableStatement);
29106f32e7eSjoerg   REGISTER_MATCHER(hasDecayedType);
29206f32e7eSjoerg   REGISTER_MATCHER(hasDeclContext);
29306f32e7eSjoerg   REGISTER_MATCHER(hasDeclaration);
29406f32e7eSjoerg   REGISTER_MATCHER(hasDeducedType);
29506f32e7eSjoerg   REGISTER_MATCHER(hasDefaultArgument);
29606f32e7eSjoerg   REGISTER_MATCHER(hasDefinition);
29706f32e7eSjoerg   REGISTER_MATCHER(hasDescendant);
29806f32e7eSjoerg   REGISTER_MATCHER(hasDestinationType);
299*13fbcb42Sjoerg   REGISTER_MATCHER(hasDirectBase);
30006f32e7eSjoerg   REGISTER_MATCHER(hasDynamicExceptionSpec);
30106f32e7eSjoerg   REGISTER_MATCHER(hasEitherOperand);
30206f32e7eSjoerg   REGISTER_MATCHER(hasElementType);
30306f32e7eSjoerg   REGISTER_MATCHER(hasElse);
30406f32e7eSjoerg   REGISTER_MATCHER(hasExplicitSpecifier);
30506f32e7eSjoerg   REGISTER_MATCHER(hasExternalFormalLinkage);
30606f32e7eSjoerg   REGISTER_MATCHER(hasFalseExpression);
30706f32e7eSjoerg   REGISTER_MATCHER(hasGlobalStorage);
30806f32e7eSjoerg   REGISTER_MATCHER(hasImplicitDestinationType);
30906f32e7eSjoerg   REGISTER_MATCHER(hasInClassInitializer);
31006f32e7eSjoerg   REGISTER_MATCHER(hasIncrement);
31106f32e7eSjoerg   REGISTER_MATCHER(hasIndex);
31206f32e7eSjoerg   REGISTER_MATCHER(hasInit);
31306f32e7eSjoerg   REGISTER_MATCHER(hasInitializer);
314*13fbcb42Sjoerg   REGISTER_MATCHER(hasInitStatement);
31506f32e7eSjoerg   REGISTER_MATCHER(hasKeywordSelector);
31606f32e7eSjoerg   REGISTER_MATCHER(hasLHS);
31706f32e7eSjoerg   REGISTER_MATCHER(hasLocalQualifiers);
31806f32e7eSjoerg   REGISTER_MATCHER(hasLocalStorage);
31906f32e7eSjoerg   REGISTER_MATCHER(hasLoopInit);
32006f32e7eSjoerg   REGISTER_MATCHER(hasLoopVariable);
321*13fbcb42Sjoerg   REGISTER_MATCHER(hasMemberName);
32206f32e7eSjoerg   REGISTER_MATCHER(hasMethod);
32306f32e7eSjoerg   REGISTER_MATCHER(hasName);
32406f32e7eSjoerg   REGISTER_MATCHER(hasNullSelector);
32506f32e7eSjoerg   REGISTER_MATCHER(hasObjectExpression);
326*13fbcb42Sjoerg   REGISTER_MATCHER(hasOperands);
32706f32e7eSjoerg   REGISTER_MATCHER(hasOperatorName);
32806f32e7eSjoerg   REGISTER_MATCHER(hasOverloadedOperatorName);
32906f32e7eSjoerg   REGISTER_MATCHER(hasParameter);
33006f32e7eSjoerg   REGISTER_MATCHER(hasParent);
33106f32e7eSjoerg   REGISTER_MATCHER(hasQualifier);
33206f32e7eSjoerg   REGISTER_MATCHER(hasRHS);
33306f32e7eSjoerg   REGISTER_MATCHER(hasRangeInit);
33406f32e7eSjoerg   REGISTER_MATCHER(hasReceiver);
33506f32e7eSjoerg   REGISTER_MATCHER(hasReceiverType);
33606f32e7eSjoerg   REGISTER_MATCHER(hasReplacementType);
33706f32e7eSjoerg   REGISTER_MATCHER(hasReturnValue);
338*13fbcb42Sjoerg   REGISTER_MATCHER(hasPlacementArg);
33906f32e7eSjoerg   REGISTER_MATCHER(hasSelector);
34006f32e7eSjoerg   REGISTER_MATCHER(hasSingleDecl);
34106f32e7eSjoerg   REGISTER_MATCHER(hasSize);
34206f32e7eSjoerg   REGISTER_MATCHER(hasSizeExpr);
34306f32e7eSjoerg   REGISTER_MATCHER(hasSourceExpression);
34406f32e7eSjoerg   REGISTER_MATCHER(hasSpecializedTemplate);
34506f32e7eSjoerg   REGISTER_MATCHER(hasStaticStorageDuration);
34606f32e7eSjoerg   REGISTER_MATCHER(hasStructuredBlock);
34706f32e7eSjoerg   REGISTER_MATCHER(hasSyntacticForm);
34806f32e7eSjoerg   REGISTER_MATCHER(hasTargetDecl);
34906f32e7eSjoerg   REGISTER_MATCHER(hasTemplateArgument);
35006f32e7eSjoerg   REGISTER_MATCHER(hasThen);
35106f32e7eSjoerg   REGISTER_MATCHER(hasThreadStorageDuration);
35206f32e7eSjoerg   REGISTER_MATCHER(hasTrailingReturn);
35306f32e7eSjoerg   REGISTER_MATCHER(hasTrueExpression);
35406f32e7eSjoerg   REGISTER_MATCHER(hasTypeLoc);
35506f32e7eSjoerg   REGISTER_MATCHER(hasUnaryOperand);
35606f32e7eSjoerg   REGISTER_MATCHER(hasUnarySelector);
35706f32e7eSjoerg   REGISTER_MATCHER(hasUnderlyingDecl);
35806f32e7eSjoerg   REGISTER_MATCHER(hasUnderlyingType);
35906f32e7eSjoerg   REGISTER_MATCHER(hasUnqualifiedDesugaredType);
36006f32e7eSjoerg   REGISTER_MATCHER(hasValueType);
36106f32e7eSjoerg   REGISTER_MATCHER(ifStmt);
36206f32e7eSjoerg   REGISTER_MATCHER(ignoringElidableConstructorCall);
36306f32e7eSjoerg   REGISTER_MATCHER(ignoringImpCasts);
36406f32e7eSjoerg   REGISTER_MATCHER(ignoringImplicit);
36506f32e7eSjoerg   REGISTER_MATCHER(ignoringParenCasts);
36606f32e7eSjoerg   REGISTER_MATCHER(ignoringParenImpCasts);
36706f32e7eSjoerg   REGISTER_MATCHER(imaginaryLiteral);
36806f32e7eSjoerg   REGISTER_MATCHER(implicitCastExpr);
36906f32e7eSjoerg   REGISTER_MATCHER(implicitValueInitExpr);
37006f32e7eSjoerg   REGISTER_MATCHER(incompleteArrayType);
37106f32e7eSjoerg   REGISTER_MATCHER(indirectFieldDecl);
37206f32e7eSjoerg   REGISTER_MATCHER(initListExpr);
37306f32e7eSjoerg   REGISTER_MATCHER(injectedClassNameType);
37406f32e7eSjoerg   REGISTER_MATCHER(innerType);
37506f32e7eSjoerg   REGISTER_MATCHER(integerLiteral);
376*13fbcb42Sjoerg   REGISTER_MATCHER(invocation);
37706f32e7eSjoerg   REGISTER_MATCHER(isAllowedToContainClauseKind);
37806f32e7eSjoerg   REGISTER_MATCHER(isAnonymous);
37906f32e7eSjoerg   REGISTER_MATCHER(isAnyCharacter);
38006f32e7eSjoerg   REGISTER_MATCHER(isAnyPointer);
38106f32e7eSjoerg   REGISTER_MATCHER(isArray);
38206f32e7eSjoerg   REGISTER_MATCHER(isArrow);
38306f32e7eSjoerg   REGISTER_MATCHER(isAssignmentOperator);
384*13fbcb42Sjoerg   REGISTER_MATCHER(isAtPosition);
38506f32e7eSjoerg   REGISTER_MATCHER(isBaseInitializer);
38606f32e7eSjoerg   REGISTER_MATCHER(isBitField);
38706f32e7eSjoerg   REGISTER_MATCHER(isCatchAll);
38806f32e7eSjoerg   REGISTER_MATCHER(isClass);
38906f32e7eSjoerg   REGISTER_MATCHER(isClassMessage);
39006f32e7eSjoerg   REGISTER_MATCHER(isClassMethod);
391*13fbcb42Sjoerg   REGISTER_MATCHER(isComparisonOperator);
39206f32e7eSjoerg   REGISTER_MATCHER(isConst);
39306f32e7eSjoerg   REGISTER_MATCHER(isConstQualified);
39406f32e7eSjoerg   REGISTER_MATCHER(isConstexpr);
39506f32e7eSjoerg   REGISTER_MATCHER(isCopyAssignmentOperator);
39606f32e7eSjoerg   REGISTER_MATCHER(isCopyConstructor);
39706f32e7eSjoerg   REGISTER_MATCHER(isDefaultConstructor);
39806f32e7eSjoerg   REGISTER_MATCHER(isDefaulted);
39906f32e7eSjoerg   REGISTER_MATCHER(isDefinition);
40006f32e7eSjoerg   REGISTER_MATCHER(isDelegatingConstructor);
40106f32e7eSjoerg   REGISTER_MATCHER(isDeleted);
402*13fbcb42Sjoerg   REGISTER_MATCHER(isEnum);
40306f32e7eSjoerg   REGISTER_MATCHER(isExceptionVariable);
404*13fbcb42Sjoerg   REGISTER_MATCHER(isExpandedFromMacro);
40506f32e7eSjoerg   REGISTER_MATCHER(isExpansionInMainFile);
40606f32e7eSjoerg   REGISTER_MATCHER(isExpansionInSystemHeader);
40706f32e7eSjoerg   REGISTER_MATCHER(isExplicit);
40806f32e7eSjoerg   REGISTER_MATCHER(isExplicitTemplateSpecialization);
40906f32e7eSjoerg   REGISTER_MATCHER(isExpr);
41006f32e7eSjoerg   REGISTER_MATCHER(isExternC);
41106f32e7eSjoerg   REGISTER_MATCHER(isFinal);
412*13fbcb42Sjoerg   REGISTER_MATCHER(isFirstPrivateKind);
41306f32e7eSjoerg   REGISTER_MATCHER(isImplicit);
41406f32e7eSjoerg   REGISTER_MATCHER(isInStdNamespace);
41506f32e7eSjoerg   REGISTER_MATCHER(isInTemplateInstantiation);
41606f32e7eSjoerg   REGISTER_MATCHER(isInline);
41706f32e7eSjoerg   REGISTER_MATCHER(isInstanceMessage);
41806f32e7eSjoerg   REGISTER_MATCHER(isInstanceMethod);
41906f32e7eSjoerg   REGISTER_MATCHER(isInstantiated);
42006f32e7eSjoerg   REGISTER_MATCHER(isInstantiationDependent);
42106f32e7eSjoerg   REGISTER_MATCHER(isInteger);
42206f32e7eSjoerg   REGISTER_MATCHER(isIntegral);
42306f32e7eSjoerg   REGISTER_MATCHER(isLambda);
42406f32e7eSjoerg   REGISTER_MATCHER(isListInitialization);
42506f32e7eSjoerg   REGISTER_MATCHER(isMain);
42606f32e7eSjoerg   REGISTER_MATCHER(isMemberInitializer);
42706f32e7eSjoerg   REGISTER_MATCHER(isMoveAssignmentOperator);
42806f32e7eSjoerg   REGISTER_MATCHER(isMoveConstructor);
42906f32e7eSjoerg   REGISTER_MATCHER(isNoReturn);
43006f32e7eSjoerg   REGISTER_MATCHER(isNoThrow);
43106f32e7eSjoerg   REGISTER_MATCHER(isNoneKind);
43206f32e7eSjoerg   REGISTER_MATCHER(isOverride);
43306f32e7eSjoerg   REGISTER_MATCHER(isPrivate);
43406f32e7eSjoerg   REGISTER_MATCHER(isProtected);
43506f32e7eSjoerg   REGISTER_MATCHER(isPublic);
43606f32e7eSjoerg   REGISTER_MATCHER(isPure);
43706f32e7eSjoerg   REGISTER_MATCHER(isScoped);
43806f32e7eSjoerg   REGISTER_MATCHER(isSharedKind);
43906f32e7eSjoerg   REGISTER_MATCHER(isSignedInteger);
44006f32e7eSjoerg   REGISTER_MATCHER(isStandaloneDirective);
44106f32e7eSjoerg   REGISTER_MATCHER(isStaticLocal);
44206f32e7eSjoerg   REGISTER_MATCHER(isStaticStorageClass);
44306f32e7eSjoerg   REGISTER_MATCHER(isStruct);
44406f32e7eSjoerg   REGISTER_MATCHER(isTemplateInstantiation);
44506f32e7eSjoerg   REGISTER_MATCHER(isTypeDependent);
44606f32e7eSjoerg   REGISTER_MATCHER(isUnion);
44706f32e7eSjoerg   REGISTER_MATCHER(isUnsignedInteger);
44806f32e7eSjoerg   REGISTER_MATCHER(isUserProvided);
44906f32e7eSjoerg   REGISTER_MATCHER(isValueDependent);
45006f32e7eSjoerg   REGISTER_MATCHER(isVariadic);
45106f32e7eSjoerg   REGISTER_MATCHER(isVirtual);
45206f32e7eSjoerg   REGISTER_MATCHER(isVirtualAsWritten);
45306f32e7eSjoerg   REGISTER_MATCHER(isVolatileQualified);
454*13fbcb42Sjoerg   REGISTER_MATCHER(isWeak);
45506f32e7eSjoerg   REGISTER_MATCHER(isWritten);
45606f32e7eSjoerg   REGISTER_MATCHER(lValueReferenceType);
45706f32e7eSjoerg   REGISTER_MATCHER(labelDecl);
45806f32e7eSjoerg   REGISTER_MATCHER(labelStmt);
45906f32e7eSjoerg   REGISTER_MATCHER(lambdaExpr);
46006f32e7eSjoerg   REGISTER_MATCHER(linkageSpecDecl);
46106f32e7eSjoerg   REGISTER_MATCHER(materializeTemporaryExpr);
46206f32e7eSjoerg   REGISTER_MATCHER(member);
46306f32e7eSjoerg   REGISTER_MATCHER(memberExpr);
464*13fbcb42Sjoerg   REGISTER_MATCHER(memberHasSameNameAsBoundNode);
46506f32e7eSjoerg   REGISTER_MATCHER(memberPointerType);
46606f32e7eSjoerg   REGISTER_MATCHER(namedDecl);
46706f32e7eSjoerg   REGISTER_MATCHER(namesType);
46806f32e7eSjoerg   REGISTER_MATCHER(namespaceAliasDecl);
46906f32e7eSjoerg   REGISTER_MATCHER(namespaceDecl);
47006f32e7eSjoerg   REGISTER_MATCHER(nestedNameSpecifier);
47106f32e7eSjoerg   REGISTER_MATCHER(nestedNameSpecifierLoc);
47206f32e7eSjoerg   REGISTER_MATCHER(nonTypeTemplateParmDecl);
47306f32e7eSjoerg   REGISTER_MATCHER(nullPointerConstant);
47406f32e7eSjoerg   REGISTER_MATCHER(nullStmt);
47506f32e7eSjoerg   REGISTER_MATCHER(numSelectorArgs);
47606f32e7eSjoerg   REGISTER_MATCHER(objcCatchStmt);
47706f32e7eSjoerg   REGISTER_MATCHER(objcCategoryDecl);
47806f32e7eSjoerg   REGISTER_MATCHER(objcCategoryImplDecl);
47906f32e7eSjoerg   REGISTER_MATCHER(objcFinallyStmt);
48006f32e7eSjoerg   REGISTER_MATCHER(objcImplementationDecl);
48106f32e7eSjoerg   REGISTER_MATCHER(objcInterfaceDecl);
48206f32e7eSjoerg   REGISTER_MATCHER(objcIvarDecl);
48306f32e7eSjoerg   REGISTER_MATCHER(objcIvarRefExpr);
48406f32e7eSjoerg   REGISTER_MATCHER(objcMessageExpr);
48506f32e7eSjoerg   REGISTER_MATCHER(objcMethodDecl);
48606f32e7eSjoerg   REGISTER_MATCHER(objcObjectPointerType);
48706f32e7eSjoerg   REGISTER_MATCHER(objcPropertyDecl);
48806f32e7eSjoerg   REGISTER_MATCHER(objcProtocolDecl);
48906f32e7eSjoerg   REGISTER_MATCHER(objcThrowStmt);
49006f32e7eSjoerg   REGISTER_MATCHER(objcTryStmt);
49106f32e7eSjoerg   REGISTER_MATCHER(ofClass);
492*13fbcb42Sjoerg   REGISTER_MATCHER(ofKind);
49306f32e7eSjoerg   REGISTER_MATCHER(ompDefaultClause);
49406f32e7eSjoerg   REGISTER_MATCHER(ompExecutableDirective);
49506f32e7eSjoerg   REGISTER_MATCHER(on);
49606f32e7eSjoerg   REGISTER_MATCHER(onImplicitObjectArgument);
49706f32e7eSjoerg   REGISTER_MATCHER(opaqueValueExpr);
498*13fbcb42Sjoerg   REGISTER_MATCHER(optionally);
49906f32e7eSjoerg   REGISTER_MATCHER(parameterCountIs);
50006f32e7eSjoerg   REGISTER_MATCHER(parenExpr);
50106f32e7eSjoerg   REGISTER_MATCHER(parenListExpr);
50206f32e7eSjoerg   REGISTER_MATCHER(parenType);
50306f32e7eSjoerg   REGISTER_MATCHER(parmVarDecl);
50406f32e7eSjoerg   REGISTER_MATCHER(pointee);
50506f32e7eSjoerg   REGISTER_MATCHER(pointerType);
50606f32e7eSjoerg   REGISTER_MATCHER(predefinedExpr);
50706f32e7eSjoerg   REGISTER_MATCHER(qualType);
50806f32e7eSjoerg   REGISTER_MATCHER(rValueReferenceType);
50906f32e7eSjoerg   REGISTER_MATCHER(realFloatingPointType);
51006f32e7eSjoerg   REGISTER_MATCHER(recordDecl);
51106f32e7eSjoerg   REGISTER_MATCHER(recordType);
51206f32e7eSjoerg   REGISTER_MATCHER(referenceType);
51306f32e7eSjoerg   REGISTER_MATCHER(refersToDeclaration);
51406f32e7eSjoerg   REGISTER_MATCHER(refersToIntegralType);
51506f32e7eSjoerg   REGISTER_MATCHER(refersToTemplate);
51606f32e7eSjoerg   REGISTER_MATCHER(refersToType);
51706f32e7eSjoerg   REGISTER_MATCHER(requiresZeroInitialization);
51806f32e7eSjoerg   REGISTER_MATCHER(returnStmt);
51906f32e7eSjoerg   REGISTER_MATCHER(returns);
52006f32e7eSjoerg   REGISTER_MATCHER(sizeOfExpr);
52106f32e7eSjoerg   REGISTER_MATCHER(specifiesNamespace);
52206f32e7eSjoerg   REGISTER_MATCHER(specifiesType);
52306f32e7eSjoerg   REGISTER_MATCHER(specifiesTypeLoc);
52406f32e7eSjoerg   REGISTER_MATCHER(statementCountIs);
52506f32e7eSjoerg   REGISTER_MATCHER(staticAssertDecl);
52606f32e7eSjoerg   REGISTER_MATCHER(stmt);
52706f32e7eSjoerg   REGISTER_MATCHER(stmtExpr);
52806f32e7eSjoerg   REGISTER_MATCHER(stringLiteral);
52906f32e7eSjoerg   REGISTER_MATCHER(substNonTypeTemplateParmExpr);
53006f32e7eSjoerg   REGISTER_MATCHER(substTemplateTypeParmType);
53106f32e7eSjoerg   REGISTER_MATCHER(switchCase);
53206f32e7eSjoerg   REGISTER_MATCHER(switchStmt);
533*13fbcb42Sjoerg   REGISTER_MATCHER(tagDecl);
53406f32e7eSjoerg   REGISTER_MATCHER(tagType);
53506f32e7eSjoerg   REGISTER_MATCHER(templateArgument);
53606f32e7eSjoerg   REGISTER_MATCHER(templateArgumentCountIs);
537*13fbcb42Sjoerg   REGISTER_MATCHER(templateArgumentLoc);
53806f32e7eSjoerg   REGISTER_MATCHER(templateName);
53906f32e7eSjoerg   REGISTER_MATCHER(templateSpecializationType);
540*13fbcb42Sjoerg   REGISTER_MATCHER(templateTemplateParmDecl);
54106f32e7eSjoerg   REGISTER_MATCHER(templateTypeParmDecl);
54206f32e7eSjoerg   REGISTER_MATCHER(templateTypeParmType);
54306f32e7eSjoerg   REGISTER_MATCHER(throughUsingDecl);
54406f32e7eSjoerg   REGISTER_MATCHER(to);
54506f32e7eSjoerg   REGISTER_MATCHER(translationUnitDecl);
54606f32e7eSjoerg   REGISTER_MATCHER(type);
54706f32e7eSjoerg   REGISTER_MATCHER(typeAliasDecl);
54806f32e7eSjoerg   REGISTER_MATCHER(typeAliasTemplateDecl);
54906f32e7eSjoerg   REGISTER_MATCHER(typeLoc);
55006f32e7eSjoerg   REGISTER_MATCHER(typedefDecl);
55106f32e7eSjoerg   REGISTER_MATCHER(typedefNameDecl);
55206f32e7eSjoerg   REGISTER_MATCHER(typedefType);
55306f32e7eSjoerg   REGISTER_MATCHER(unaryExprOrTypeTraitExpr);
55406f32e7eSjoerg   REGISTER_MATCHER(unaryOperator);
55506f32e7eSjoerg   REGISTER_MATCHER(unaryTransformType);
55606f32e7eSjoerg   REGISTER_MATCHER(unless);
55706f32e7eSjoerg   REGISTER_MATCHER(unresolvedLookupExpr);
55806f32e7eSjoerg   REGISTER_MATCHER(unresolvedMemberExpr);
55906f32e7eSjoerg   REGISTER_MATCHER(unresolvedUsingTypenameDecl);
56006f32e7eSjoerg   REGISTER_MATCHER(unresolvedUsingValueDecl);
56106f32e7eSjoerg   REGISTER_MATCHER(userDefinedLiteral);
56206f32e7eSjoerg   REGISTER_MATCHER(usesADL);
56306f32e7eSjoerg   REGISTER_MATCHER(usingDecl);
56406f32e7eSjoerg   REGISTER_MATCHER(usingDirectiveDecl);
56506f32e7eSjoerg   REGISTER_MATCHER(valueDecl);
56606f32e7eSjoerg   REGISTER_MATCHER(varDecl);
56706f32e7eSjoerg   REGISTER_MATCHER(variableArrayType);
56806f32e7eSjoerg   REGISTER_MATCHER(voidType);
56906f32e7eSjoerg   REGISTER_MATCHER(whileStmt);
57006f32e7eSjoerg   REGISTER_MATCHER(withInitializer);
57106f32e7eSjoerg }
57206f32e7eSjoerg 
57306f32e7eSjoerg RegistryMaps::~RegistryMaps() = default;
57406f32e7eSjoerg 
57506f32e7eSjoerg static llvm::ManagedStatic<RegistryMaps> RegistryData;
57606f32e7eSjoerg 
nodeMatcherType(MatcherCtor Ctor)577*13fbcb42Sjoerg ASTNodeKind Registry::nodeMatcherType(MatcherCtor Ctor) {
578*13fbcb42Sjoerg   return Ctor->nodeMatcherType();
579*13fbcb42Sjoerg }
580*13fbcb42Sjoerg 
MatcherDescriptorPtr(MatcherDescriptor * Ptr)581*13fbcb42Sjoerg internal::MatcherDescriptorPtr::MatcherDescriptorPtr(MatcherDescriptor *Ptr)
582*13fbcb42Sjoerg     : Ptr(Ptr) {}
583*13fbcb42Sjoerg 
~MatcherDescriptorPtr()584*13fbcb42Sjoerg internal::MatcherDescriptorPtr::~MatcherDescriptorPtr() { delete Ptr; }
585*13fbcb42Sjoerg 
isBuilderMatcher(MatcherCtor Ctor)586*13fbcb42Sjoerg bool Registry::isBuilderMatcher(MatcherCtor Ctor) {
587*13fbcb42Sjoerg   return Ctor->isBuilderMatcher();
588*13fbcb42Sjoerg }
589*13fbcb42Sjoerg 
590*13fbcb42Sjoerg internal::MatcherDescriptorPtr
buildMatcherCtor(MatcherCtor Ctor,SourceRange NameRange,ArrayRef<ParserValue> Args,Diagnostics * Error)591*13fbcb42Sjoerg Registry::buildMatcherCtor(MatcherCtor Ctor, SourceRange NameRange,
592*13fbcb42Sjoerg                            ArrayRef<ParserValue> Args, Diagnostics *Error) {
593*13fbcb42Sjoerg   return internal::MatcherDescriptorPtr(
594*13fbcb42Sjoerg       Ctor->buildMatcherCtor(NameRange, Args, Error).release());
595*13fbcb42Sjoerg }
596*13fbcb42Sjoerg 
59706f32e7eSjoerg // static
lookupMatcherCtor(StringRef MatcherName)59806f32e7eSjoerg llvm::Optional<MatcherCtor> Registry::lookupMatcherCtor(StringRef MatcherName) {
59906f32e7eSjoerg   auto it = RegistryData->constructors().find(MatcherName);
60006f32e7eSjoerg   return it == RegistryData->constructors().end()
60106f32e7eSjoerg              ? llvm::Optional<MatcherCtor>()
60206f32e7eSjoerg              : it->second.get();
60306f32e7eSjoerg }
60406f32e7eSjoerg 
operator <<(llvm::raw_ostream & OS,const std::set<ASTNodeKind> & KS)60506f32e7eSjoerg static llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
60606f32e7eSjoerg                                      const std::set<ASTNodeKind> &KS) {
60706f32e7eSjoerg   unsigned Count = 0;
60806f32e7eSjoerg   for (std::set<ASTNodeKind>::const_iterator I = KS.begin(), E = KS.end();
60906f32e7eSjoerg        I != E; ++I) {
61006f32e7eSjoerg     if (I != KS.begin())
61106f32e7eSjoerg       OS << "|";
61206f32e7eSjoerg     if (Count++ == 3) {
61306f32e7eSjoerg       OS << "...";
61406f32e7eSjoerg       break;
61506f32e7eSjoerg     }
61606f32e7eSjoerg     OS << *I;
61706f32e7eSjoerg   }
61806f32e7eSjoerg   return OS;
61906f32e7eSjoerg }
62006f32e7eSjoerg 
getAcceptedCompletionTypes(ArrayRef<std::pair<MatcherCtor,unsigned>> Context)62106f32e7eSjoerg std::vector<ArgKind> Registry::getAcceptedCompletionTypes(
62206f32e7eSjoerg     ArrayRef<std::pair<MatcherCtor, unsigned>> Context) {
62306f32e7eSjoerg   ASTNodeKind InitialTypes[] = {
62406f32e7eSjoerg       ASTNodeKind::getFromNodeKind<Decl>(),
62506f32e7eSjoerg       ASTNodeKind::getFromNodeKind<QualType>(),
62606f32e7eSjoerg       ASTNodeKind::getFromNodeKind<Type>(),
62706f32e7eSjoerg       ASTNodeKind::getFromNodeKind<Stmt>(),
62806f32e7eSjoerg       ASTNodeKind::getFromNodeKind<NestedNameSpecifier>(),
62906f32e7eSjoerg       ASTNodeKind::getFromNodeKind<NestedNameSpecifierLoc>(),
63006f32e7eSjoerg       ASTNodeKind::getFromNodeKind<TypeLoc>()};
63106f32e7eSjoerg 
63206f32e7eSjoerg   // Starting with the above seed of acceptable top-level matcher types, compute
63306f32e7eSjoerg   // the acceptable type set for the argument indicated by each context element.
634*13fbcb42Sjoerg   std::set<ArgKind> TypeSet;
635*13fbcb42Sjoerg   for (auto IT : InitialTypes) {
636*13fbcb42Sjoerg     TypeSet.insert(ArgKind::MakeMatcherArg(IT));
637*13fbcb42Sjoerg   }
63806f32e7eSjoerg   for (const auto &CtxEntry : Context) {
63906f32e7eSjoerg     MatcherCtor Ctor = CtxEntry.first;
64006f32e7eSjoerg     unsigned ArgNumber = CtxEntry.second;
64106f32e7eSjoerg     std::vector<ArgKind> NextTypeSet;
64206f32e7eSjoerg     for (const ArgKind &Kind : TypeSet) {
64306f32e7eSjoerg       if (Kind.getArgKind() == Kind.AK_Matcher &&
64406f32e7eSjoerg           Ctor->isConvertibleTo(Kind.getMatcherKind()) &&
64506f32e7eSjoerg           (Ctor->isVariadic() || ArgNumber < Ctor->getNumArgs()))
64606f32e7eSjoerg         Ctor->getArgKinds(Kind.getMatcherKind(), ArgNumber, NextTypeSet);
64706f32e7eSjoerg     }
64806f32e7eSjoerg     TypeSet.clear();
64906f32e7eSjoerg     TypeSet.insert(NextTypeSet.begin(), NextTypeSet.end());
65006f32e7eSjoerg   }
65106f32e7eSjoerg   return std::vector<ArgKind>(TypeSet.begin(), TypeSet.end());
65206f32e7eSjoerg }
65306f32e7eSjoerg 
65406f32e7eSjoerg std::vector<MatcherCompletion>
getMatcherCompletions(ArrayRef<ArgKind> AcceptedTypes)65506f32e7eSjoerg Registry::getMatcherCompletions(ArrayRef<ArgKind> AcceptedTypes) {
65606f32e7eSjoerg   std::vector<MatcherCompletion> Completions;
65706f32e7eSjoerg 
65806f32e7eSjoerg   // Search the registry for acceptable matchers.
65906f32e7eSjoerg   for (const auto &M : RegistryData->constructors()) {
66006f32e7eSjoerg     const MatcherDescriptor& Matcher = *M.getValue();
66106f32e7eSjoerg     StringRef Name = M.getKey();
66206f32e7eSjoerg 
66306f32e7eSjoerg     std::set<ASTNodeKind> RetKinds;
66406f32e7eSjoerg     unsigned NumArgs = Matcher.isVariadic() ? 1 : Matcher.getNumArgs();
66506f32e7eSjoerg     bool IsPolymorphic = Matcher.isPolymorphic();
66606f32e7eSjoerg     std::vector<std::vector<ArgKind>> ArgsKinds(NumArgs);
66706f32e7eSjoerg     unsigned MaxSpecificity = 0;
668*13fbcb42Sjoerg     bool NodeArgs = false;
66906f32e7eSjoerg     for (const ArgKind& Kind : AcceptedTypes) {
670*13fbcb42Sjoerg       if (Kind.getArgKind() != Kind.AK_Matcher &&
671*13fbcb42Sjoerg           Kind.getArgKind() != Kind.AK_Node) {
67206f32e7eSjoerg         continue;
673*13fbcb42Sjoerg       }
674*13fbcb42Sjoerg 
675*13fbcb42Sjoerg       if (Kind.getArgKind() == Kind.AK_Node) {
676*13fbcb42Sjoerg         NodeArgs = true;
677*13fbcb42Sjoerg         unsigned Specificity;
678*13fbcb42Sjoerg         ASTNodeKind LeastDerivedKind;
679*13fbcb42Sjoerg         if (Matcher.isConvertibleTo(Kind.getNodeKind(), &Specificity,
680*13fbcb42Sjoerg                                     &LeastDerivedKind)) {
681*13fbcb42Sjoerg           if (MaxSpecificity < Specificity)
682*13fbcb42Sjoerg             MaxSpecificity = Specificity;
683*13fbcb42Sjoerg           RetKinds.insert(LeastDerivedKind);
684*13fbcb42Sjoerg           for (unsigned Arg = 0; Arg != NumArgs; ++Arg)
685*13fbcb42Sjoerg             Matcher.getArgKinds(Kind.getNodeKind(), Arg, ArgsKinds[Arg]);
686*13fbcb42Sjoerg           if (IsPolymorphic)
687*13fbcb42Sjoerg             break;
688*13fbcb42Sjoerg         }
689*13fbcb42Sjoerg       } else {
69006f32e7eSjoerg         unsigned Specificity;
69106f32e7eSjoerg         ASTNodeKind LeastDerivedKind;
69206f32e7eSjoerg         if (Matcher.isConvertibleTo(Kind.getMatcherKind(), &Specificity,
69306f32e7eSjoerg                                     &LeastDerivedKind)) {
69406f32e7eSjoerg           if (MaxSpecificity < Specificity)
69506f32e7eSjoerg             MaxSpecificity = Specificity;
69606f32e7eSjoerg           RetKinds.insert(LeastDerivedKind);
69706f32e7eSjoerg           for (unsigned Arg = 0; Arg != NumArgs; ++Arg)
69806f32e7eSjoerg             Matcher.getArgKinds(Kind.getMatcherKind(), Arg, ArgsKinds[Arg]);
69906f32e7eSjoerg           if (IsPolymorphic)
70006f32e7eSjoerg             break;
70106f32e7eSjoerg         }
70206f32e7eSjoerg       }
703*13fbcb42Sjoerg     }
70406f32e7eSjoerg 
70506f32e7eSjoerg     if (!RetKinds.empty() && MaxSpecificity > 0) {
70606f32e7eSjoerg       std::string Decl;
70706f32e7eSjoerg       llvm::raw_string_ostream OS(Decl);
70806f32e7eSjoerg 
709*13fbcb42Sjoerg       std::string TypedText = std::string(Name);
710*13fbcb42Sjoerg 
711*13fbcb42Sjoerg       if (NodeArgs) {
712*13fbcb42Sjoerg         OS << Name;
713*13fbcb42Sjoerg       } else {
714*13fbcb42Sjoerg 
71506f32e7eSjoerg         if (IsPolymorphic) {
71606f32e7eSjoerg           OS << "Matcher<T> " << Name << "(Matcher<T>";
71706f32e7eSjoerg         } else {
71806f32e7eSjoerg           OS << "Matcher<" << RetKinds << "> " << Name << "(";
71906f32e7eSjoerg           for (const std::vector<ArgKind> &Arg : ArgsKinds) {
72006f32e7eSjoerg             if (&Arg != &ArgsKinds[0])
72106f32e7eSjoerg               OS << ", ";
72206f32e7eSjoerg 
72306f32e7eSjoerg             bool FirstArgKind = true;
72406f32e7eSjoerg             std::set<ASTNodeKind> MatcherKinds;
72506f32e7eSjoerg             // Two steps. First all non-matchers, then matchers only.
72606f32e7eSjoerg             for (const ArgKind &AK : Arg) {
72706f32e7eSjoerg               if (AK.getArgKind() == ArgKind::AK_Matcher) {
72806f32e7eSjoerg                 MatcherKinds.insert(AK.getMatcherKind());
72906f32e7eSjoerg               } else {
730*13fbcb42Sjoerg                 if (!FirstArgKind)
731*13fbcb42Sjoerg                   OS << "|";
73206f32e7eSjoerg                 FirstArgKind = false;
73306f32e7eSjoerg                 OS << AK.asString();
73406f32e7eSjoerg               }
73506f32e7eSjoerg             }
73606f32e7eSjoerg             if (!MatcherKinds.empty()) {
73706f32e7eSjoerg               if (!FirstArgKind) OS << "|";
73806f32e7eSjoerg               OS << "Matcher<" << MatcherKinds << ">";
73906f32e7eSjoerg             }
74006f32e7eSjoerg           }
74106f32e7eSjoerg         }
74206f32e7eSjoerg         if (Matcher.isVariadic())
74306f32e7eSjoerg           OS << "...";
74406f32e7eSjoerg         OS << ")";
74506f32e7eSjoerg 
74606f32e7eSjoerg         TypedText += "(";
74706f32e7eSjoerg         if (ArgsKinds.empty())
74806f32e7eSjoerg           TypedText += ")";
74906f32e7eSjoerg         else if (ArgsKinds[0][0].getArgKind() == ArgKind::AK_String)
75006f32e7eSjoerg           TypedText += "\"";
751*13fbcb42Sjoerg       }
75206f32e7eSjoerg 
75306f32e7eSjoerg       Completions.emplace_back(TypedText, OS.str(), MaxSpecificity);
75406f32e7eSjoerg     }
75506f32e7eSjoerg   }
75606f32e7eSjoerg 
75706f32e7eSjoerg   return Completions;
75806f32e7eSjoerg }
75906f32e7eSjoerg 
constructMatcher(MatcherCtor Ctor,SourceRange NameRange,ArrayRef<ParserValue> Args,Diagnostics * Error)76006f32e7eSjoerg VariantMatcher Registry::constructMatcher(MatcherCtor Ctor,
76106f32e7eSjoerg                                           SourceRange NameRange,
76206f32e7eSjoerg                                           ArrayRef<ParserValue> Args,
76306f32e7eSjoerg                                           Diagnostics *Error) {
76406f32e7eSjoerg   return Ctor->create(NameRange, Args, Error);
76506f32e7eSjoerg }
76606f32e7eSjoerg 
constructBoundMatcher(MatcherCtor Ctor,SourceRange NameRange,StringRef BindID,ArrayRef<ParserValue> Args,Diagnostics * Error)76706f32e7eSjoerg VariantMatcher Registry::constructBoundMatcher(MatcherCtor Ctor,
76806f32e7eSjoerg                                                SourceRange NameRange,
76906f32e7eSjoerg                                                StringRef BindID,
77006f32e7eSjoerg                                                ArrayRef<ParserValue> Args,
77106f32e7eSjoerg                                                Diagnostics *Error) {
77206f32e7eSjoerg   VariantMatcher Out = constructMatcher(Ctor, NameRange, Args, Error);
77306f32e7eSjoerg   if (Out.isNull()) return Out;
77406f32e7eSjoerg 
77506f32e7eSjoerg   llvm::Optional<DynTypedMatcher> Result = Out.getSingleMatcher();
77606f32e7eSjoerg   if (Result.hasValue()) {
77706f32e7eSjoerg     llvm::Optional<DynTypedMatcher> Bound = Result->tryBind(BindID);
77806f32e7eSjoerg     if (Bound.hasValue()) {
77906f32e7eSjoerg       return VariantMatcher::SingleMatcher(*Bound);
78006f32e7eSjoerg     }
78106f32e7eSjoerg   }
78206f32e7eSjoerg   Error->addError(NameRange, Error->ET_RegistryNotBindable);
78306f32e7eSjoerg   return VariantMatcher();
78406f32e7eSjoerg }
78506f32e7eSjoerg 
78606f32e7eSjoerg } // namespace dynamic
78706f32e7eSjoerg } // namespace ast_matchers
78806f32e7eSjoerg } // namespace clang
789