17330f729Sjoerg //===- Registry.cpp - Matcher registry ------------------------------------===//
27330f729Sjoerg //
37330f729Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47330f729Sjoerg // See https://llvm.org/LICENSE.txt for license information.
57330f729Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67330f729Sjoerg //
77330f729Sjoerg //===----------------------------------------------------------------------===//
87330f729Sjoerg //
97330f729Sjoerg /// \file
107330f729Sjoerg /// Registry map populated at static initialization time.
117330f729Sjoerg //
127330f729Sjoerg //===----------------------------------------------------------------------===//
137330f729Sjoerg
147330f729Sjoerg #include "clang/ASTMatchers/Dynamic/Registry.h"
157330f729Sjoerg #include "Marshallers.h"
167330f729Sjoerg #include "clang/AST/ASTTypeTraits.h"
177330f729Sjoerg #include "clang/ASTMatchers/ASTMatchers.h"
187330f729Sjoerg #include "clang/ASTMatchers/Dynamic/Diagnostics.h"
197330f729Sjoerg #include "clang/ASTMatchers/Dynamic/VariantValue.h"
207330f729Sjoerg #include "llvm/ADT/Optional.h"
217330f729Sjoerg #include "llvm/ADT/STLExtras.h"
227330f729Sjoerg #include "llvm/ADT/StringMap.h"
237330f729Sjoerg #include "llvm/ADT/StringRef.h"
247330f729Sjoerg #include "llvm/Support/ManagedStatic.h"
257330f729Sjoerg #include "llvm/Support/raw_ostream.h"
267330f729Sjoerg #include <cassert>
277330f729Sjoerg #include <iterator>
287330f729Sjoerg #include <memory>
297330f729Sjoerg #include <set>
307330f729Sjoerg #include <string>
317330f729Sjoerg #include <utility>
327330f729Sjoerg #include <vector>
337330f729Sjoerg
347330f729Sjoerg namespace clang {
357330f729Sjoerg namespace ast_matchers {
367330f729Sjoerg namespace dynamic {
377330f729Sjoerg
387330f729Sjoerg namespace {
397330f729Sjoerg
407330f729Sjoerg using internal::MatcherDescriptor;
417330f729Sjoerg
42*e038c9c4Sjoerg using ConstructorMap =
43*e038c9c4Sjoerg llvm::StringMap<std::unique_ptr<const MatcherDescriptor>>;
447330f729Sjoerg
457330f729Sjoerg class RegistryMaps {
467330f729Sjoerg public:
477330f729Sjoerg RegistryMaps();
487330f729Sjoerg ~RegistryMaps();
497330f729Sjoerg
constructors() const507330f729Sjoerg const ConstructorMap &constructors() const { return Constructors; }
517330f729Sjoerg
527330f729Sjoerg private:
537330f729Sjoerg void registerMatcher(StringRef MatcherName,
547330f729Sjoerg std::unique_ptr<MatcherDescriptor> Callback);
557330f729Sjoerg
567330f729Sjoerg ConstructorMap Constructors;
577330f729Sjoerg };
587330f729Sjoerg
597330f729Sjoerg } // namespace
607330f729Sjoerg
registerMatcher(StringRef MatcherName,std::unique_ptr<MatcherDescriptor> Callback)617330f729Sjoerg void RegistryMaps::registerMatcher(
627330f729Sjoerg StringRef MatcherName, std::unique_ptr<MatcherDescriptor> Callback) {
637330f729Sjoerg assert(Constructors.find(MatcherName) == Constructors.end());
647330f729Sjoerg Constructors[MatcherName] = std::move(Callback);
657330f729Sjoerg }
667330f729Sjoerg
677330f729Sjoerg #define REGISTER_MATCHER(name) \
687330f729Sjoerg registerMatcher(#name, internal::makeMatcherAutoMarshall( \
697330f729Sjoerg ::clang::ast_matchers::name, #name));
707330f729Sjoerg
717330f729Sjoerg #define REGISTER_MATCHER_OVERLOAD(name) \
727330f729Sjoerg registerMatcher(#name, \
737330f729Sjoerg std::make_unique<internal::OverloadedMatcherDescriptor>(name##Callbacks))
747330f729Sjoerg
757330f729Sjoerg #define SPECIFIC_MATCHER_OVERLOAD(name, Id) \
767330f729Sjoerg static_cast<::clang::ast_matchers::name##_Type##Id>( \
777330f729Sjoerg ::clang::ast_matchers::name)
787330f729Sjoerg
797330f729Sjoerg #define MATCHER_OVERLOAD_ENTRY(name, Id) \
807330f729Sjoerg internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, Id), \
817330f729Sjoerg #name)
827330f729Sjoerg
837330f729Sjoerg #define REGISTER_OVERLOADED_2(name) \
847330f729Sjoerg do { \
857330f729Sjoerg std::unique_ptr<MatcherDescriptor> name##Callbacks[] = { \
867330f729Sjoerg MATCHER_OVERLOAD_ENTRY(name, 0), \
877330f729Sjoerg MATCHER_OVERLOAD_ENTRY(name, 1)}; \
887330f729Sjoerg REGISTER_MATCHER_OVERLOAD(name); \
897330f729Sjoerg } while (false)
907330f729Sjoerg
91*e038c9c4Sjoerg #define REGISTER_REGEX_MATCHER(name) \
92*e038c9c4Sjoerg registerMatcher(#name, internal::makeMatcherRegexMarshall(name, name))
93*e038c9c4Sjoerg
947330f729Sjoerg /// Generate a registry map with all the known matchers.
957330f729Sjoerg /// Please keep sorted alphabetically!
RegistryMaps()967330f729Sjoerg RegistryMaps::RegistryMaps() {
977330f729Sjoerg // TODO: Here is the list of the missing matchers, grouped by reason.
987330f729Sjoerg //
997330f729Sjoerg // Polymorphic + argument overload:
1007330f729Sjoerg // findAll
1017330f729Sjoerg //
1027330f729Sjoerg // Other:
1037330f729Sjoerg // equalsNode
1047330f729Sjoerg
105*e038c9c4Sjoerg registerMatcher("mapAnyOf",
106*e038c9c4Sjoerg std::make_unique<internal::MapAnyOfBuilderDescriptor>());
107*e038c9c4Sjoerg
1087330f729Sjoerg REGISTER_OVERLOADED_2(callee);
109*e038c9c4Sjoerg REGISTER_OVERLOADED_2(hasAnyCapture);
1107330f729Sjoerg REGISTER_OVERLOADED_2(hasPrefix);
1117330f729Sjoerg REGISTER_OVERLOADED_2(hasType);
1127330f729Sjoerg REGISTER_OVERLOADED_2(ignoringParens);
1137330f729Sjoerg REGISTER_OVERLOADED_2(isDerivedFrom);
1147330f729Sjoerg REGISTER_OVERLOADED_2(isDirectlyDerivedFrom);
1157330f729Sjoerg REGISTER_OVERLOADED_2(isSameOrDerivedFrom);
1167330f729Sjoerg REGISTER_OVERLOADED_2(loc);
1177330f729Sjoerg REGISTER_OVERLOADED_2(pointsTo);
1187330f729Sjoerg REGISTER_OVERLOADED_2(references);
1197330f729Sjoerg REGISTER_OVERLOADED_2(thisPointerType);
1207330f729Sjoerg
1217330f729Sjoerg std::unique_ptr<MatcherDescriptor> equalsCallbacks[] = {
1227330f729Sjoerg MATCHER_OVERLOAD_ENTRY(equals, 0),
1237330f729Sjoerg MATCHER_OVERLOAD_ENTRY(equals, 1),
1247330f729Sjoerg MATCHER_OVERLOAD_ENTRY(equals, 2),
1257330f729Sjoerg };
1267330f729Sjoerg REGISTER_MATCHER_OVERLOAD(equals);
1277330f729Sjoerg
128*e038c9c4Sjoerg REGISTER_REGEX_MATCHER(isExpansionInFileMatching);
129*e038c9c4Sjoerg REGISTER_REGEX_MATCHER(matchesName);
130*e038c9c4Sjoerg REGISTER_REGEX_MATCHER(matchesSelector);
131*e038c9c4Sjoerg
1327330f729Sjoerg REGISTER_MATCHER(accessSpecDecl);
1337330f729Sjoerg REGISTER_MATCHER(addrLabelExpr);
1347330f729Sjoerg REGISTER_MATCHER(alignOfExpr);
1357330f729Sjoerg REGISTER_MATCHER(allOf);
1367330f729Sjoerg REGISTER_MATCHER(anyOf);
1377330f729Sjoerg REGISTER_MATCHER(anything);
1387330f729Sjoerg REGISTER_MATCHER(argumentCountIs);
1397330f729Sjoerg REGISTER_MATCHER(arraySubscriptExpr);
1407330f729Sjoerg REGISTER_MATCHER(arrayType);
1417330f729Sjoerg REGISTER_MATCHER(asString);
1427330f729Sjoerg REGISTER_MATCHER(asmStmt);
1437330f729Sjoerg REGISTER_MATCHER(atomicExpr);
1447330f729Sjoerg REGISTER_MATCHER(atomicType);
1457330f729Sjoerg REGISTER_MATCHER(autoType);
1467330f729Sjoerg REGISTER_MATCHER(autoreleasePoolStmt)
1477330f729Sjoerg REGISTER_MATCHER(binaryConditionalOperator);
1487330f729Sjoerg REGISTER_MATCHER(binaryOperator);
149*e038c9c4Sjoerg REGISTER_MATCHER(binaryOperation);
150*e038c9c4Sjoerg REGISTER_MATCHER(bindingDecl);
1517330f729Sjoerg REGISTER_MATCHER(blockDecl);
1527330f729Sjoerg REGISTER_MATCHER(blockExpr);
1537330f729Sjoerg REGISTER_MATCHER(blockPointerType);
1547330f729Sjoerg REGISTER_MATCHER(booleanType);
1557330f729Sjoerg REGISTER_MATCHER(breakStmt);
1567330f729Sjoerg REGISTER_MATCHER(builtinType);
1577330f729Sjoerg REGISTER_MATCHER(cStyleCastExpr);
1587330f729Sjoerg REGISTER_MATCHER(callExpr);
1597330f729Sjoerg REGISTER_MATCHER(caseStmt);
1607330f729Sjoerg REGISTER_MATCHER(castExpr);
1617330f729Sjoerg REGISTER_MATCHER(characterLiteral);
1627330f729Sjoerg REGISTER_MATCHER(chooseExpr);
1637330f729Sjoerg REGISTER_MATCHER(classTemplateDecl);
164*e038c9c4Sjoerg REGISTER_MATCHER(classTemplatePartialSpecializationDecl);
1657330f729Sjoerg REGISTER_MATCHER(classTemplateSpecializationDecl);
1667330f729Sjoerg REGISTER_MATCHER(complexType);
1677330f729Sjoerg REGISTER_MATCHER(compoundLiteralExpr);
1687330f729Sjoerg REGISTER_MATCHER(compoundStmt);
169*e038c9c4Sjoerg REGISTER_MATCHER(coawaitExpr);
1707330f729Sjoerg REGISTER_MATCHER(conditionalOperator);
1717330f729Sjoerg REGISTER_MATCHER(constantArrayType);
1727330f729Sjoerg REGISTER_MATCHER(constantExpr);
1737330f729Sjoerg REGISTER_MATCHER(containsDeclaration);
1747330f729Sjoerg REGISTER_MATCHER(continueStmt);
175*e038c9c4Sjoerg REGISTER_MATCHER(coreturnStmt);
176*e038c9c4Sjoerg REGISTER_MATCHER(coyieldExpr);
1777330f729Sjoerg REGISTER_MATCHER(cudaKernelCallExpr);
178*e038c9c4Sjoerg REGISTER_MATCHER(cxxBaseSpecifier);
1797330f729Sjoerg REGISTER_MATCHER(cxxBindTemporaryExpr);
1807330f729Sjoerg REGISTER_MATCHER(cxxBoolLiteral);
1817330f729Sjoerg REGISTER_MATCHER(cxxCatchStmt);
1827330f729Sjoerg REGISTER_MATCHER(cxxConstCastExpr);
1837330f729Sjoerg REGISTER_MATCHER(cxxConstructExpr);
1847330f729Sjoerg REGISTER_MATCHER(cxxConstructorDecl);
1857330f729Sjoerg REGISTER_MATCHER(cxxConversionDecl);
1867330f729Sjoerg REGISTER_MATCHER(cxxCtorInitializer);
1877330f729Sjoerg REGISTER_MATCHER(cxxDeductionGuideDecl);
1887330f729Sjoerg REGISTER_MATCHER(cxxDefaultArgExpr);
1897330f729Sjoerg REGISTER_MATCHER(cxxDeleteExpr);
1907330f729Sjoerg REGISTER_MATCHER(cxxDependentScopeMemberExpr);
1917330f729Sjoerg REGISTER_MATCHER(cxxDestructorDecl);
1927330f729Sjoerg REGISTER_MATCHER(cxxDynamicCastExpr);
1937330f729Sjoerg REGISTER_MATCHER(cxxForRangeStmt);
1947330f729Sjoerg REGISTER_MATCHER(cxxFunctionalCastExpr);
1957330f729Sjoerg REGISTER_MATCHER(cxxMemberCallExpr);
1967330f729Sjoerg REGISTER_MATCHER(cxxMethodDecl);
1977330f729Sjoerg REGISTER_MATCHER(cxxNewExpr);
198*e038c9c4Sjoerg REGISTER_MATCHER(cxxNoexceptExpr);
1997330f729Sjoerg REGISTER_MATCHER(cxxNullPtrLiteralExpr);
2007330f729Sjoerg REGISTER_MATCHER(cxxOperatorCallExpr);
2017330f729Sjoerg REGISTER_MATCHER(cxxRecordDecl);
2027330f729Sjoerg REGISTER_MATCHER(cxxReinterpretCastExpr);
203*e038c9c4Sjoerg REGISTER_MATCHER(cxxRewrittenBinaryOperator);
2047330f729Sjoerg REGISTER_MATCHER(cxxStaticCastExpr);
2057330f729Sjoerg REGISTER_MATCHER(cxxStdInitializerListExpr);
2067330f729Sjoerg REGISTER_MATCHER(cxxTemporaryObjectExpr);
2077330f729Sjoerg REGISTER_MATCHER(cxxThisExpr);
2087330f729Sjoerg REGISTER_MATCHER(cxxThrowExpr);
2097330f729Sjoerg REGISTER_MATCHER(cxxTryStmt);
2107330f729Sjoerg REGISTER_MATCHER(cxxUnresolvedConstructExpr);
2117330f729Sjoerg REGISTER_MATCHER(decayedType);
2127330f729Sjoerg REGISTER_MATCHER(decl);
213*e038c9c4Sjoerg REGISTER_MATCHER(decompositionDecl);
2147330f729Sjoerg REGISTER_MATCHER(declCountIs);
2157330f729Sjoerg REGISTER_MATCHER(declRefExpr);
2167330f729Sjoerg REGISTER_MATCHER(declStmt);
2177330f729Sjoerg REGISTER_MATCHER(declaratorDecl);
2187330f729Sjoerg REGISTER_MATCHER(decltypeType);
219*e038c9c4Sjoerg REGISTER_MATCHER(deducedTemplateSpecializationType);
2207330f729Sjoerg REGISTER_MATCHER(defaultStmt);
221*e038c9c4Sjoerg REGISTER_MATCHER(dependentCoawaitExpr);
2227330f729Sjoerg REGISTER_MATCHER(dependentSizedArrayType);
2237330f729Sjoerg REGISTER_MATCHER(designatedInitExpr);
2247330f729Sjoerg REGISTER_MATCHER(designatorCountIs);
2257330f729Sjoerg REGISTER_MATCHER(doStmt);
2267330f729Sjoerg REGISTER_MATCHER(eachOf);
2277330f729Sjoerg REGISTER_MATCHER(elaboratedType);
2287330f729Sjoerg REGISTER_MATCHER(enumConstantDecl);
2297330f729Sjoerg REGISTER_MATCHER(enumDecl);
2307330f729Sjoerg REGISTER_MATCHER(enumType);
2317330f729Sjoerg REGISTER_MATCHER(equalsBoundNode);
2327330f729Sjoerg REGISTER_MATCHER(equalsIntegralValue);
2337330f729Sjoerg REGISTER_MATCHER(explicitCastExpr);
2347330f729Sjoerg REGISTER_MATCHER(expr);
2357330f729Sjoerg REGISTER_MATCHER(exprWithCleanups);
2367330f729Sjoerg REGISTER_MATCHER(fieldDecl);
237*e038c9c4Sjoerg REGISTER_MATCHER(fixedPointLiteral);
2387330f729Sjoerg REGISTER_MATCHER(floatLiteral);
239*e038c9c4Sjoerg REGISTER_MATCHER(forCallable);
240*e038c9c4Sjoerg REGISTER_MATCHER(forDecomposition);
2417330f729Sjoerg REGISTER_MATCHER(forEach);
2427330f729Sjoerg REGISTER_MATCHER(forEachArgumentWithParam);
243*e038c9c4Sjoerg REGISTER_MATCHER(forEachArgumentWithParamType);
2447330f729Sjoerg REGISTER_MATCHER(forEachConstructorInitializer);
2457330f729Sjoerg REGISTER_MATCHER(forEachDescendant);
2467330f729Sjoerg REGISTER_MATCHER(forEachOverridden);
2477330f729Sjoerg REGISTER_MATCHER(forEachSwitchCase);
2487330f729Sjoerg REGISTER_MATCHER(forField);
2497330f729Sjoerg REGISTER_MATCHER(forFunction);
2507330f729Sjoerg REGISTER_MATCHER(forStmt);
2517330f729Sjoerg REGISTER_MATCHER(friendDecl);
2527330f729Sjoerg REGISTER_MATCHER(functionDecl);
2537330f729Sjoerg REGISTER_MATCHER(functionProtoType);
2547330f729Sjoerg REGISTER_MATCHER(functionTemplateDecl);
2557330f729Sjoerg REGISTER_MATCHER(functionType);
256*e038c9c4Sjoerg REGISTER_MATCHER(genericSelectionExpr);
2577330f729Sjoerg REGISTER_MATCHER(gnuNullExpr);
2587330f729Sjoerg REGISTER_MATCHER(gotoStmt);
2597330f729Sjoerg REGISTER_MATCHER(has);
2607330f729Sjoerg REGISTER_MATCHER(hasAncestor);
2617330f729Sjoerg REGISTER_MATCHER(hasAnyArgument);
262*e038c9c4Sjoerg REGISTER_MATCHER(hasAnyBase);
263*e038c9c4Sjoerg REGISTER_MATCHER(hasAnyBinding);
264*e038c9c4Sjoerg REGISTER_MATCHER(hasAnyBody);
2657330f729Sjoerg REGISTER_MATCHER(hasAnyClause);
2667330f729Sjoerg REGISTER_MATCHER(hasAnyConstructorInitializer);
2677330f729Sjoerg REGISTER_MATCHER(hasAnyDeclaration);
2687330f729Sjoerg REGISTER_MATCHER(hasAnyName);
269*e038c9c4Sjoerg REGISTER_MATCHER(hasAnyOperatorName);
270*e038c9c4Sjoerg REGISTER_MATCHER(hasAnyOverloadedOperatorName);
2717330f729Sjoerg REGISTER_MATCHER(hasAnyParameter);
272*e038c9c4Sjoerg REGISTER_MATCHER(hasAnyPlacementArg);
2737330f729Sjoerg REGISTER_MATCHER(hasAnySelector);
2747330f729Sjoerg REGISTER_MATCHER(hasAnySubstatement);
2757330f729Sjoerg REGISTER_MATCHER(hasAnyTemplateArgument);
2767330f729Sjoerg REGISTER_MATCHER(hasAnyUsingShadowDecl);
2777330f729Sjoerg REGISTER_MATCHER(hasArgument);
2787330f729Sjoerg REGISTER_MATCHER(hasArgumentOfType);
2797330f729Sjoerg REGISTER_MATCHER(hasArraySize);
2807330f729Sjoerg REGISTER_MATCHER(hasAttr);
2817330f729Sjoerg REGISTER_MATCHER(hasAutomaticStorageDuration);
2827330f729Sjoerg REGISTER_MATCHER(hasBase);
283*e038c9c4Sjoerg REGISTER_MATCHER(hasBinding);
2847330f729Sjoerg REGISTER_MATCHER(hasBitWidth);
2857330f729Sjoerg REGISTER_MATCHER(hasBody);
2867330f729Sjoerg REGISTER_MATCHER(hasCanonicalType);
2877330f729Sjoerg REGISTER_MATCHER(hasCaseConstant);
2887330f729Sjoerg REGISTER_MATCHER(hasCastKind);
2897330f729Sjoerg REGISTER_MATCHER(hasCondition);
2907330f729Sjoerg REGISTER_MATCHER(hasConditionVariableStatement);
2917330f729Sjoerg REGISTER_MATCHER(hasDecayedType);
2927330f729Sjoerg REGISTER_MATCHER(hasDeclContext);
2937330f729Sjoerg REGISTER_MATCHER(hasDeclaration);
2947330f729Sjoerg REGISTER_MATCHER(hasDeducedType);
2957330f729Sjoerg REGISTER_MATCHER(hasDefaultArgument);
2967330f729Sjoerg REGISTER_MATCHER(hasDefinition);
2977330f729Sjoerg REGISTER_MATCHER(hasDescendant);
2987330f729Sjoerg REGISTER_MATCHER(hasDestinationType);
299*e038c9c4Sjoerg REGISTER_MATCHER(hasDirectBase);
3007330f729Sjoerg REGISTER_MATCHER(hasDynamicExceptionSpec);
3017330f729Sjoerg REGISTER_MATCHER(hasEitherOperand);
3027330f729Sjoerg REGISTER_MATCHER(hasElementType);
3037330f729Sjoerg REGISTER_MATCHER(hasElse);
3047330f729Sjoerg REGISTER_MATCHER(hasExplicitSpecifier);
3057330f729Sjoerg REGISTER_MATCHER(hasExternalFormalLinkage);
3067330f729Sjoerg REGISTER_MATCHER(hasFalseExpression);
3077330f729Sjoerg REGISTER_MATCHER(hasGlobalStorage);
3087330f729Sjoerg REGISTER_MATCHER(hasImplicitDestinationType);
3097330f729Sjoerg REGISTER_MATCHER(hasInClassInitializer);
3107330f729Sjoerg REGISTER_MATCHER(hasIncrement);
3117330f729Sjoerg REGISTER_MATCHER(hasIndex);
3127330f729Sjoerg REGISTER_MATCHER(hasInit);
3137330f729Sjoerg REGISTER_MATCHER(hasInitializer);
314*e038c9c4Sjoerg REGISTER_MATCHER(hasInitStatement);
3157330f729Sjoerg REGISTER_MATCHER(hasKeywordSelector);
3167330f729Sjoerg REGISTER_MATCHER(hasLHS);
3177330f729Sjoerg REGISTER_MATCHER(hasLocalQualifiers);
3187330f729Sjoerg REGISTER_MATCHER(hasLocalStorage);
3197330f729Sjoerg REGISTER_MATCHER(hasLoopInit);
3207330f729Sjoerg REGISTER_MATCHER(hasLoopVariable);
321*e038c9c4Sjoerg REGISTER_MATCHER(hasMemberName);
3227330f729Sjoerg REGISTER_MATCHER(hasMethod);
3237330f729Sjoerg REGISTER_MATCHER(hasName);
3247330f729Sjoerg REGISTER_MATCHER(hasNullSelector);
3257330f729Sjoerg REGISTER_MATCHER(hasObjectExpression);
326*e038c9c4Sjoerg REGISTER_MATCHER(hasOperands);
3277330f729Sjoerg REGISTER_MATCHER(hasOperatorName);
3287330f729Sjoerg REGISTER_MATCHER(hasOverloadedOperatorName);
3297330f729Sjoerg REGISTER_MATCHER(hasParameter);
3307330f729Sjoerg REGISTER_MATCHER(hasParent);
3317330f729Sjoerg REGISTER_MATCHER(hasQualifier);
3327330f729Sjoerg REGISTER_MATCHER(hasRHS);
3337330f729Sjoerg REGISTER_MATCHER(hasRangeInit);
3347330f729Sjoerg REGISTER_MATCHER(hasReceiver);
3357330f729Sjoerg REGISTER_MATCHER(hasReceiverType);
3367330f729Sjoerg REGISTER_MATCHER(hasReplacementType);
3377330f729Sjoerg REGISTER_MATCHER(hasReturnValue);
338*e038c9c4Sjoerg REGISTER_MATCHER(hasPlacementArg);
3397330f729Sjoerg REGISTER_MATCHER(hasSelector);
3407330f729Sjoerg REGISTER_MATCHER(hasSingleDecl);
3417330f729Sjoerg REGISTER_MATCHER(hasSize);
3427330f729Sjoerg REGISTER_MATCHER(hasSizeExpr);
3437330f729Sjoerg REGISTER_MATCHER(hasSourceExpression);
3447330f729Sjoerg REGISTER_MATCHER(hasSpecializedTemplate);
3457330f729Sjoerg REGISTER_MATCHER(hasStaticStorageDuration);
3467330f729Sjoerg REGISTER_MATCHER(hasStructuredBlock);
3477330f729Sjoerg REGISTER_MATCHER(hasSyntacticForm);
3487330f729Sjoerg REGISTER_MATCHER(hasTargetDecl);
3497330f729Sjoerg REGISTER_MATCHER(hasTemplateArgument);
3507330f729Sjoerg REGISTER_MATCHER(hasThen);
3517330f729Sjoerg REGISTER_MATCHER(hasThreadStorageDuration);
3527330f729Sjoerg REGISTER_MATCHER(hasTrailingReturn);
3537330f729Sjoerg REGISTER_MATCHER(hasTrueExpression);
3547330f729Sjoerg REGISTER_MATCHER(hasTypeLoc);
3557330f729Sjoerg REGISTER_MATCHER(hasUnaryOperand);
3567330f729Sjoerg REGISTER_MATCHER(hasUnarySelector);
3577330f729Sjoerg REGISTER_MATCHER(hasUnderlyingDecl);
3587330f729Sjoerg REGISTER_MATCHER(hasUnderlyingType);
3597330f729Sjoerg REGISTER_MATCHER(hasUnqualifiedDesugaredType);
3607330f729Sjoerg REGISTER_MATCHER(hasValueType);
3617330f729Sjoerg REGISTER_MATCHER(ifStmt);
3627330f729Sjoerg REGISTER_MATCHER(ignoringElidableConstructorCall);
3637330f729Sjoerg REGISTER_MATCHER(ignoringImpCasts);
3647330f729Sjoerg REGISTER_MATCHER(ignoringImplicit);
3657330f729Sjoerg REGISTER_MATCHER(ignoringParenCasts);
3667330f729Sjoerg REGISTER_MATCHER(ignoringParenImpCasts);
3677330f729Sjoerg REGISTER_MATCHER(imaginaryLiteral);
3687330f729Sjoerg REGISTER_MATCHER(implicitCastExpr);
3697330f729Sjoerg REGISTER_MATCHER(implicitValueInitExpr);
3707330f729Sjoerg REGISTER_MATCHER(incompleteArrayType);
3717330f729Sjoerg REGISTER_MATCHER(indirectFieldDecl);
3727330f729Sjoerg REGISTER_MATCHER(initListExpr);
3737330f729Sjoerg REGISTER_MATCHER(injectedClassNameType);
3747330f729Sjoerg REGISTER_MATCHER(innerType);
3757330f729Sjoerg REGISTER_MATCHER(integerLiteral);
376*e038c9c4Sjoerg REGISTER_MATCHER(invocation);
3777330f729Sjoerg REGISTER_MATCHER(isAllowedToContainClauseKind);
3787330f729Sjoerg REGISTER_MATCHER(isAnonymous);
3797330f729Sjoerg REGISTER_MATCHER(isAnyCharacter);
3807330f729Sjoerg REGISTER_MATCHER(isAnyPointer);
3817330f729Sjoerg REGISTER_MATCHER(isArray);
3827330f729Sjoerg REGISTER_MATCHER(isArrow);
3837330f729Sjoerg REGISTER_MATCHER(isAssignmentOperator);
384*e038c9c4Sjoerg REGISTER_MATCHER(isAtPosition);
3857330f729Sjoerg REGISTER_MATCHER(isBaseInitializer);
3867330f729Sjoerg REGISTER_MATCHER(isBitField);
3877330f729Sjoerg REGISTER_MATCHER(isCatchAll);
3887330f729Sjoerg REGISTER_MATCHER(isClass);
3897330f729Sjoerg REGISTER_MATCHER(isClassMessage);
3907330f729Sjoerg REGISTER_MATCHER(isClassMethod);
391*e038c9c4Sjoerg REGISTER_MATCHER(isComparisonOperator);
3927330f729Sjoerg REGISTER_MATCHER(isConst);
3937330f729Sjoerg REGISTER_MATCHER(isConstQualified);
3947330f729Sjoerg REGISTER_MATCHER(isConstexpr);
3957330f729Sjoerg REGISTER_MATCHER(isCopyAssignmentOperator);
3967330f729Sjoerg REGISTER_MATCHER(isCopyConstructor);
3977330f729Sjoerg REGISTER_MATCHER(isDefaultConstructor);
3987330f729Sjoerg REGISTER_MATCHER(isDefaulted);
3997330f729Sjoerg REGISTER_MATCHER(isDefinition);
4007330f729Sjoerg REGISTER_MATCHER(isDelegatingConstructor);
4017330f729Sjoerg REGISTER_MATCHER(isDeleted);
402*e038c9c4Sjoerg REGISTER_MATCHER(isEnum);
4037330f729Sjoerg REGISTER_MATCHER(isExceptionVariable);
404*e038c9c4Sjoerg REGISTER_MATCHER(isExpandedFromMacro);
4057330f729Sjoerg REGISTER_MATCHER(isExpansionInMainFile);
4067330f729Sjoerg REGISTER_MATCHER(isExpansionInSystemHeader);
4077330f729Sjoerg REGISTER_MATCHER(isExplicit);
4087330f729Sjoerg REGISTER_MATCHER(isExplicitTemplateSpecialization);
4097330f729Sjoerg REGISTER_MATCHER(isExpr);
4107330f729Sjoerg REGISTER_MATCHER(isExternC);
4117330f729Sjoerg REGISTER_MATCHER(isFinal);
412*e038c9c4Sjoerg REGISTER_MATCHER(isFirstPrivateKind);
4137330f729Sjoerg REGISTER_MATCHER(isImplicit);
4147330f729Sjoerg REGISTER_MATCHER(isInStdNamespace);
4157330f729Sjoerg REGISTER_MATCHER(isInTemplateInstantiation);
4167330f729Sjoerg REGISTER_MATCHER(isInline);
4177330f729Sjoerg REGISTER_MATCHER(isInstanceMessage);
4187330f729Sjoerg REGISTER_MATCHER(isInstanceMethod);
4197330f729Sjoerg REGISTER_MATCHER(isInstantiated);
4207330f729Sjoerg REGISTER_MATCHER(isInstantiationDependent);
4217330f729Sjoerg REGISTER_MATCHER(isInteger);
4227330f729Sjoerg REGISTER_MATCHER(isIntegral);
4237330f729Sjoerg REGISTER_MATCHER(isLambda);
4247330f729Sjoerg REGISTER_MATCHER(isListInitialization);
4257330f729Sjoerg REGISTER_MATCHER(isMain);
4267330f729Sjoerg REGISTER_MATCHER(isMemberInitializer);
4277330f729Sjoerg REGISTER_MATCHER(isMoveAssignmentOperator);
4287330f729Sjoerg REGISTER_MATCHER(isMoveConstructor);
4297330f729Sjoerg REGISTER_MATCHER(isNoReturn);
4307330f729Sjoerg REGISTER_MATCHER(isNoThrow);
4317330f729Sjoerg REGISTER_MATCHER(isNoneKind);
4327330f729Sjoerg REGISTER_MATCHER(isOverride);
4337330f729Sjoerg REGISTER_MATCHER(isPrivate);
4347330f729Sjoerg REGISTER_MATCHER(isProtected);
4357330f729Sjoerg REGISTER_MATCHER(isPublic);
4367330f729Sjoerg REGISTER_MATCHER(isPure);
4377330f729Sjoerg REGISTER_MATCHER(isScoped);
4387330f729Sjoerg REGISTER_MATCHER(isSharedKind);
4397330f729Sjoerg REGISTER_MATCHER(isSignedInteger);
4407330f729Sjoerg REGISTER_MATCHER(isStandaloneDirective);
4417330f729Sjoerg REGISTER_MATCHER(isStaticLocal);
4427330f729Sjoerg REGISTER_MATCHER(isStaticStorageClass);
4437330f729Sjoerg REGISTER_MATCHER(isStruct);
4447330f729Sjoerg REGISTER_MATCHER(isTemplateInstantiation);
4457330f729Sjoerg REGISTER_MATCHER(isTypeDependent);
4467330f729Sjoerg REGISTER_MATCHER(isUnion);
4477330f729Sjoerg REGISTER_MATCHER(isUnsignedInteger);
4487330f729Sjoerg REGISTER_MATCHER(isUserProvided);
4497330f729Sjoerg REGISTER_MATCHER(isValueDependent);
4507330f729Sjoerg REGISTER_MATCHER(isVariadic);
4517330f729Sjoerg REGISTER_MATCHER(isVirtual);
4527330f729Sjoerg REGISTER_MATCHER(isVirtualAsWritten);
4537330f729Sjoerg REGISTER_MATCHER(isVolatileQualified);
454*e038c9c4Sjoerg REGISTER_MATCHER(isWeak);
4557330f729Sjoerg REGISTER_MATCHER(isWritten);
4567330f729Sjoerg REGISTER_MATCHER(lValueReferenceType);
4577330f729Sjoerg REGISTER_MATCHER(labelDecl);
4587330f729Sjoerg REGISTER_MATCHER(labelStmt);
4597330f729Sjoerg REGISTER_MATCHER(lambdaExpr);
4607330f729Sjoerg REGISTER_MATCHER(linkageSpecDecl);
4617330f729Sjoerg REGISTER_MATCHER(materializeTemporaryExpr);
4627330f729Sjoerg REGISTER_MATCHER(member);
4637330f729Sjoerg REGISTER_MATCHER(memberExpr);
464*e038c9c4Sjoerg REGISTER_MATCHER(memberHasSameNameAsBoundNode);
4657330f729Sjoerg REGISTER_MATCHER(memberPointerType);
4667330f729Sjoerg REGISTER_MATCHER(namedDecl);
4677330f729Sjoerg REGISTER_MATCHER(namesType);
4687330f729Sjoerg REGISTER_MATCHER(namespaceAliasDecl);
4697330f729Sjoerg REGISTER_MATCHER(namespaceDecl);
4707330f729Sjoerg REGISTER_MATCHER(nestedNameSpecifier);
4717330f729Sjoerg REGISTER_MATCHER(nestedNameSpecifierLoc);
4727330f729Sjoerg REGISTER_MATCHER(nonTypeTemplateParmDecl);
4737330f729Sjoerg REGISTER_MATCHER(nullPointerConstant);
4747330f729Sjoerg REGISTER_MATCHER(nullStmt);
4757330f729Sjoerg REGISTER_MATCHER(numSelectorArgs);
4767330f729Sjoerg REGISTER_MATCHER(objcCatchStmt);
4777330f729Sjoerg REGISTER_MATCHER(objcCategoryDecl);
4787330f729Sjoerg REGISTER_MATCHER(objcCategoryImplDecl);
4797330f729Sjoerg REGISTER_MATCHER(objcFinallyStmt);
4807330f729Sjoerg REGISTER_MATCHER(objcImplementationDecl);
4817330f729Sjoerg REGISTER_MATCHER(objcInterfaceDecl);
4827330f729Sjoerg REGISTER_MATCHER(objcIvarDecl);
4837330f729Sjoerg REGISTER_MATCHER(objcIvarRefExpr);
4847330f729Sjoerg REGISTER_MATCHER(objcMessageExpr);
4857330f729Sjoerg REGISTER_MATCHER(objcMethodDecl);
4867330f729Sjoerg REGISTER_MATCHER(objcObjectPointerType);
4877330f729Sjoerg REGISTER_MATCHER(objcPropertyDecl);
4887330f729Sjoerg REGISTER_MATCHER(objcProtocolDecl);
4897330f729Sjoerg REGISTER_MATCHER(objcThrowStmt);
4907330f729Sjoerg REGISTER_MATCHER(objcTryStmt);
4917330f729Sjoerg REGISTER_MATCHER(ofClass);
492*e038c9c4Sjoerg REGISTER_MATCHER(ofKind);
4937330f729Sjoerg REGISTER_MATCHER(ompDefaultClause);
4947330f729Sjoerg REGISTER_MATCHER(ompExecutableDirective);
4957330f729Sjoerg REGISTER_MATCHER(on);
4967330f729Sjoerg REGISTER_MATCHER(onImplicitObjectArgument);
4977330f729Sjoerg REGISTER_MATCHER(opaqueValueExpr);
498*e038c9c4Sjoerg REGISTER_MATCHER(optionally);
4997330f729Sjoerg REGISTER_MATCHER(parameterCountIs);
5007330f729Sjoerg REGISTER_MATCHER(parenExpr);
5017330f729Sjoerg REGISTER_MATCHER(parenListExpr);
5027330f729Sjoerg REGISTER_MATCHER(parenType);
5037330f729Sjoerg REGISTER_MATCHER(parmVarDecl);
5047330f729Sjoerg REGISTER_MATCHER(pointee);
5057330f729Sjoerg REGISTER_MATCHER(pointerType);
5067330f729Sjoerg REGISTER_MATCHER(predefinedExpr);
5077330f729Sjoerg REGISTER_MATCHER(qualType);
5087330f729Sjoerg REGISTER_MATCHER(rValueReferenceType);
5097330f729Sjoerg REGISTER_MATCHER(realFloatingPointType);
5107330f729Sjoerg REGISTER_MATCHER(recordDecl);
5117330f729Sjoerg REGISTER_MATCHER(recordType);
5127330f729Sjoerg REGISTER_MATCHER(referenceType);
5137330f729Sjoerg REGISTER_MATCHER(refersToDeclaration);
5147330f729Sjoerg REGISTER_MATCHER(refersToIntegralType);
5157330f729Sjoerg REGISTER_MATCHER(refersToTemplate);
5167330f729Sjoerg REGISTER_MATCHER(refersToType);
5177330f729Sjoerg REGISTER_MATCHER(requiresZeroInitialization);
5187330f729Sjoerg REGISTER_MATCHER(returnStmt);
5197330f729Sjoerg REGISTER_MATCHER(returns);
5207330f729Sjoerg REGISTER_MATCHER(sizeOfExpr);
5217330f729Sjoerg REGISTER_MATCHER(specifiesNamespace);
5227330f729Sjoerg REGISTER_MATCHER(specifiesType);
5237330f729Sjoerg REGISTER_MATCHER(specifiesTypeLoc);
5247330f729Sjoerg REGISTER_MATCHER(statementCountIs);
5257330f729Sjoerg REGISTER_MATCHER(staticAssertDecl);
5267330f729Sjoerg REGISTER_MATCHER(stmt);
5277330f729Sjoerg REGISTER_MATCHER(stmtExpr);
5287330f729Sjoerg REGISTER_MATCHER(stringLiteral);
5297330f729Sjoerg REGISTER_MATCHER(substNonTypeTemplateParmExpr);
5307330f729Sjoerg REGISTER_MATCHER(substTemplateTypeParmType);
5317330f729Sjoerg REGISTER_MATCHER(switchCase);
5327330f729Sjoerg REGISTER_MATCHER(switchStmt);
533*e038c9c4Sjoerg REGISTER_MATCHER(tagDecl);
5347330f729Sjoerg REGISTER_MATCHER(tagType);
5357330f729Sjoerg REGISTER_MATCHER(templateArgument);
5367330f729Sjoerg REGISTER_MATCHER(templateArgumentCountIs);
537*e038c9c4Sjoerg REGISTER_MATCHER(templateArgumentLoc);
5387330f729Sjoerg REGISTER_MATCHER(templateName);
5397330f729Sjoerg REGISTER_MATCHER(templateSpecializationType);
540*e038c9c4Sjoerg REGISTER_MATCHER(templateTemplateParmDecl);
5417330f729Sjoerg REGISTER_MATCHER(templateTypeParmDecl);
5427330f729Sjoerg REGISTER_MATCHER(templateTypeParmType);
5437330f729Sjoerg REGISTER_MATCHER(throughUsingDecl);
5447330f729Sjoerg REGISTER_MATCHER(to);
5457330f729Sjoerg REGISTER_MATCHER(translationUnitDecl);
5467330f729Sjoerg REGISTER_MATCHER(type);
5477330f729Sjoerg REGISTER_MATCHER(typeAliasDecl);
5487330f729Sjoerg REGISTER_MATCHER(typeAliasTemplateDecl);
5497330f729Sjoerg REGISTER_MATCHER(typeLoc);
5507330f729Sjoerg REGISTER_MATCHER(typedefDecl);
5517330f729Sjoerg REGISTER_MATCHER(typedefNameDecl);
5527330f729Sjoerg REGISTER_MATCHER(typedefType);
5537330f729Sjoerg REGISTER_MATCHER(unaryExprOrTypeTraitExpr);
5547330f729Sjoerg REGISTER_MATCHER(unaryOperator);
5557330f729Sjoerg REGISTER_MATCHER(unaryTransformType);
5567330f729Sjoerg REGISTER_MATCHER(unless);
5577330f729Sjoerg REGISTER_MATCHER(unresolvedLookupExpr);
5587330f729Sjoerg REGISTER_MATCHER(unresolvedMemberExpr);
5597330f729Sjoerg REGISTER_MATCHER(unresolvedUsingTypenameDecl);
5607330f729Sjoerg REGISTER_MATCHER(unresolvedUsingValueDecl);
5617330f729Sjoerg REGISTER_MATCHER(userDefinedLiteral);
5627330f729Sjoerg REGISTER_MATCHER(usesADL);
5637330f729Sjoerg REGISTER_MATCHER(usingDecl);
5647330f729Sjoerg REGISTER_MATCHER(usingDirectiveDecl);
5657330f729Sjoerg REGISTER_MATCHER(valueDecl);
5667330f729Sjoerg REGISTER_MATCHER(varDecl);
5677330f729Sjoerg REGISTER_MATCHER(variableArrayType);
5687330f729Sjoerg REGISTER_MATCHER(voidType);
5697330f729Sjoerg REGISTER_MATCHER(whileStmt);
5707330f729Sjoerg REGISTER_MATCHER(withInitializer);
5717330f729Sjoerg }
5727330f729Sjoerg
5737330f729Sjoerg RegistryMaps::~RegistryMaps() = default;
5747330f729Sjoerg
5757330f729Sjoerg static llvm::ManagedStatic<RegistryMaps> RegistryData;
5767330f729Sjoerg
nodeMatcherType(MatcherCtor Ctor)577*e038c9c4Sjoerg ASTNodeKind Registry::nodeMatcherType(MatcherCtor Ctor) {
578*e038c9c4Sjoerg return Ctor->nodeMatcherType();
579*e038c9c4Sjoerg }
580*e038c9c4Sjoerg
MatcherDescriptorPtr(MatcherDescriptor * Ptr)581*e038c9c4Sjoerg internal::MatcherDescriptorPtr::MatcherDescriptorPtr(MatcherDescriptor *Ptr)
582*e038c9c4Sjoerg : Ptr(Ptr) {}
583*e038c9c4Sjoerg
~MatcherDescriptorPtr()584*e038c9c4Sjoerg internal::MatcherDescriptorPtr::~MatcherDescriptorPtr() { delete Ptr; }
585*e038c9c4Sjoerg
isBuilderMatcher(MatcherCtor Ctor)586*e038c9c4Sjoerg bool Registry::isBuilderMatcher(MatcherCtor Ctor) {
587*e038c9c4Sjoerg return Ctor->isBuilderMatcher();
588*e038c9c4Sjoerg }
589*e038c9c4Sjoerg
590*e038c9c4Sjoerg internal::MatcherDescriptorPtr
buildMatcherCtor(MatcherCtor Ctor,SourceRange NameRange,ArrayRef<ParserValue> Args,Diagnostics * Error)591*e038c9c4Sjoerg Registry::buildMatcherCtor(MatcherCtor Ctor, SourceRange NameRange,
592*e038c9c4Sjoerg ArrayRef<ParserValue> Args, Diagnostics *Error) {
593*e038c9c4Sjoerg return internal::MatcherDescriptorPtr(
594*e038c9c4Sjoerg Ctor->buildMatcherCtor(NameRange, Args, Error).release());
595*e038c9c4Sjoerg }
596*e038c9c4Sjoerg
5977330f729Sjoerg // static
lookupMatcherCtor(StringRef MatcherName)5987330f729Sjoerg llvm::Optional<MatcherCtor> Registry::lookupMatcherCtor(StringRef MatcherName) {
5997330f729Sjoerg auto it = RegistryData->constructors().find(MatcherName);
6007330f729Sjoerg return it == RegistryData->constructors().end()
6017330f729Sjoerg ? llvm::Optional<MatcherCtor>()
6027330f729Sjoerg : it->second.get();
6037330f729Sjoerg }
6047330f729Sjoerg
operator <<(llvm::raw_ostream & OS,const std::set<ASTNodeKind> & KS)6057330f729Sjoerg static llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
6067330f729Sjoerg const std::set<ASTNodeKind> &KS) {
6077330f729Sjoerg unsigned Count = 0;
6087330f729Sjoerg for (std::set<ASTNodeKind>::const_iterator I = KS.begin(), E = KS.end();
6097330f729Sjoerg I != E; ++I) {
6107330f729Sjoerg if (I != KS.begin())
6117330f729Sjoerg OS << "|";
6127330f729Sjoerg if (Count++ == 3) {
6137330f729Sjoerg OS << "...";
6147330f729Sjoerg break;
6157330f729Sjoerg }
6167330f729Sjoerg OS << *I;
6177330f729Sjoerg }
6187330f729Sjoerg return OS;
6197330f729Sjoerg }
6207330f729Sjoerg
getAcceptedCompletionTypes(ArrayRef<std::pair<MatcherCtor,unsigned>> Context)6217330f729Sjoerg std::vector<ArgKind> Registry::getAcceptedCompletionTypes(
6227330f729Sjoerg ArrayRef<std::pair<MatcherCtor, unsigned>> Context) {
6237330f729Sjoerg ASTNodeKind InitialTypes[] = {
6247330f729Sjoerg ASTNodeKind::getFromNodeKind<Decl>(),
6257330f729Sjoerg ASTNodeKind::getFromNodeKind<QualType>(),
6267330f729Sjoerg ASTNodeKind::getFromNodeKind<Type>(),
6277330f729Sjoerg ASTNodeKind::getFromNodeKind<Stmt>(),
6287330f729Sjoerg ASTNodeKind::getFromNodeKind<NestedNameSpecifier>(),
6297330f729Sjoerg ASTNodeKind::getFromNodeKind<NestedNameSpecifierLoc>(),
6307330f729Sjoerg ASTNodeKind::getFromNodeKind<TypeLoc>()};
6317330f729Sjoerg
6327330f729Sjoerg // Starting with the above seed of acceptable top-level matcher types, compute
6337330f729Sjoerg // the acceptable type set for the argument indicated by each context element.
634*e038c9c4Sjoerg std::set<ArgKind> TypeSet;
635*e038c9c4Sjoerg for (auto IT : InitialTypes) {
636*e038c9c4Sjoerg TypeSet.insert(ArgKind::MakeMatcherArg(IT));
637*e038c9c4Sjoerg }
6387330f729Sjoerg for (const auto &CtxEntry : Context) {
6397330f729Sjoerg MatcherCtor Ctor = CtxEntry.first;
6407330f729Sjoerg unsigned ArgNumber = CtxEntry.second;
6417330f729Sjoerg std::vector<ArgKind> NextTypeSet;
6427330f729Sjoerg for (const ArgKind &Kind : TypeSet) {
6437330f729Sjoerg if (Kind.getArgKind() == Kind.AK_Matcher &&
6447330f729Sjoerg Ctor->isConvertibleTo(Kind.getMatcherKind()) &&
6457330f729Sjoerg (Ctor->isVariadic() || ArgNumber < Ctor->getNumArgs()))
6467330f729Sjoerg Ctor->getArgKinds(Kind.getMatcherKind(), ArgNumber, NextTypeSet);
6477330f729Sjoerg }
6487330f729Sjoerg TypeSet.clear();
6497330f729Sjoerg TypeSet.insert(NextTypeSet.begin(), NextTypeSet.end());
6507330f729Sjoerg }
6517330f729Sjoerg return std::vector<ArgKind>(TypeSet.begin(), TypeSet.end());
6527330f729Sjoerg }
6537330f729Sjoerg
6547330f729Sjoerg std::vector<MatcherCompletion>
getMatcherCompletions(ArrayRef<ArgKind> AcceptedTypes)6557330f729Sjoerg Registry::getMatcherCompletions(ArrayRef<ArgKind> AcceptedTypes) {
6567330f729Sjoerg std::vector<MatcherCompletion> Completions;
6577330f729Sjoerg
6587330f729Sjoerg // Search the registry for acceptable matchers.
6597330f729Sjoerg for (const auto &M : RegistryData->constructors()) {
6607330f729Sjoerg const MatcherDescriptor& Matcher = *M.getValue();
6617330f729Sjoerg StringRef Name = M.getKey();
6627330f729Sjoerg
6637330f729Sjoerg std::set<ASTNodeKind> RetKinds;
6647330f729Sjoerg unsigned NumArgs = Matcher.isVariadic() ? 1 : Matcher.getNumArgs();
6657330f729Sjoerg bool IsPolymorphic = Matcher.isPolymorphic();
6667330f729Sjoerg std::vector<std::vector<ArgKind>> ArgsKinds(NumArgs);
6677330f729Sjoerg unsigned MaxSpecificity = 0;
668*e038c9c4Sjoerg bool NodeArgs = false;
6697330f729Sjoerg for (const ArgKind& Kind : AcceptedTypes) {
670*e038c9c4Sjoerg if (Kind.getArgKind() != Kind.AK_Matcher &&
671*e038c9c4Sjoerg Kind.getArgKind() != Kind.AK_Node) {
6727330f729Sjoerg continue;
673*e038c9c4Sjoerg }
674*e038c9c4Sjoerg
675*e038c9c4Sjoerg if (Kind.getArgKind() == Kind.AK_Node) {
676*e038c9c4Sjoerg NodeArgs = true;
677*e038c9c4Sjoerg unsigned Specificity;
678*e038c9c4Sjoerg ASTNodeKind LeastDerivedKind;
679*e038c9c4Sjoerg if (Matcher.isConvertibleTo(Kind.getNodeKind(), &Specificity,
680*e038c9c4Sjoerg &LeastDerivedKind)) {
681*e038c9c4Sjoerg if (MaxSpecificity < Specificity)
682*e038c9c4Sjoerg MaxSpecificity = Specificity;
683*e038c9c4Sjoerg RetKinds.insert(LeastDerivedKind);
684*e038c9c4Sjoerg for (unsigned Arg = 0; Arg != NumArgs; ++Arg)
685*e038c9c4Sjoerg Matcher.getArgKinds(Kind.getNodeKind(), Arg, ArgsKinds[Arg]);
686*e038c9c4Sjoerg if (IsPolymorphic)
687*e038c9c4Sjoerg break;
688*e038c9c4Sjoerg }
689*e038c9c4Sjoerg } else {
6907330f729Sjoerg unsigned Specificity;
6917330f729Sjoerg ASTNodeKind LeastDerivedKind;
6927330f729Sjoerg if (Matcher.isConvertibleTo(Kind.getMatcherKind(), &Specificity,
6937330f729Sjoerg &LeastDerivedKind)) {
6947330f729Sjoerg if (MaxSpecificity < Specificity)
6957330f729Sjoerg MaxSpecificity = Specificity;
6967330f729Sjoerg RetKinds.insert(LeastDerivedKind);
6977330f729Sjoerg for (unsigned Arg = 0; Arg != NumArgs; ++Arg)
6987330f729Sjoerg Matcher.getArgKinds(Kind.getMatcherKind(), Arg, ArgsKinds[Arg]);
6997330f729Sjoerg if (IsPolymorphic)
7007330f729Sjoerg break;
7017330f729Sjoerg }
7027330f729Sjoerg }
703*e038c9c4Sjoerg }
7047330f729Sjoerg
7057330f729Sjoerg if (!RetKinds.empty() && MaxSpecificity > 0) {
7067330f729Sjoerg std::string Decl;
7077330f729Sjoerg llvm::raw_string_ostream OS(Decl);
7087330f729Sjoerg
709*e038c9c4Sjoerg std::string TypedText = std::string(Name);
710*e038c9c4Sjoerg
711*e038c9c4Sjoerg if (NodeArgs) {
712*e038c9c4Sjoerg OS << Name;
713*e038c9c4Sjoerg } else {
714*e038c9c4Sjoerg
7157330f729Sjoerg if (IsPolymorphic) {
7167330f729Sjoerg OS << "Matcher<T> " << Name << "(Matcher<T>";
7177330f729Sjoerg } else {
7187330f729Sjoerg OS << "Matcher<" << RetKinds << "> " << Name << "(";
7197330f729Sjoerg for (const std::vector<ArgKind> &Arg : ArgsKinds) {
7207330f729Sjoerg if (&Arg != &ArgsKinds[0])
7217330f729Sjoerg OS << ", ";
7227330f729Sjoerg
7237330f729Sjoerg bool FirstArgKind = true;
7247330f729Sjoerg std::set<ASTNodeKind> MatcherKinds;
7257330f729Sjoerg // Two steps. First all non-matchers, then matchers only.
7267330f729Sjoerg for (const ArgKind &AK : Arg) {
7277330f729Sjoerg if (AK.getArgKind() == ArgKind::AK_Matcher) {
7287330f729Sjoerg MatcherKinds.insert(AK.getMatcherKind());
7297330f729Sjoerg } else {
730*e038c9c4Sjoerg if (!FirstArgKind)
731*e038c9c4Sjoerg OS << "|";
7327330f729Sjoerg FirstArgKind = false;
7337330f729Sjoerg OS << AK.asString();
7347330f729Sjoerg }
7357330f729Sjoerg }
7367330f729Sjoerg if (!MatcherKinds.empty()) {
7377330f729Sjoerg if (!FirstArgKind) OS << "|";
7387330f729Sjoerg OS << "Matcher<" << MatcherKinds << ">";
7397330f729Sjoerg }
7407330f729Sjoerg }
7417330f729Sjoerg }
7427330f729Sjoerg if (Matcher.isVariadic())
7437330f729Sjoerg OS << "...";
7447330f729Sjoerg OS << ")";
7457330f729Sjoerg
7467330f729Sjoerg TypedText += "(";
7477330f729Sjoerg if (ArgsKinds.empty())
7487330f729Sjoerg TypedText += ")";
7497330f729Sjoerg else if (ArgsKinds[0][0].getArgKind() == ArgKind::AK_String)
7507330f729Sjoerg TypedText += "\"";
751*e038c9c4Sjoerg }
7527330f729Sjoerg
7537330f729Sjoerg Completions.emplace_back(TypedText, OS.str(), MaxSpecificity);
7547330f729Sjoerg }
7557330f729Sjoerg }
7567330f729Sjoerg
7577330f729Sjoerg return Completions;
7587330f729Sjoerg }
7597330f729Sjoerg
constructMatcher(MatcherCtor Ctor,SourceRange NameRange,ArrayRef<ParserValue> Args,Diagnostics * Error)7607330f729Sjoerg VariantMatcher Registry::constructMatcher(MatcherCtor Ctor,
7617330f729Sjoerg SourceRange NameRange,
7627330f729Sjoerg ArrayRef<ParserValue> Args,
7637330f729Sjoerg Diagnostics *Error) {
7647330f729Sjoerg return Ctor->create(NameRange, Args, Error);
7657330f729Sjoerg }
7667330f729Sjoerg
constructBoundMatcher(MatcherCtor Ctor,SourceRange NameRange,StringRef BindID,ArrayRef<ParserValue> Args,Diagnostics * Error)7677330f729Sjoerg VariantMatcher Registry::constructBoundMatcher(MatcherCtor Ctor,
7687330f729Sjoerg SourceRange NameRange,
7697330f729Sjoerg StringRef BindID,
7707330f729Sjoerg ArrayRef<ParserValue> Args,
7717330f729Sjoerg Diagnostics *Error) {
7727330f729Sjoerg VariantMatcher Out = constructMatcher(Ctor, NameRange, Args, Error);
7737330f729Sjoerg if (Out.isNull()) return Out;
7747330f729Sjoerg
7757330f729Sjoerg llvm::Optional<DynTypedMatcher> Result = Out.getSingleMatcher();
7767330f729Sjoerg if (Result.hasValue()) {
7777330f729Sjoerg llvm::Optional<DynTypedMatcher> Bound = Result->tryBind(BindID);
7787330f729Sjoerg if (Bound.hasValue()) {
7797330f729Sjoerg return VariantMatcher::SingleMatcher(*Bound);
7807330f729Sjoerg }
7817330f729Sjoerg }
7827330f729Sjoerg Error->addError(NameRange, Error->ET_RegistryNotBindable);
7837330f729Sjoerg return VariantMatcher();
7847330f729Sjoerg }
7857330f729Sjoerg
7867330f729Sjoerg } // namespace dynamic
7877330f729Sjoerg } // namespace ast_matchers
7887330f729Sjoerg } // namespace clang
789