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