1e30903d99ca2d530f95f22430a9a01fe2e1921d4Samuel Benzaquen//===--- Registry.cpp - Matcher registry -------------------------===//
2f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek//
3f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek//                     The LLVM Compiler Infrastructure
4f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek//
5f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// This file is distributed under the University of Illinois Open Source
6f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// License. See LICENSE.TXT for details.
7f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek//
8e30903d99ca2d530f95f22430a9a01fe2e1921d4Samuel Benzaquen//===------------------------------------------------------------===//
9f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek///
10f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// \file
11f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// \brief Registry map populated at static initialization time.
12f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek///
13e30903d99ca2d530f95f22430a9a01fe2e1921d4Samuel Benzaquen//===------------------------------------------------------------===//
14f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek
15f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "clang/ASTMatchers/Dynamic/Registry.h"
16f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "Marshallers.h"
17f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "clang/ASTMatchers/ASTMatchers.h"
18f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "llvm/ADT/StringMap.h"
19f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "llvm/ADT/StringRef.h"
20f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "llvm/Support/ManagedStatic.h"
21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <set>
22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <utility>
23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesusing namespace clang::ast_type_traits;
25f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek
26f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimeknamespace clang {
27f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimeknamespace ast_matchers {
28f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimeknamespace dynamic {
29f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimeknamespace {
30f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesusing internal::MatcherDescriptor;
32f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestypedef llvm::StringMap<const MatcherDescriptor *> ConstructorMap;
34f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekclass RegistryMaps {
35f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekpublic:
36f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  RegistryMaps();
37f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  ~RegistryMaps();
38f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek
39f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  const ConstructorMap &constructors() const { return Constructors; }
40f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek
41f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekprivate:
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void registerMatcher(StringRef MatcherName, MatcherDescriptor *Callback);
43f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  ConstructorMap Constructors;
44f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek};
45f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek
46f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekvoid RegistryMaps::registerMatcher(StringRef MatcherName,
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                   MatcherDescriptor *Callback) {
487a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  assert(Constructors.find(MatcherName) == Constructors.end());
49f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  Constructors[MatcherName] = Callback;
50f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek}
51f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek
52f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#define REGISTER_MATCHER(name)                                                 \
53f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  registerMatcher(#name, internal::makeMatcherAutoMarshall(                    \
54f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek                             ::clang::ast_matchers::name, #name));
55f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek
560e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen#define SPECIFIC_MATCHER_OVERLOAD(name, Id)                                    \
570e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen  static_cast< ::clang::ast_matchers::name##_Type##Id>(                        \
580e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen      ::clang::ast_matchers::name)
590e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen
600e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen#define REGISTER_OVERLOADED_2(name)                                            \
610e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen  do {                                                                         \
62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    MatcherDescriptor *Callbacks[] = {                                         \
630e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen      internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, 0),    \
640e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen                                        #name),                                \
650e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen      internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, 1),    \
660e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen                                        #name)                                 \
670e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen    };                                                                         \
68ee0da9520fe94f701240e9e1c97773ee412be102Samuel Benzaquen    registerMatcher(#name,                                                     \
69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                    new internal::OverloadedMatcherDescriptor(Callbacks));     \
706de440e1989ee7932c942dcba85e862c31bf4604Samuel Benzaquen  } while (0)
716de440e1989ee7932c942dcba85e862c31bf4604Samuel Benzaquen
72f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// \brief Generate a registry map with all the known matchers.
73f7f295f321fd434e1e542844a71f538a56f2f8fbManuel KlimekRegistryMaps::RegistryMaps() {
747a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  // TODO: Here is the list of the missing matchers, grouped by reason.
757a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  //
767a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  // Need Variant/Parser fixes:
777a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  // ofKind
787a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  //
797a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  // Polymorphic + argument overload:
807a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  // findAll
817a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  //
827a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  // Other:
837a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  // equals
847a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  // equalsNode
85f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek
860e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen  REGISTER_OVERLOADED_2(callee);
870e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen  REGISTER_OVERLOADED_2(hasPrefix);
880e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen  REGISTER_OVERLOADED_2(hasType);
890e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen  REGISTER_OVERLOADED_2(isDerivedFrom);
900e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen  REGISTER_OVERLOADED_2(isSameOrDerivedFrom);
91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_OVERLOADED_2(loc);
920e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen  REGISTER_OVERLOADED_2(pointsTo);
930e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen  REGISTER_OVERLOADED_2(references);
940e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen  REGISTER_OVERLOADED_2(thisPointerType);
950e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen
967a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(accessSpecDecl);
977a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(alignOfExpr);
98a735090449197f1edcdc85a6080eebc0304a31ddSamuel Benzaquen  REGISTER_MATCHER(allOf);
99a735090449197f1edcdc85a6080eebc0304a31ddSamuel Benzaquen  REGISTER_MATCHER(anyOf);
100ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen  REGISTER_MATCHER(anything);
101ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen  REGISTER_MATCHER(argumentCountIs);
1027a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(arraySubscriptExpr);
1037a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(arrayType);
1047a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(asmStmt);
105176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(asString);
1067a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(atomicType);
1077a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(autoType);
108f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(binaryOperator);
109f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(bindTemporaryExpr);
1107a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(blockPointerType);
111f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(boolLiteral);
1127a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(breakStmt);
1137a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(builtinType);
114f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(callExpr);
115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(caseStmt);
1167a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(castExpr);
1177a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(catchStmt);
118f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(characterLiteral);
1197a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(classTemplateDecl);
1207a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(classTemplateSpecializationDecl);
1217a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(complexType);
1227a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(compoundLiteralExpr);
123f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(compoundStmt);
124f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(conditionalOperator);
1257a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(constantArrayType);
126176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(constCastExpr);
127f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(constructExpr);
128f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(constructorDecl);
1297a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(containsDeclaration);
1307a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(continueStmt);
131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(cStyleCastExpr);
13230d405bf736e1f5280e49cc0a7f93c28cfc690d8Stefanus Du Toit  REGISTER_MATCHER(ctorInitializer);
133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(CUDAKernelCallExpr);
1347a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(decl);
135176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(declaratorDecl);
1367a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(declCountIs);
137f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(declRefExpr);
138f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(declStmt);
139f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(defaultArgExpr);
140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(defaultStmt);
1417a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(deleteExpr);
1427a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(dependentSizedArrayType);
1437a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(destructorDecl);
144f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(doStmt);
145f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(dynamicCastExpr);
146a735090449197f1edcdc85a6080eebc0304a31ddSamuel Benzaquen  REGISTER_MATCHER(eachOf);
1477a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(elaboratedType);
1487a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(enumConstantDecl);
1497a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(enumDecl);
150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(equalsBoundNode);
151176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(equalsIntegralValue);
152f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(explicitCastExpr);
153f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(expr);
154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(exprWithCleanups);
155f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(fieldDecl);
156c5ae717c2b774bfce6bce4bb51072f664b2d54aaDaniel Jasper  REGISTER_MATCHER(floatLiteral);
157ee0da9520fe94f701240e9e1c97773ee412be102Samuel Benzaquen  REGISTER_MATCHER(forEach);
158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(forEachConstructorInitializer);
159ee0da9520fe94f701240e9e1c97773ee412be102Samuel Benzaquen  REGISTER_MATCHER(forEachDescendant);
160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(forEachSwitchCase);
16186e4d744eaa44f7e674e41074913d8ed61f1d433Samuel Benzaquen  REGISTER_MATCHER(forField);
1627a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(forRangeStmt);
163f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(forStmt);
164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(friendDecl);
165176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(functionalCastExpr);
166f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(functionDecl);
1677a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(functionTemplateDecl);
1687a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(functionType);
1697a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(gotoStmt);
170ee0da9520fe94f701240e9e1c97773ee412be102Samuel Benzaquen  REGISTER_MATCHER(has);
171ee0da9520fe94f701240e9e1c97773ee412be102Samuel Benzaquen  REGISTER_MATCHER(hasAncestor);
172ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen  REGISTER_MATCHER(hasAnyArgument);
17386e4d744eaa44f7e674e41074913d8ed61f1d433Samuel Benzaquen  REGISTER_MATCHER(hasAnyConstructorInitializer);
174f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(hasAnyParameter);
175f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(hasAnySubstatement);
176671840a66f63f55705175e51fb44f77a55e0e3b6Samuel Benzaquen  REGISTER_MATCHER(hasAnyTemplateArgument);
1777a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(hasAnyUsingShadowDecl);
178ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen  REGISTER_MATCHER(hasArgument);
1797a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(hasArgumentOfType);
180176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(hasAttr);
1817a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(hasBase);
182ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen  REGISTER_MATCHER(hasBody);
1837a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(hasCanonicalType);
184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(hasCaseConstant);
185ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen  REGISTER_MATCHER(hasCondition);
186f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(hasConditionVariableStatement);
1876c1dc7870f457803a9b256ed868da82532be820bSamuel Benzaquen  REGISTER_MATCHER(hasDeclaration);
188176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(hasDeclContext);
1893f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen  REGISTER_MATCHER(hasDeducedType);
190ee0da9520fe94f701240e9e1c97773ee412be102Samuel Benzaquen  REGISTER_MATCHER(hasDescendant);
191f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(hasDestinationType);
192f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(hasEitherOperand);
1933f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen  REGISTER_MATCHER(hasElementType);
194176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(hasElse);
195f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(hasFalseExpression);
196c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  REGISTER_MATCHER(hasGlobalStorage);
197f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(hasImplicitDestinationType);
1987a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(hasIncrement);
1997a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(hasIndex);
200f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(hasInitializer);
2013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  REGISTER_MATCHER(hasKeywordSelector);
202f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(hasLHS);
2037a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(hasLocalQualifiers);
204c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  REGISTER_MATCHER(hasLocalStorage);
2057a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(hasLoopInit);
206176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(hasLoopVariable);
2077a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(hasMethod);
208f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(hasName);
2093ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  REGISTER_MATCHER(hasNullSelector);
210f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(hasObjectExpression);
211ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen  REGISTER_MATCHER(hasOperatorName);
212ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen  REGISTER_MATCHER(hasOverloadedOperatorName);
2137a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(hasParameter);
214ee0da9520fe94f701240e9e1c97773ee412be102Samuel Benzaquen  REGISTER_MATCHER(hasParent);
2157a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(hasQualifier);
216176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(hasRangeInit);
2173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  REGISTER_MATCHER(hasReceiverType);
218f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(hasRHS);
2193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  REGISTER_MATCHER(hasSelector);
2207a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(hasSingleDecl);
2217a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(hasSize);
2227a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(hasSizeExpr);
223f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(hasSourceExpression);
2247a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(hasTargetDecl);
225671840a66f63f55705175e51fb44f77a55e0e3b6Samuel Benzaquen  REGISTER_MATCHER(hasTemplateArgument);
226176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(hasThen);
227f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(hasTrueExpression);
228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(hasTypeLoc);
229f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(hasUnaryOperand);
2303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  REGISTER_MATCHER(hasUnarySelector);
2313f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen  REGISTER_MATCHER(hasValueType);
232f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(ifStmt);
2337a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(ignoringImpCasts);
2347a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(ignoringParenCasts);
2357a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(ignoringParenImpCasts);
236f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(implicitCastExpr);
2377a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(incompleteArrayType);
2387a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(initListExpr);
2393f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen  REGISTER_MATCHER(innerType);
240f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(integerLiteral);
241f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(isArrow);
242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(isConst);
243f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(isConstQualified);
244ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen  REGISTER_MATCHER(isDefinition);
245176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(isDeleted);
246ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen  REGISTER_MATCHER(isExplicitTemplateSpecialization);
247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(isExpr);
2487a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(isExternC);
249f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(isImplicit);
2500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  REGISTER_MATCHER(isExpansionInFileMatching);
2510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  REGISTER_MATCHER(isExpansionInMainFile);
252176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(isInstantiated);
2530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  REGISTER_MATCHER(isExpansionInSystemHeader);
2547a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(isInteger);
255176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(isIntegral);
256176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(isInTemplateInstantiation);
257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(isListInitialization);
2587a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(isOverride);
2597a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(isPrivate);
2607a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(isProtected);
2617a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(isPublic);
262176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(isPure);
263ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen  REGISTER_MATCHER(isTemplateInstantiation);
2647a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(isVirtual);
26586e4d744eaa44f7e674e41074913d8ed61f1d433Samuel Benzaquen  REGISTER_MATCHER(isWritten);
2667a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(labelStmt);
2677a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(lambdaExpr);
268176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(lValueReferenceType);
2697a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(matchesName);
2703ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  REGISTER_MATCHER(matchesSelector);
2717a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(materializeTemporaryExpr);
272f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(member);
2737a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(memberCallExpr);
274f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(memberExpr);
2757a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(memberPointerType);
276f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(methodDecl);
277f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(namedDecl);
2787a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(namespaceDecl);
279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(namesType);
2807a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(nestedNameSpecifier);
2817a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(nestedNameSpecifierLoc);
282f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(newExpr);
2837a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(nullPtrLiteralExpr);
2847a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(nullStmt);
2853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  REGISTER_MATCHER(numSelectorArgs);
286f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(ofClass);
2873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  REGISTER_MATCHER(objcMessageExpr);
288f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(on);
289f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(onImplicitObjectArgument);
290f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(operatorCallExpr);
2917a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(parameterCountIs);
2927a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(parenType);
293651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(parmVarDecl);
2943f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen  REGISTER_MATCHER(pointee);
2957a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(pointerType);
2967a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(qualType);
297f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(recordDecl);
2987a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(recordType);
2997a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(referenceType);
3007a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(refersToDeclaration);
301176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(refersToIntegralType);
3027a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(refersToType);
303f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(reinterpretCastExpr);
3047a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(returns);
305176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(returnStmt);
306176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(rValueReferenceType);
3077a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(sizeOfExpr);
3087a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(specifiesNamespace);
3097a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(specifiesType);
3107a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(specifiesTypeLoc);
3117a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(statementCountIs);
312f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(staticCastExpr);
313f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(stmt);
314f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(stringLiteral);
315176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(substNonTypeTemplateParmExpr);
316f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(switchCase);
3177a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(switchStmt);
318176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(templateArgument);
319176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(templateArgumentCountIs);
3207a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(templateSpecializationType);
321651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(temporaryObjectExpr);
3227a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(thisExpr);
3237a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(throughUsingDecl);
3247a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(throwExpr);
325f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(to);
3260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  REGISTER_MATCHER(translationUnitDecl);
3277a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(tryStmt);
3287a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(type);
3290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  REGISTER_MATCHER(typedefDecl);
3307a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(typedefType);
331176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(typeLoc);
3327a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(unaryExprOrTypeTraitExpr);
333f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(unaryOperator);
334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(unaryTransformType);
335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(unless);
336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(unresolvedConstructExpr);
337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  REGISTER_MATCHER(unresolvedUsingValueDecl);
3387a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(userDefinedLiteral);
3397a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(usingDecl);
340176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(usingDirectiveDecl);
341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  REGISTER_MATCHER(valueDecl);
342f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(varDecl);
3437a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen  REGISTER_MATCHER(variableArrayType);
3440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  REGISTER_MATCHER(voidType);
345f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  REGISTER_MATCHER(whileStmt);
34686e4d744eaa44f7e674e41074913d8ed61f1d433Samuel Benzaquen  REGISTER_MATCHER(withInitializer);
347f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek}
348f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek
349f7f295f321fd434e1e542844a71f538a56f2f8fbManuel KlimekRegistryMaps::~RegistryMaps() {
350f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  for (ConstructorMap::iterator it = Constructors.begin(),
351f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek                                end = Constructors.end();
352f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek       it != end; ++it) {
353f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek    delete it->second;
354f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  }
355f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek}
356f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek
357f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekstatic llvm::ManagedStatic<RegistryMaps> RegistryData;
358f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek
359f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} // anonymous namespace
360f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek
361f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// static
3626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesllvm::Optional<MatcherCtor> Registry::lookupMatcherCtor(StringRef MatcherName) {
363f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek  ConstructorMap::const_iterator it =
364f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek      RegistryData->constructors().find(MatcherName);
3656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return it == RegistryData->constructors().end()
3666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines             ? llvm::Optional<MatcherCtor>()
3676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines             : it->second;
368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace {
371651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
372651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesllvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
373651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                              const std::set<ASTNodeKind> &KS) {
374651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned Count = 0;
375651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (std::set<ASTNodeKind>::const_iterator I = KS.begin(), E = KS.end();
376651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines       I != E; ++I) {
377651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (I != KS.begin())
378651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      OS << "|";
379651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Count++ == 3) {
380651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      OS << "...";
381651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      break;
382651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
383651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    OS << *I;
384651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return OS;
386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
388176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}  // namespace
389651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
390176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstd::vector<ArgKind> Registry::getAcceptedCompletionTypes(
391176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ArrayRef<std::pair<MatcherCtor, unsigned>> Context) {
392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ASTNodeKind InitialTypes[] = {
393176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ASTNodeKind::getFromNodeKind<Decl>(),
394176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ASTNodeKind::getFromNodeKind<QualType>(),
395176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ASTNodeKind::getFromNodeKind<Type>(),
396176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ASTNodeKind::getFromNodeKind<Stmt>(),
397176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ASTNodeKind::getFromNodeKind<NestedNameSpecifier>(),
398176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ASTNodeKind::getFromNodeKind<NestedNameSpecifierLoc>(),
399176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      ASTNodeKind::getFromNodeKind<TypeLoc>()};
400651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
401651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Starting with the above seed of acceptable top-level matcher types, compute
402651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // the acceptable type set for the argument indicated by each context element.
403176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  std::set<ArgKind> TypeSet(std::begin(InitialTypes), std::end(InitialTypes));
404176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (const auto &CtxEntry : Context) {
405176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    MatcherCtor Ctor = CtxEntry.first;
406176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    unsigned ArgNumber = CtxEntry.second;
407176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    std::vector<ArgKind> NextTypeSet;
408176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (const ArgKind &Kind : TypeSet) {
409176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (Kind.getArgKind() == Kind.AK_Matcher &&
410176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          Ctor->isConvertibleTo(Kind.getMatcherKind()) &&
411176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          (Ctor->isVariadic() || ArgNumber < Ctor->getNumArgs()))
412176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Ctor->getArgKinds(Kind.getMatcherKind(), ArgNumber, NextTypeSet);
413651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
414651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    TypeSet.clear();
415176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    TypeSet.insert(NextTypeSet.begin(), NextTypeSet.end());
416651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
417176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return std::vector<ArgKind>(TypeSet.begin(), TypeSet.end());
418176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
419651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
420176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstd::vector<MatcherCompletion>
421176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesRegistry::getMatcherCompletions(ArrayRef<ArgKind> AcceptedTypes) {
422176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  std::vector<MatcherCompletion> Completions;
423651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
424176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Search the registry for acceptable matchers.
425651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (ConstructorMap::const_iterator I = RegistryData->constructors().begin(),
426651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                      E = RegistryData->constructors().end();
427651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines       I != E; ++I) {
428651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    std::set<ASTNodeKind> RetKinds;
429651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    unsigned NumArgs = I->second->isVariadic() ? 1 : I->second->getNumArgs();
430651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bool IsPolymorphic = I->second->isPolymorphic();
431176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    std::vector<std::vector<ArgKind>> ArgsKinds(NumArgs);
432651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    unsigned MaxSpecificity = 0;
433176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (const ArgKind& Kind : AcceptedTypes) {
434176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (Kind.getArgKind() != Kind.AK_Matcher)
435176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        continue;
436651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      unsigned Specificity;
437651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      ASTNodeKind LeastDerivedKind;
438176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (I->second->isConvertibleTo(Kind.getMatcherKind(), &Specificity,
439176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                     &LeastDerivedKind)) {
440651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        if (MaxSpecificity < Specificity)
441651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          MaxSpecificity = Specificity;
442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        RetKinds.insert(LeastDerivedKind);
443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        for (unsigned Arg = 0; Arg != NumArgs; ++Arg)
444176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          I->second->getArgKinds(Kind.getMatcherKind(), Arg, ArgsKinds[Arg]);
445651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        if (IsPolymorphic)
446651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          break;
447651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
448651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
449651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
450651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (!RetKinds.empty() && MaxSpecificity > 0) {
451651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      std::string Decl;
452651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      llvm::raw_string_ostream OS(Decl);
453651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (IsPolymorphic) {
455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        OS << "Matcher<T> " << I->first() << "(Matcher<T>";
456651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      } else {
457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        OS << "Matcher<" << RetKinds << "> " << I->first() << "(";
458176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        for (const std::vector<ArgKind> &Arg : ArgsKinds) {
459176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          if (&Arg != &ArgsKinds[0])
460651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            OS << ", ";
461176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
462176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          bool FirstArgKind = true;
463176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          std::set<ASTNodeKind> MatcherKinds;
464176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          // Two steps. First all non-matchers, then matchers only.
465176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          for (const ArgKind &AK : Arg) {
466176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            if (AK.getArgKind() == ArgKind::AK_Matcher) {
467176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines              MatcherKinds.insert(AK.getMatcherKind());
468176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            } else {
469176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines              if (!FirstArgKind) OS << "|";
470176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines              FirstArgKind = false;
471176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines              OS << AK.asString();
472176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            }
473176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          }
474176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines          if (!MatcherKinds.empty()) {
475176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines            if (!FirstArgKind) OS << "|";
476651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            OS << "Matcher<" << MatcherKinds << ">";
477651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          }
478651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        }
479651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
480651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (I->second->isVariadic())
481651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        OS << "...";
482651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      OS << ")";
483651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
484651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      std::string TypedText = I->first();
485651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      TypedText += "(";
486651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (ArgsKinds.empty())
487651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        TypedText += ")";
488176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      else if (ArgsKinds[0][0].getArgKind() == ArgKind::AK_String)
489651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        TypedText += "\"";
490651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
491176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      Completions.emplace_back(TypedText, OS.str(), MaxSpecificity);
492651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
493651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
494651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
495176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return Completions;
496651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
497651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
498651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// static
499651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesVariantMatcher Registry::constructMatcher(MatcherCtor Ctor,
500651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                          const SourceRange &NameRange,
501651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                          ArrayRef<ParserValue> Args,
502651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                          Diagnostics *Error) {
503651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return Ctor->create(NameRange, Args, Error);
504f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek}
505f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek
5064f37d925927dfdd0c770702ffb22de38fc2007dcSamuel Benzaquen// static
507651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesVariantMatcher Registry::constructBoundMatcher(MatcherCtor Ctor,
5089d02807c3ea9782442b98201df68294cd7cd7313Samuel Benzaquen                                               const SourceRange &NameRange,
5099d02807c3ea9782442b98201df68294cd7cd7313Samuel Benzaquen                                               StringRef BindID,
5109d02807c3ea9782442b98201df68294cd7cd7313Samuel Benzaquen                                               ArrayRef<ParserValue> Args,
5119d02807c3ea9782442b98201df68294cd7cd7313Samuel Benzaquen                                               Diagnostics *Error) {
512651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  VariantMatcher Out = constructMatcher(Ctor, NameRange, Args, Error);
5139d02807c3ea9782442b98201df68294cd7cd7313Samuel Benzaquen  if (Out.isNull()) return Out;
5149d02807c3ea9782442b98201df68294cd7cd7313Samuel Benzaquen
515b7488d77414b000ce2506b520a6b29f845fb3950Samuel Benzaquen  llvm::Optional<DynTypedMatcher> Result = Out.getSingleMatcher();
516b7488d77414b000ce2506b520a6b29f845fb3950Samuel Benzaquen  if (Result.hasValue()) {
517b7488d77414b000ce2506b520a6b29f845fb3950Samuel Benzaquen    llvm::Optional<DynTypedMatcher> Bound = Result->tryBind(BindID);
518b7488d77414b000ce2506b520a6b29f845fb3950Samuel Benzaquen    if (Bound.hasValue()) {
5199d02807c3ea9782442b98201df68294cd7cd7313Samuel Benzaquen      return VariantMatcher::SingleMatcher(*Bound);
520ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen    }
5214f37d925927dfdd0c770702ffb22de38fc2007dcSamuel Benzaquen  }
5228a77c20375874c0759a5cd5b4a34e83465d821b2Samuel Benzaquen  Error->addError(NameRange, Error->ET_RegistryNotBindable);
5239d02807c3ea9782442b98201df68294cd7cd7313Samuel Benzaquen  return VariantMatcher();
5244f37d925927dfdd0c770702ffb22de38fc2007dcSamuel Benzaquen}
5254f37d925927dfdd0c770702ffb22de38fc2007dcSamuel Benzaquen
526f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek}  // namespace dynamic
527f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek}  // namespace ast_matchers
528f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek}  // namespace clang
529