Registry.cpp revision 288943
1//===--- Registry.cpp - Matcher registry -------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===------------------------------------------------------------===//
9///
10/// \file
11/// \brief Registry map populated at static initialization time.
12///
13//===------------------------------------------------------------===//
14
15#include "clang/ASTMatchers/Dynamic/Registry.h"
16#include "Marshallers.h"
17#include "clang/ASTMatchers/ASTMatchers.h"
18#include "llvm/ADT/StringMap.h"
19#include "llvm/ADT/StringRef.h"
20#include "llvm/Support/ManagedStatic.h"
21#include <set>
22#include <utility>
23
24using namespace clang::ast_type_traits;
25
26namespace clang {
27namespace ast_matchers {
28namespace dynamic {
29namespace {
30
31using internal::MatcherDescriptor;
32
33typedef llvm::StringMap<const MatcherDescriptor *> ConstructorMap;
34class RegistryMaps {
35public:
36  RegistryMaps();
37  ~RegistryMaps();
38
39  const ConstructorMap &constructors() const { return Constructors; }
40
41private:
42  void registerMatcher(StringRef MatcherName, MatcherDescriptor *Callback);
43  ConstructorMap Constructors;
44};
45
46void RegistryMaps::registerMatcher(StringRef MatcherName,
47                                   MatcherDescriptor *Callback) {
48  assert(Constructors.find(MatcherName) == Constructors.end());
49  Constructors[MatcherName] = Callback;
50}
51
52#define REGISTER_MATCHER(name)                                                 \
53  registerMatcher(#name, internal::makeMatcherAutoMarshall(                    \
54                             ::clang::ast_matchers::name, #name));
55
56#define SPECIFIC_MATCHER_OVERLOAD(name, Id)                                    \
57  static_cast< ::clang::ast_matchers::name##_Type##Id>(                        \
58      ::clang::ast_matchers::name)
59
60#define REGISTER_OVERLOADED_2(name)                                            \
61  do {                                                                         \
62    MatcherDescriptor *Callbacks[] = {                                         \
63      internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, 0),    \
64                                        #name),                                \
65      internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, 1),    \
66                                        #name)                                 \
67    };                                                                         \
68    registerMatcher(#name,                                                     \
69                    new internal::OverloadedMatcherDescriptor(Callbacks));     \
70  } while (0)
71
72/// \brief Generate a registry map with all the known matchers.
73RegistryMaps::RegistryMaps() {
74  // TODO: Here is the list of the missing matchers, grouped by reason.
75  //
76  // Need Variant/Parser fixes:
77  // ofKind
78  //
79  // Polymorphic + argument overload:
80  // findAll
81  //
82  // Other:
83  // equals
84  // equalsNode
85
86  REGISTER_OVERLOADED_2(callee);
87  REGISTER_OVERLOADED_2(hasPrefix);
88  REGISTER_OVERLOADED_2(hasType);
89  REGISTER_OVERLOADED_2(isDerivedFrom);
90  REGISTER_OVERLOADED_2(isSameOrDerivedFrom);
91  REGISTER_OVERLOADED_2(loc);
92  REGISTER_OVERLOADED_2(pointsTo);
93  REGISTER_OVERLOADED_2(references);
94  REGISTER_OVERLOADED_2(thisPointerType);
95
96  REGISTER_MATCHER(accessSpecDecl);
97  REGISTER_MATCHER(alignOfExpr);
98  REGISTER_MATCHER(allOf);
99  REGISTER_MATCHER(anyOf);
100  REGISTER_MATCHER(anything);
101  REGISTER_MATCHER(argumentCountIs);
102  REGISTER_MATCHER(arraySubscriptExpr);
103  REGISTER_MATCHER(arrayType);
104  REGISTER_MATCHER(asmStmt);
105  REGISTER_MATCHER(asString);
106  REGISTER_MATCHER(atomicType);
107  REGISTER_MATCHER(autoType);
108  REGISTER_MATCHER(binaryOperator);
109  REGISTER_MATCHER(bindTemporaryExpr);
110  REGISTER_MATCHER(blockPointerType);
111  REGISTER_MATCHER(boolLiteral);
112  REGISTER_MATCHER(breakStmt);
113  REGISTER_MATCHER(builtinType);
114  REGISTER_MATCHER(callExpr);
115  REGISTER_MATCHER(caseStmt);
116  REGISTER_MATCHER(castExpr);
117  REGISTER_MATCHER(catchStmt);
118  REGISTER_MATCHER(characterLiteral);
119  REGISTER_MATCHER(classTemplateDecl);
120  REGISTER_MATCHER(classTemplateSpecializationDecl);
121  REGISTER_MATCHER(complexType);
122  REGISTER_MATCHER(compoundLiteralExpr);
123  REGISTER_MATCHER(compoundStmt);
124  REGISTER_MATCHER(conditionalOperator);
125  REGISTER_MATCHER(constantArrayType);
126  REGISTER_MATCHER(constCastExpr);
127  REGISTER_MATCHER(constructExpr);
128  REGISTER_MATCHER(constructorDecl);
129  REGISTER_MATCHER(containsDeclaration);
130  REGISTER_MATCHER(continueStmt);
131  REGISTER_MATCHER(conversionDecl);
132  REGISTER_MATCHER(cStyleCastExpr);
133  REGISTER_MATCHER(ctorInitializer);
134  REGISTER_MATCHER(CUDAKernelCallExpr);
135  REGISTER_MATCHER(decl);
136  REGISTER_MATCHER(declaratorDecl);
137  REGISTER_MATCHER(declCountIs);
138  REGISTER_MATCHER(declRefExpr);
139  REGISTER_MATCHER(declStmt);
140  REGISTER_MATCHER(defaultArgExpr);
141  REGISTER_MATCHER(defaultStmt);
142  REGISTER_MATCHER(deleteExpr);
143  REGISTER_MATCHER(dependentSizedArrayType);
144  REGISTER_MATCHER(destructorDecl);
145  REGISTER_MATCHER(doStmt);
146  REGISTER_MATCHER(dynamicCastExpr);
147  REGISTER_MATCHER(eachOf);
148  REGISTER_MATCHER(elaboratedType);
149  REGISTER_MATCHER(enumConstantDecl);
150  REGISTER_MATCHER(enumDecl);
151  REGISTER_MATCHER(equalsBoundNode);
152  REGISTER_MATCHER(equalsIntegralValue);
153  REGISTER_MATCHER(explicitCastExpr);
154  REGISTER_MATCHER(expr);
155  REGISTER_MATCHER(exprWithCleanups);
156  REGISTER_MATCHER(fieldDecl);
157  REGISTER_MATCHER(floatLiteral);
158  REGISTER_MATCHER(forEach);
159  REGISTER_MATCHER(forEachConstructorInitializer);
160  REGISTER_MATCHER(forEachDescendant);
161  REGISTER_MATCHER(forEachSwitchCase);
162  REGISTER_MATCHER(forField);
163  REGISTER_MATCHER(forRangeStmt);
164  REGISTER_MATCHER(forStmt);
165  REGISTER_MATCHER(friendDecl);
166  REGISTER_MATCHER(functionalCastExpr);
167  REGISTER_MATCHER(functionDecl);
168  REGISTER_MATCHER(functionTemplateDecl);
169  REGISTER_MATCHER(functionType);
170  REGISTER_MATCHER(gotoStmt);
171  REGISTER_MATCHER(has);
172  REGISTER_MATCHER(hasAncestor);
173  REGISTER_MATCHER(hasAnyArgument);
174  REGISTER_MATCHER(hasAnyConstructorInitializer);
175  REGISTER_MATCHER(hasAnyParameter);
176  REGISTER_MATCHER(hasAnySubstatement);
177  REGISTER_MATCHER(hasAnyTemplateArgument);
178  REGISTER_MATCHER(hasAnyUsingShadowDecl);
179  REGISTER_MATCHER(hasArgument);
180  REGISTER_MATCHER(hasArgumentOfType);
181  REGISTER_MATCHER(hasAttr);
182  REGISTER_MATCHER(hasBase);
183  REGISTER_MATCHER(hasBody);
184  REGISTER_MATCHER(hasCanonicalType);
185  REGISTER_MATCHER(hasCaseConstant);
186  REGISTER_MATCHER(hasCondition);
187  REGISTER_MATCHER(hasConditionVariableStatement);
188  REGISTER_MATCHER(hasDeclaration);
189  REGISTER_MATCHER(hasDeclContext);
190  REGISTER_MATCHER(hasDeducedType);
191  REGISTER_MATCHER(hasDescendant);
192  REGISTER_MATCHER(hasDestinationType);
193  REGISTER_MATCHER(hasEitherOperand);
194  REGISTER_MATCHER(hasElementType);
195  REGISTER_MATCHER(hasElse);
196  REGISTER_MATCHER(hasFalseExpression);
197  REGISTER_MATCHER(hasGlobalStorage);
198  REGISTER_MATCHER(hasImplicitDestinationType);
199  REGISTER_MATCHER(hasIncrement);
200  REGISTER_MATCHER(hasIndex);
201  REGISTER_MATCHER(hasInitializer);
202  REGISTER_MATCHER(hasKeywordSelector);
203  REGISTER_MATCHER(hasLHS);
204  REGISTER_MATCHER(hasLocalQualifiers);
205  REGISTER_MATCHER(hasLocalStorage);
206  REGISTER_MATCHER(hasLoopInit);
207  REGISTER_MATCHER(hasLoopVariable);
208  REGISTER_MATCHER(hasMethod);
209  REGISTER_MATCHER(hasName);
210  REGISTER_MATCHER(hasNullSelector);
211  REGISTER_MATCHER(hasObjectExpression);
212  REGISTER_MATCHER(hasOperatorName);
213  REGISTER_MATCHER(hasOverloadedOperatorName);
214  REGISTER_MATCHER(hasParameter);
215  REGISTER_MATCHER(hasParent);
216  REGISTER_MATCHER(hasQualifier);
217  REGISTER_MATCHER(hasRangeInit);
218  REGISTER_MATCHER(hasReceiverType);
219  REGISTER_MATCHER(hasRHS);
220  REGISTER_MATCHER(hasSelector);
221  REGISTER_MATCHER(hasSingleDecl);
222  REGISTER_MATCHER(hasSize);
223  REGISTER_MATCHER(hasSizeExpr);
224  REGISTER_MATCHER(hasSourceExpression);
225  REGISTER_MATCHER(hasTargetDecl);
226  REGISTER_MATCHER(hasTemplateArgument);
227  REGISTER_MATCHER(hasThen);
228  REGISTER_MATCHER(hasTrueExpression);
229  REGISTER_MATCHER(hasTypeLoc);
230  REGISTER_MATCHER(hasUnaryOperand);
231  REGISTER_MATCHER(hasUnarySelector);
232  REGISTER_MATCHER(hasValueType);
233  REGISTER_MATCHER(ifStmt);
234  REGISTER_MATCHER(ignoringImpCasts);
235  REGISTER_MATCHER(ignoringParenCasts);
236  REGISTER_MATCHER(ignoringParenImpCasts);
237  REGISTER_MATCHER(implicitCastExpr);
238  REGISTER_MATCHER(incompleteArrayType);
239  REGISTER_MATCHER(initListExpr);
240  REGISTER_MATCHER(innerType);
241  REGISTER_MATCHER(integerLiteral);
242  REGISTER_MATCHER(isArrow);
243  REGISTER_MATCHER(isCatchAll);
244  REGISTER_MATCHER(isConst);
245  REGISTER_MATCHER(isConstQualified);
246  REGISTER_MATCHER(isDefinition);
247  REGISTER_MATCHER(isDeleted);
248  REGISTER_MATCHER(isExplicitTemplateSpecialization);
249  REGISTER_MATCHER(isExpr);
250  REGISTER_MATCHER(isExternC);
251  REGISTER_MATCHER(isImplicit);
252  REGISTER_MATCHER(isExpansionInFileMatching);
253  REGISTER_MATCHER(isExpansionInMainFile);
254  REGISTER_MATCHER(isInstantiated);
255  REGISTER_MATCHER(isExpansionInSystemHeader);
256  REGISTER_MATCHER(isInteger);
257  REGISTER_MATCHER(isIntegral);
258  REGISTER_MATCHER(isInTemplateInstantiation);
259  REGISTER_MATCHER(isListInitialization);
260  REGISTER_MATCHER(isOverride);
261  REGISTER_MATCHER(isPrivate);
262  REGISTER_MATCHER(isProtected);
263  REGISTER_MATCHER(isPublic);
264  REGISTER_MATCHER(isPure);
265  REGISTER_MATCHER(isTemplateInstantiation);
266  REGISTER_MATCHER(isVirtual);
267  REGISTER_MATCHER(isWritten);
268  REGISTER_MATCHER(labelStmt);
269  REGISTER_MATCHER(lambdaExpr);
270  REGISTER_MATCHER(lValueReferenceType);
271  REGISTER_MATCHER(matchesName);
272  REGISTER_MATCHER(matchesSelector);
273  REGISTER_MATCHER(materializeTemporaryExpr);
274  REGISTER_MATCHER(member);
275  REGISTER_MATCHER(memberCallExpr);
276  REGISTER_MATCHER(memberExpr);
277  REGISTER_MATCHER(memberPointerType);
278  REGISTER_MATCHER(methodDecl);
279  REGISTER_MATCHER(namedDecl);
280  REGISTER_MATCHER(namespaceDecl);
281  REGISTER_MATCHER(namesType);
282  REGISTER_MATCHER(nestedNameSpecifier);
283  REGISTER_MATCHER(nestedNameSpecifierLoc);
284  REGISTER_MATCHER(newExpr);
285  REGISTER_MATCHER(nullPtrLiteralExpr);
286  REGISTER_MATCHER(nullStmt);
287  REGISTER_MATCHER(numSelectorArgs);
288  REGISTER_MATCHER(ofClass);
289  REGISTER_MATCHER(objcMessageExpr);
290  REGISTER_MATCHER(on);
291  REGISTER_MATCHER(onImplicitObjectArgument);
292  REGISTER_MATCHER(operatorCallExpr);
293  REGISTER_MATCHER(parameterCountIs);
294  REGISTER_MATCHER(parenType);
295  REGISTER_MATCHER(parmVarDecl);
296  REGISTER_MATCHER(pointee);
297  REGISTER_MATCHER(pointerType);
298  REGISTER_MATCHER(qualType);
299  REGISTER_MATCHER(recordDecl);
300  REGISTER_MATCHER(recordType);
301  REGISTER_MATCHER(referenceType);
302  REGISTER_MATCHER(refersToDeclaration);
303  REGISTER_MATCHER(refersToIntegralType);
304  REGISTER_MATCHER(refersToType);
305  REGISTER_MATCHER(reinterpretCastExpr);
306  REGISTER_MATCHER(returns);
307  REGISTER_MATCHER(returnStmt);
308  REGISTER_MATCHER(rValueReferenceType);
309  REGISTER_MATCHER(sizeOfExpr);
310  REGISTER_MATCHER(specifiesNamespace);
311  REGISTER_MATCHER(specifiesType);
312  REGISTER_MATCHER(specifiesTypeLoc);
313  REGISTER_MATCHER(statementCountIs);
314  REGISTER_MATCHER(staticCastExpr);
315  REGISTER_MATCHER(staticAssertDecl);
316  REGISTER_MATCHER(stmt);
317  REGISTER_MATCHER(stringLiteral);
318  REGISTER_MATCHER(substNonTypeTemplateParmExpr);
319  REGISTER_MATCHER(switchCase);
320  REGISTER_MATCHER(switchStmt);
321  REGISTER_MATCHER(templateArgument);
322  REGISTER_MATCHER(templateArgumentCountIs);
323  REGISTER_MATCHER(templateSpecializationType);
324  REGISTER_MATCHER(temporaryObjectExpr);
325  REGISTER_MATCHER(thisExpr);
326  REGISTER_MATCHER(throughUsingDecl);
327  REGISTER_MATCHER(throwExpr);
328  REGISTER_MATCHER(to);
329  REGISTER_MATCHER(translationUnitDecl);
330  REGISTER_MATCHER(tryStmt);
331  REGISTER_MATCHER(type);
332  REGISTER_MATCHER(typedefDecl);
333  REGISTER_MATCHER(typedefType);
334  REGISTER_MATCHER(typeLoc);
335  REGISTER_MATCHER(unaryExprOrTypeTraitExpr);
336  REGISTER_MATCHER(unaryOperator);
337  REGISTER_MATCHER(unaryTransformType);
338  REGISTER_MATCHER(unless);
339  REGISTER_MATCHER(unresolvedConstructExpr);
340  REGISTER_MATCHER(unresolvedUsingValueDecl);
341  REGISTER_MATCHER(userDefinedLiteral);
342  REGISTER_MATCHER(usingDecl);
343  REGISTER_MATCHER(usingDirectiveDecl);
344  REGISTER_MATCHER(valueDecl);
345  REGISTER_MATCHER(varDecl);
346  REGISTER_MATCHER(variableArrayType);
347  REGISTER_MATCHER(voidType);
348  REGISTER_MATCHER(whileStmt);
349  REGISTER_MATCHER(withInitializer);
350}
351
352RegistryMaps::~RegistryMaps() {
353  for (ConstructorMap::iterator it = Constructors.begin(),
354                                end = Constructors.end();
355       it != end; ++it) {
356    delete it->second;
357  }
358}
359
360static llvm::ManagedStatic<RegistryMaps> RegistryData;
361
362} // anonymous namespace
363
364// static
365llvm::Optional<MatcherCtor> Registry::lookupMatcherCtor(StringRef MatcherName) {
366  ConstructorMap::const_iterator it =
367      RegistryData->constructors().find(MatcherName);
368  return it == RegistryData->constructors().end()
369             ? llvm::Optional<MatcherCtor>()
370             : it->second;
371}
372
373namespace {
374
375llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
376                              const std::set<ASTNodeKind> &KS) {
377  unsigned Count = 0;
378  for (std::set<ASTNodeKind>::const_iterator I = KS.begin(), E = KS.end();
379       I != E; ++I) {
380    if (I != KS.begin())
381      OS << "|";
382    if (Count++ == 3) {
383      OS << "...";
384      break;
385    }
386    OS << *I;
387  }
388  return OS;
389}
390
391}  // namespace
392
393std::vector<ArgKind> Registry::getAcceptedCompletionTypes(
394    ArrayRef<std::pair<MatcherCtor, unsigned>> Context) {
395  ASTNodeKind InitialTypes[] = {
396      ASTNodeKind::getFromNodeKind<Decl>(),
397      ASTNodeKind::getFromNodeKind<QualType>(),
398      ASTNodeKind::getFromNodeKind<Type>(),
399      ASTNodeKind::getFromNodeKind<Stmt>(),
400      ASTNodeKind::getFromNodeKind<NestedNameSpecifier>(),
401      ASTNodeKind::getFromNodeKind<NestedNameSpecifierLoc>(),
402      ASTNodeKind::getFromNodeKind<TypeLoc>()};
403
404  // Starting with the above seed of acceptable top-level matcher types, compute
405  // the acceptable type set for the argument indicated by each context element.
406  std::set<ArgKind> TypeSet(std::begin(InitialTypes), std::end(InitialTypes));
407  for (const auto &CtxEntry : Context) {
408    MatcherCtor Ctor = CtxEntry.first;
409    unsigned ArgNumber = CtxEntry.second;
410    std::vector<ArgKind> NextTypeSet;
411    for (const ArgKind &Kind : TypeSet) {
412      if (Kind.getArgKind() == Kind.AK_Matcher &&
413          Ctor->isConvertibleTo(Kind.getMatcherKind()) &&
414          (Ctor->isVariadic() || ArgNumber < Ctor->getNumArgs()))
415        Ctor->getArgKinds(Kind.getMatcherKind(), ArgNumber, NextTypeSet);
416    }
417    TypeSet.clear();
418    TypeSet.insert(NextTypeSet.begin(), NextTypeSet.end());
419  }
420  return std::vector<ArgKind>(TypeSet.begin(), TypeSet.end());
421}
422
423std::vector<MatcherCompletion>
424Registry::getMatcherCompletions(ArrayRef<ArgKind> AcceptedTypes) {
425  std::vector<MatcherCompletion> Completions;
426
427  // Search the registry for acceptable matchers.
428  for (ConstructorMap::const_iterator I = RegistryData->constructors().begin(),
429                                      E = RegistryData->constructors().end();
430       I != E; ++I) {
431    std::set<ASTNodeKind> RetKinds;
432    unsigned NumArgs = I->second->isVariadic() ? 1 : I->second->getNumArgs();
433    bool IsPolymorphic = I->second->isPolymorphic();
434    std::vector<std::vector<ArgKind>> ArgsKinds(NumArgs);
435    unsigned MaxSpecificity = 0;
436    for (const ArgKind& Kind : AcceptedTypes) {
437      if (Kind.getArgKind() != Kind.AK_Matcher)
438        continue;
439      unsigned Specificity;
440      ASTNodeKind LeastDerivedKind;
441      if (I->second->isConvertibleTo(Kind.getMatcherKind(), &Specificity,
442                                     &LeastDerivedKind)) {
443        if (MaxSpecificity < Specificity)
444          MaxSpecificity = Specificity;
445        RetKinds.insert(LeastDerivedKind);
446        for (unsigned Arg = 0; Arg != NumArgs; ++Arg)
447          I->second->getArgKinds(Kind.getMatcherKind(), Arg, ArgsKinds[Arg]);
448        if (IsPolymorphic)
449          break;
450      }
451    }
452
453    if (!RetKinds.empty() && MaxSpecificity > 0) {
454      std::string Decl;
455      llvm::raw_string_ostream OS(Decl);
456
457      if (IsPolymorphic) {
458        OS << "Matcher<T> " << I->first() << "(Matcher<T>";
459      } else {
460        OS << "Matcher<" << RetKinds << "> " << I->first() << "(";
461        for (const std::vector<ArgKind> &Arg : ArgsKinds) {
462          if (&Arg != &ArgsKinds[0])
463            OS << ", ";
464
465          bool FirstArgKind = true;
466          std::set<ASTNodeKind> MatcherKinds;
467          // Two steps. First all non-matchers, then matchers only.
468          for (const ArgKind &AK : Arg) {
469            if (AK.getArgKind() == ArgKind::AK_Matcher) {
470              MatcherKinds.insert(AK.getMatcherKind());
471            } else {
472              if (!FirstArgKind) OS << "|";
473              FirstArgKind = false;
474              OS << AK.asString();
475            }
476          }
477          if (!MatcherKinds.empty()) {
478            if (!FirstArgKind) OS << "|";
479            OS << "Matcher<" << MatcherKinds << ">";
480          }
481        }
482      }
483      if (I->second->isVariadic())
484        OS << "...";
485      OS << ")";
486
487      std::string TypedText = I->first();
488      TypedText += "(";
489      if (ArgsKinds.empty())
490        TypedText += ")";
491      else if (ArgsKinds[0][0].getArgKind() == ArgKind::AK_String)
492        TypedText += "\"";
493
494      Completions.emplace_back(TypedText, OS.str(), MaxSpecificity);
495    }
496  }
497
498  return Completions;
499}
500
501// static
502VariantMatcher Registry::constructMatcher(MatcherCtor Ctor,
503                                          const SourceRange &NameRange,
504                                          ArrayRef<ParserValue> Args,
505                                          Diagnostics *Error) {
506  return Ctor->create(NameRange, Args, Error);
507}
508
509// static
510VariantMatcher Registry::constructBoundMatcher(MatcherCtor Ctor,
511                                               const SourceRange &NameRange,
512                                               StringRef BindID,
513                                               ArrayRef<ParserValue> Args,
514                                               Diagnostics *Error) {
515  VariantMatcher Out = constructMatcher(Ctor, NameRange, Args, Error);
516  if (Out.isNull()) return Out;
517
518  llvm::Optional<DynTypedMatcher> Result = Out.getSingleMatcher();
519  if (Result.hasValue()) {
520    llvm::Optional<DynTypedMatcher> Bound = Result->tryBind(BindID);
521    if (Bound.hasValue()) {
522      return VariantMatcher::SingleMatcher(*Bound);
523    }
524  }
525  Error->addError(NameRange, Error->ET_RegistryNotBindable);
526  return VariantMatcher();
527}
528
529}  // namespace dynamic
530}  // namespace ast_matchers
531}  // namespace clang
532