xref: /llvm-project/clang/lib/ASTMatchers/Dynamic/Registry.cpp (revision f43e6948543ef23822ee31da03591b6cbf8457cd)
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 
17 #include <utility>
18 
19 #include "Marshallers.h"
20 #include "clang/ASTMatchers/ASTMatchers.h"
21 #include "llvm/ADT/StringMap.h"
22 #include "llvm/ADT/StringRef.h"
23 #include "llvm/Support/ManagedStatic.h"
24 
25 namespace clang {
26 namespace ast_matchers {
27 namespace dynamic {
28 namespace {
29 
30 using internal::MatcherDescriptor;
31 
32 typedef llvm::StringMap<const MatcherDescriptor *> ConstructorMap;
33 class RegistryMaps {
34 public:
35   RegistryMaps();
36   ~RegistryMaps();
37 
38   const ConstructorMap &constructors() const { return Constructors; }
39 
40 private:
41   void registerMatcher(StringRef MatcherName, MatcherDescriptor *Callback);
42   ConstructorMap Constructors;
43 };
44 
45 void RegistryMaps::registerMatcher(StringRef MatcherName,
46                                    MatcherDescriptor *Callback) {
47   assert(Constructors.find(MatcherName) == Constructors.end());
48   Constructors[MatcherName] = Callback;
49 }
50 
51 #define REGISTER_MATCHER(name)                                                 \
52   registerMatcher(#name, internal::makeMatcherAutoMarshall(                    \
53                              ::clang::ast_matchers::name, #name));
54 
55 #define SPECIFIC_MATCHER_OVERLOAD(name, Id)                                    \
56   static_cast< ::clang::ast_matchers::name##_Type##Id>(                        \
57       ::clang::ast_matchers::name)
58 
59 #define REGISTER_OVERLOADED_2(name)                                            \
60   do {                                                                         \
61     MatcherDescriptor *Callbacks[] = {                                         \
62       internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, 0),    \
63                                         #name),                                \
64       internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, 1),    \
65                                         #name)                                 \
66     };                                                                         \
67     registerMatcher(#name,                                                     \
68                     new internal::OverloadedMatcherDescriptor(Callbacks));     \
69   } while (0)
70 
71 /// \brief Generate a registry map with all the known matchers.
72 RegistryMaps::RegistryMaps() {
73   // TODO: Here is the list of the missing matchers, grouped by reason.
74   //
75   // Need Variant/Parser fixes:
76   // ofKind
77   //
78   // Polymorphic + argument overload:
79   // findAll
80   //
81   // Other:
82   // loc
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(pointsTo);
92   REGISTER_OVERLOADED_2(references);
93   REGISTER_OVERLOADED_2(thisPointerType);
94 
95   REGISTER_MATCHER(accessSpecDecl);
96   REGISTER_MATCHER(alignOfExpr);
97   REGISTER_MATCHER(allOf);
98   REGISTER_MATCHER(anyOf);
99   REGISTER_MATCHER(anything);
100   REGISTER_MATCHER(argumentCountIs);
101   REGISTER_MATCHER(arraySubscriptExpr);
102   REGISTER_MATCHER(arrayType);
103   REGISTER_MATCHER(asString);
104   REGISTER_MATCHER(asmStmt);
105   REGISTER_MATCHER(atomicType);
106   REGISTER_MATCHER(autoType);
107   REGISTER_MATCHER(binaryOperator);
108   REGISTER_MATCHER(bindTemporaryExpr);
109   REGISTER_MATCHER(blockPointerType);
110   REGISTER_MATCHER(boolLiteral);
111   REGISTER_MATCHER(breakStmt);
112   REGISTER_MATCHER(builtinType);
113   REGISTER_MATCHER(cStyleCastExpr);
114   REGISTER_MATCHER(callExpr);
115   REGISTER_MATCHER(castExpr);
116   REGISTER_MATCHER(catchStmt);
117   REGISTER_MATCHER(characterLiteral);
118   REGISTER_MATCHER(classTemplateDecl);
119   REGISTER_MATCHER(classTemplateSpecializationDecl);
120   REGISTER_MATCHER(complexType);
121   REGISTER_MATCHER(compoundLiteralExpr);
122   REGISTER_MATCHER(compoundStmt);
123   REGISTER_MATCHER(conditionalOperator);
124   REGISTER_MATCHER(constCastExpr);
125   REGISTER_MATCHER(constantArrayType);
126   REGISTER_MATCHER(constructExpr);
127   REGISTER_MATCHER(constructorDecl);
128   REGISTER_MATCHER(containsDeclaration);
129   REGISTER_MATCHER(continueStmt);
130   REGISTER_MATCHER(ctorInitializer);
131   REGISTER_MATCHER(decl);
132   REGISTER_MATCHER(declCountIs);
133   REGISTER_MATCHER(declRefExpr);
134   REGISTER_MATCHER(declStmt);
135   REGISTER_MATCHER(defaultArgExpr);
136   REGISTER_MATCHER(deleteExpr);
137   REGISTER_MATCHER(dependentSizedArrayType);
138   REGISTER_MATCHER(destructorDecl);
139   REGISTER_MATCHER(doStmt);
140   REGISTER_MATCHER(dynamicCastExpr);
141   REGISTER_MATCHER(eachOf);
142   REGISTER_MATCHER(elaboratedType);
143   REGISTER_MATCHER(enumConstantDecl);
144   REGISTER_MATCHER(enumDecl);
145   REGISTER_MATCHER(explicitCastExpr);
146   REGISTER_MATCHER(expr);
147   REGISTER_MATCHER(fieldDecl);
148   REGISTER_MATCHER(floatLiteral);
149   REGISTER_MATCHER(forEach);
150   REGISTER_MATCHER(forEachDescendant);
151   REGISTER_MATCHER(forField);
152   REGISTER_MATCHER(forRangeStmt);
153   REGISTER_MATCHER(forStmt);
154   REGISTER_MATCHER(functionDecl);
155   REGISTER_MATCHER(functionTemplateDecl);
156   REGISTER_MATCHER(functionType);
157   REGISTER_MATCHER(functionalCastExpr);
158   REGISTER_MATCHER(gotoStmt);
159   REGISTER_MATCHER(has);
160   REGISTER_MATCHER(hasAncestor);
161   REGISTER_MATCHER(hasAnyArgument);
162   REGISTER_MATCHER(hasAnyConstructorInitializer);
163   REGISTER_MATCHER(hasAnyParameter);
164   REGISTER_MATCHER(hasAnySubstatement);
165   REGISTER_MATCHER(hasAnyTemplateArgument);
166   REGISTER_MATCHER(hasAnyUsingShadowDecl);
167   REGISTER_MATCHER(hasArgument);
168   REGISTER_MATCHER(hasArgumentOfType);
169   REGISTER_MATCHER(hasBase);
170   REGISTER_MATCHER(hasBody);
171   REGISTER_MATCHER(hasCanonicalType);
172   REGISTER_MATCHER(hasCondition);
173   REGISTER_MATCHER(hasConditionVariableStatement);
174   REGISTER_MATCHER(hasDeclContext);
175   REGISTER_MATCHER(hasDeclaration);
176   REGISTER_MATCHER(hasDeducedType);
177   REGISTER_MATCHER(hasDescendant);
178   REGISTER_MATCHER(hasDestinationType);
179   REGISTER_MATCHER(hasEitherOperand);
180   REGISTER_MATCHER(hasElementType);
181   REGISTER_MATCHER(hasFalseExpression);
182   REGISTER_MATCHER(hasImplicitDestinationType);
183   REGISTER_MATCHER(hasIncrement);
184   REGISTER_MATCHER(hasIndex);
185   REGISTER_MATCHER(hasInitializer);
186   REGISTER_MATCHER(hasLHS);
187   REGISTER_MATCHER(hasLocalQualifiers);
188   REGISTER_MATCHER(hasLoopInit);
189   REGISTER_MATCHER(hasMethod);
190   REGISTER_MATCHER(hasName);
191   REGISTER_MATCHER(hasObjectExpression);
192   REGISTER_MATCHER(hasOperatorName);
193   REGISTER_MATCHER(hasOverloadedOperatorName);
194   REGISTER_MATCHER(hasParameter);
195   REGISTER_MATCHER(hasParent);
196   REGISTER_MATCHER(hasQualifier);
197   REGISTER_MATCHER(hasRHS);
198   REGISTER_MATCHER(hasSingleDecl);
199   REGISTER_MATCHER(hasSize);
200   REGISTER_MATCHER(hasSizeExpr);
201   REGISTER_MATCHER(hasSourceExpression);
202   REGISTER_MATCHER(hasTargetDecl);
203   REGISTER_MATCHER(hasTemplateArgument);
204   REGISTER_MATCHER(hasTrueExpression);
205   REGISTER_MATCHER(hasUnaryOperand);
206   REGISTER_MATCHER(hasValueType);
207   REGISTER_MATCHER(ifStmt);
208   REGISTER_MATCHER(ignoringImpCasts);
209   REGISTER_MATCHER(ignoringParenCasts);
210   REGISTER_MATCHER(ignoringParenImpCasts);
211   REGISTER_MATCHER(implicitCastExpr);
212   REGISTER_MATCHER(incompleteArrayType);
213   REGISTER_MATCHER(initListExpr);
214   REGISTER_MATCHER(innerType);
215   REGISTER_MATCHER(integerLiteral);
216   REGISTER_MATCHER(isArrow);
217   REGISTER_MATCHER(isConstQualified);
218   REGISTER_MATCHER(isDefinition);
219   REGISTER_MATCHER(isExplicitTemplateSpecialization);
220   REGISTER_MATCHER(isExternC);
221   REGISTER_MATCHER(isImplicit);
222   REGISTER_MATCHER(isInteger);
223   REGISTER_MATCHER(isOverride);
224   REGISTER_MATCHER(isPrivate);
225   REGISTER_MATCHER(isProtected);
226   REGISTER_MATCHER(isPublic);
227   REGISTER_MATCHER(isTemplateInstantiation);
228   REGISTER_MATCHER(isVirtual);
229   REGISTER_MATCHER(isWritten);
230   REGISTER_MATCHER(lValueReferenceType);
231   REGISTER_MATCHER(labelStmt);
232   REGISTER_MATCHER(lambdaExpr);
233   REGISTER_MATCHER(matchesName);
234   REGISTER_MATCHER(materializeTemporaryExpr);
235   REGISTER_MATCHER(member);
236   REGISTER_MATCHER(memberCallExpr);
237   REGISTER_MATCHER(memberExpr);
238   REGISTER_MATCHER(memberPointerType);
239   REGISTER_MATCHER(methodDecl);
240   REGISTER_MATCHER(namedDecl);
241   REGISTER_MATCHER(namesType);
242   REGISTER_MATCHER(namespaceDecl);
243   REGISTER_MATCHER(nestedNameSpecifier);
244   REGISTER_MATCHER(nestedNameSpecifierLoc);
245   REGISTER_MATCHER(newExpr);
246   REGISTER_MATCHER(nullPtrLiteralExpr);
247   REGISTER_MATCHER(nullStmt);
248   REGISTER_MATCHER(ofClass);
249   REGISTER_MATCHER(on);
250   REGISTER_MATCHER(onImplicitObjectArgument);
251   REGISTER_MATCHER(operatorCallExpr);
252   REGISTER_MATCHER(parameterCountIs);
253   REGISTER_MATCHER(parenType);
254   REGISTER_MATCHER(pointee);
255   REGISTER_MATCHER(pointerType);
256   REGISTER_MATCHER(qualType);
257   REGISTER_MATCHER(rValueReferenceType);
258   REGISTER_MATCHER(recordDecl);
259   REGISTER_MATCHER(recordType);
260   REGISTER_MATCHER(referenceType);
261   REGISTER_MATCHER(refersToDeclaration);
262   REGISTER_MATCHER(refersToType);
263   REGISTER_MATCHER(reinterpretCastExpr);
264   REGISTER_MATCHER(returnStmt);
265   REGISTER_MATCHER(returns);
266   REGISTER_MATCHER(sizeOfExpr);
267   REGISTER_MATCHER(specifiesNamespace);
268   REGISTER_MATCHER(specifiesType);
269   REGISTER_MATCHER(specifiesTypeLoc);
270   REGISTER_MATCHER(statementCountIs);
271   REGISTER_MATCHER(staticCastExpr);
272   REGISTER_MATCHER(stmt);
273   REGISTER_MATCHER(stringLiteral);
274   REGISTER_MATCHER(switchCase);
275   REGISTER_MATCHER(switchStmt);
276   REGISTER_MATCHER(templateSpecializationType);
277   REGISTER_MATCHER(thisExpr);
278   REGISTER_MATCHER(throughUsingDecl);
279   REGISTER_MATCHER(throwExpr);
280   REGISTER_MATCHER(to);
281   REGISTER_MATCHER(tryStmt);
282   REGISTER_MATCHER(type);
283   REGISTER_MATCHER(typeLoc);
284   REGISTER_MATCHER(typedefType);
285   REGISTER_MATCHER(unaryExprOrTypeTraitExpr);
286   REGISTER_MATCHER(unaryOperator);
287   REGISTER_MATCHER(unless);
288   REGISTER_MATCHER(userDefinedLiteral);
289   REGISTER_MATCHER(usingDecl);
290   REGISTER_MATCHER(varDecl);
291   REGISTER_MATCHER(variableArrayType);
292   REGISTER_MATCHER(whileStmt);
293   REGISTER_MATCHER(withInitializer);
294 }
295 
296 RegistryMaps::~RegistryMaps() {
297   for (ConstructorMap::iterator it = Constructors.begin(),
298                                 end = Constructors.end();
299        it != end; ++it) {
300     delete it->second;
301   }
302 }
303 
304 static llvm::ManagedStatic<RegistryMaps> RegistryData;
305 
306 } // anonymous namespace
307 
308 // static
309 llvm::Optional<MatcherCtor>
310 Registry::lookupMatcherCtor(StringRef MatcherName, const SourceRange &NameRange,
311                             Diagnostics *Error) {
312   ConstructorMap::const_iterator it =
313       RegistryData->constructors().find(MatcherName);
314   if (it == RegistryData->constructors().end()) {
315     Error->addError(NameRange, Error->ET_RegistryNotFound) << MatcherName;
316     return llvm::Optional<MatcherCtor>();
317   }
318 
319   return it->second;
320 }
321 
322 // static
323 VariantMatcher Registry::constructMatcher(MatcherCtor Ctor,
324                                           const SourceRange &NameRange,
325                                           ArrayRef<ParserValue> Args,
326                                           Diagnostics *Error) {
327   return Ctor->create(NameRange, Args, Error);
328 }
329 
330 // static
331 VariantMatcher Registry::constructBoundMatcher(MatcherCtor Ctor,
332                                                const SourceRange &NameRange,
333                                                StringRef BindID,
334                                                ArrayRef<ParserValue> Args,
335                                                Diagnostics *Error) {
336   VariantMatcher Out = constructMatcher(Ctor, NameRange, Args, Error);
337   if (Out.isNull()) return Out;
338 
339   llvm::Optional<DynTypedMatcher> Result = Out.getSingleMatcher();
340   if (Result.hasValue()) {
341     llvm::Optional<DynTypedMatcher> Bound = Result->tryBind(BindID);
342     if (Bound.hasValue()) {
343       return VariantMatcher::SingleMatcher(*Bound);
344     }
345   }
346   Error->addError(NameRange, Error->ET_RegistryNotBindable);
347   return VariantMatcher();
348 }
349 
350 }  // namespace dynamic
351 }  // namespace ast_matchers
352 }  // namespace clang
353