Path: blob/main/contrib/llvm-project/clang/lib/ASTMatchers/Dynamic/Registry.cpp
35292 views
//===- Registry.cpp - Matcher registry ------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8/// \file9/// Registry map populated at static initialization time.10//11//===----------------------------------------------------------------------===//1213#include "clang/ASTMatchers/Dynamic/Registry.h"14#include "Marshallers.h"15#include "clang/AST/ASTTypeTraits.h"16#include "clang/ASTMatchers/ASTMatchers.h"17#include "clang/ASTMatchers/Dynamic/Diagnostics.h"18#include "clang/ASTMatchers/Dynamic/VariantValue.h"19#include "llvm/ADT/STLExtras.h"20#include "llvm/ADT/StringMap.h"21#include "llvm/ADT/StringRef.h"22#include "llvm/Support/ManagedStatic.h"23#include "llvm/Support/raw_ostream.h"24#include <cassert>25#include <iterator>26#include <memory>27#include <optional>28#include <set>29#include <string>30#include <utility>31#include <vector>3233namespace clang {34namespace ast_matchers {35namespace dynamic {3637namespace {3839using internal::MatcherDescriptor;4041using ConstructorMap =42llvm::StringMap<std::unique_ptr<const MatcherDescriptor>>;4344class RegistryMaps {45public:46RegistryMaps();47~RegistryMaps();4849const ConstructorMap &constructors() const { return Constructors; }5051private:52void registerMatcher(StringRef MatcherName,53std::unique_ptr<MatcherDescriptor> Callback);5455ConstructorMap Constructors;56};5758} // namespace5960void RegistryMaps::registerMatcher(61StringRef MatcherName, std::unique_ptr<MatcherDescriptor> Callback) {62assert(!Constructors.contains(MatcherName));63Constructors[MatcherName] = std::move(Callback);64}6566#define REGISTER_MATCHER(name) \67registerMatcher(#name, internal::makeMatcherAutoMarshall( \68::clang::ast_matchers::name, #name));6970#define REGISTER_MATCHER_OVERLOAD(name) \71registerMatcher(#name, \72std::make_unique<internal::OverloadedMatcherDescriptor>(name##Callbacks))7374#define SPECIFIC_MATCHER_OVERLOAD(name, Id) \75static_cast<::clang::ast_matchers::name##_Type##Id>( \76::clang::ast_matchers::name)7778#define MATCHER_OVERLOAD_ENTRY(name, Id) \79internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, Id), \80#name)8182#define REGISTER_OVERLOADED_2(name) \83do { \84std::unique_ptr<MatcherDescriptor> name##Callbacks[] = { \85MATCHER_OVERLOAD_ENTRY(name, 0), \86MATCHER_OVERLOAD_ENTRY(name, 1)}; \87REGISTER_MATCHER_OVERLOAD(name); \88} while (false)8990#define REGISTER_REGEX_MATCHER(name) \91registerMatcher(#name, internal::makeMatcherRegexMarshall(name, name))9293/// Generate a registry map with all the known matchers.94/// Please keep sorted alphabetically!95RegistryMaps::RegistryMaps() {96// TODO: Here is the list of the missing matchers, grouped by reason.97//98// Polymorphic + argument overload:99// findAll100//101// Other:102// equalsNode103104registerMatcher("mapAnyOf",105std::make_unique<internal::MapAnyOfBuilderDescriptor>());106107REGISTER_OVERLOADED_2(callee);108REGISTER_OVERLOADED_2(hasPrefix);109REGISTER_OVERLOADED_2(hasType);110REGISTER_OVERLOADED_2(ignoringParens);111REGISTER_OVERLOADED_2(isDerivedFrom);112REGISTER_OVERLOADED_2(isDirectlyDerivedFrom);113REGISTER_OVERLOADED_2(isSameOrDerivedFrom);114REGISTER_OVERLOADED_2(loc);115REGISTER_OVERLOADED_2(pointsTo);116REGISTER_OVERLOADED_2(references);117REGISTER_OVERLOADED_2(thisPointerType);118119std::unique_ptr<MatcherDescriptor> equalsCallbacks[] = {120MATCHER_OVERLOAD_ENTRY(equals, 0),121MATCHER_OVERLOAD_ENTRY(equals, 1),122MATCHER_OVERLOAD_ENTRY(equals, 2),123};124REGISTER_MATCHER_OVERLOAD(equals);125126REGISTER_REGEX_MATCHER(isExpansionInFileMatching);127REGISTER_REGEX_MATCHER(matchesName);128REGISTER_REGEX_MATCHER(matchesSelector);129130REGISTER_MATCHER(accessSpecDecl);131REGISTER_MATCHER(addrLabelExpr);132REGISTER_MATCHER(alignOfExpr);133REGISTER_MATCHER(allOf);134REGISTER_MATCHER(anyOf);135REGISTER_MATCHER(anything);136REGISTER_MATCHER(arrayInitIndexExpr);137REGISTER_MATCHER(arrayInitLoopExpr);138REGISTER_MATCHER(argumentCountIs);139REGISTER_MATCHER(argumentCountAtLeast);140REGISTER_MATCHER(arraySubscriptExpr);141REGISTER_MATCHER(arrayType);142REGISTER_MATCHER(asString);143REGISTER_MATCHER(asmStmt);144REGISTER_MATCHER(atomicExpr);145REGISTER_MATCHER(atomicType);146REGISTER_MATCHER(attr);147REGISTER_MATCHER(autoType);148REGISTER_MATCHER(autoreleasePoolStmt)149REGISTER_MATCHER(binaryConditionalOperator);150REGISTER_MATCHER(binaryOperator);151REGISTER_MATCHER(binaryOperation);152REGISTER_MATCHER(bindingDecl);153REGISTER_MATCHER(blockDecl);154REGISTER_MATCHER(blockExpr);155REGISTER_MATCHER(blockPointerType);156REGISTER_MATCHER(booleanType);157REGISTER_MATCHER(breakStmt);158REGISTER_MATCHER(builtinType);159REGISTER_MATCHER(cStyleCastExpr);160REGISTER_MATCHER(callExpr);161REGISTER_MATCHER(capturesThis);162REGISTER_MATCHER(capturesVar);163REGISTER_MATCHER(caseStmt);164REGISTER_MATCHER(castExpr);165REGISTER_MATCHER(characterLiteral);166REGISTER_MATCHER(chooseExpr);167REGISTER_MATCHER(classTemplateDecl);168REGISTER_MATCHER(classTemplatePartialSpecializationDecl);169REGISTER_MATCHER(classTemplateSpecializationDecl);170REGISTER_MATCHER(complexType);171REGISTER_MATCHER(compoundLiteralExpr);172REGISTER_MATCHER(compoundStmt);173REGISTER_MATCHER(coawaitExpr);174REGISTER_MATCHER(conceptDecl);175REGISTER_MATCHER(conditionalOperator);176REGISTER_MATCHER(constantArrayType);177REGISTER_MATCHER(constantExpr);178REGISTER_MATCHER(containsDeclaration);179REGISTER_MATCHER(continueStmt);180REGISTER_MATCHER(convertVectorExpr);181REGISTER_MATCHER(coreturnStmt);182REGISTER_MATCHER(coroutineBodyStmt);183REGISTER_MATCHER(coyieldExpr);184REGISTER_MATCHER(cudaKernelCallExpr);185REGISTER_MATCHER(cxxBaseSpecifier);186REGISTER_MATCHER(cxxBindTemporaryExpr);187REGISTER_MATCHER(cxxBoolLiteral);188REGISTER_MATCHER(cxxCatchStmt);189REGISTER_MATCHER(cxxConstCastExpr);190REGISTER_MATCHER(cxxConstructExpr);191REGISTER_MATCHER(cxxConstructorDecl);192REGISTER_MATCHER(cxxConversionDecl);193REGISTER_MATCHER(cxxCtorInitializer);194REGISTER_MATCHER(cxxDeductionGuideDecl);195REGISTER_MATCHER(cxxDefaultArgExpr);196REGISTER_MATCHER(cxxDeleteExpr);197REGISTER_MATCHER(cxxDependentScopeMemberExpr);198REGISTER_MATCHER(cxxDestructorDecl);199REGISTER_MATCHER(cxxDynamicCastExpr);200REGISTER_MATCHER(cxxFoldExpr);201REGISTER_MATCHER(cxxForRangeStmt);202REGISTER_MATCHER(cxxFunctionalCastExpr);203REGISTER_MATCHER(cxxMemberCallExpr);204REGISTER_MATCHER(cxxMethodDecl);205REGISTER_MATCHER(cxxNewExpr);206REGISTER_MATCHER(cxxNoexceptExpr);207REGISTER_MATCHER(cxxNullPtrLiteralExpr);208REGISTER_MATCHER(cxxOperatorCallExpr);209REGISTER_MATCHER(cxxRecordDecl);210REGISTER_MATCHER(cxxReinterpretCastExpr);211REGISTER_MATCHER(cxxRewrittenBinaryOperator);212REGISTER_MATCHER(cxxStaticCastExpr);213REGISTER_MATCHER(cxxStdInitializerListExpr);214REGISTER_MATCHER(cxxTemporaryObjectExpr);215REGISTER_MATCHER(cxxThisExpr);216REGISTER_MATCHER(cxxThrowExpr);217REGISTER_MATCHER(cxxTryStmt);218REGISTER_MATCHER(cxxUnresolvedConstructExpr);219REGISTER_MATCHER(decayedType);220REGISTER_MATCHER(decl);221REGISTER_MATCHER(decompositionDecl);222REGISTER_MATCHER(declCountIs);223REGISTER_MATCHER(declRefExpr);224REGISTER_MATCHER(declStmt);225REGISTER_MATCHER(declaratorDecl);226REGISTER_MATCHER(decltypeType);227REGISTER_MATCHER(deducedTemplateSpecializationType);228REGISTER_MATCHER(defaultStmt);229REGISTER_MATCHER(dependentCoawaitExpr);230REGISTER_MATCHER(dependentSizedArrayType);231REGISTER_MATCHER(dependentSizedExtVectorType);232REGISTER_MATCHER(designatedInitExpr);233REGISTER_MATCHER(designatorCountIs);234REGISTER_MATCHER(doStmt);235REGISTER_MATCHER(eachOf);236REGISTER_MATCHER(elaboratedType);237REGISTER_MATCHER(elaboratedTypeLoc);238REGISTER_MATCHER(usingType);239REGISTER_MATCHER(enumConstantDecl);240REGISTER_MATCHER(enumDecl);241REGISTER_MATCHER(enumType);242REGISTER_MATCHER(equalsBoundNode);243REGISTER_MATCHER(equalsIntegralValue);244REGISTER_MATCHER(explicitCastExpr);245REGISTER_MATCHER(expr);246REGISTER_MATCHER(exprWithCleanups);247REGISTER_MATCHER(fieldDecl);248REGISTER_MATCHER(fixedPointLiteral);249REGISTER_MATCHER(floatLiteral);250REGISTER_MATCHER(forCallable);251REGISTER_MATCHER(forDecomposition);252REGISTER_MATCHER(forEach);253REGISTER_MATCHER(forEachArgumentWithParam);254REGISTER_MATCHER(forEachArgumentWithParamType);255REGISTER_MATCHER(forEachConstructorInitializer);256REGISTER_MATCHER(forEachDescendant);257REGISTER_MATCHER(forEachLambdaCapture);258REGISTER_MATCHER(forEachOverridden);259REGISTER_MATCHER(forEachSwitchCase);260REGISTER_MATCHER(forEachTemplateArgument);261REGISTER_MATCHER(forField);262REGISTER_MATCHER(forFunction);263REGISTER_MATCHER(forStmt);264REGISTER_MATCHER(friendDecl);265REGISTER_MATCHER(functionDecl);266REGISTER_MATCHER(functionProtoType);267REGISTER_MATCHER(functionTemplateDecl);268REGISTER_MATCHER(functionType);269REGISTER_MATCHER(genericSelectionExpr);270REGISTER_MATCHER(gnuNullExpr);271REGISTER_MATCHER(gotoStmt);272REGISTER_MATCHER(has);273REGISTER_MATCHER(hasAncestor);274REGISTER_MATCHER(hasAnyArgument);275REGISTER_MATCHER(hasAnyBase);276REGISTER_MATCHER(hasAnyBinding);277REGISTER_MATCHER(hasAnyBody);278REGISTER_MATCHER(hasAnyCapture);279REGISTER_MATCHER(hasAnyClause);280REGISTER_MATCHER(hasAnyConstructorInitializer);281REGISTER_MATCHER(hasAnyDeclaration);282REGISTER_MATCHER(hasAnyName);283REGISTER_MATCHER(hasAnyOperatorName);284REGISTER_MATCHER(hasAnyOverloadedOperatorName);285REGISTER_MATCHER(hasAnyParameter);286REGISTER_MATCHER(hasAnyPlacementArg);287REGISTER_MATCHER(hasAnySelector);288REGISTER_MATCHER(hasAnySubstatement);289REGISTER_MATCHER(hasAnyTemplateArgument);290REGISTER_MATCHER(hasAnyTemplateArgumentLoc);291REGISTER_MATCHER(hasAnyUsingShadowDecl);292REGISTER_MATCHER(hasArgument);293REGISTER_MATCHER(hasArgumentOfType);294REGISTER_MATCHER(hasArraySize);295REGISTER_MATCHER(hasAttr);296REGISTER_MATCHER(hasAutomaticStorageDuration);297REGISTER_MATCHER(hasBase);298REGISTER_MATCHER(hasBinding);299REGISTER_MATCHER(hasBitWidth);300REGISTER_MATCHER(hasBody);301REGISTER_MATCHER(hasCanonicalType);302REGISTER_MATCHER(hasCaseConstant);303REGISTER_MATCHER(hasCastKind);304REGISTER_MATCHER(hasCondition);305REGISTER_MATCHER(hasConditionVariableStatement);306REGISTER_MATCHER(hasDecayedType);307REGISTER_MATCHER(hasDeclContext);308REGISTER_MATCHER(hasDeclaration);309REGISTER_MATCHER(hasDeducedType);310REGISTER_MATCHER(hasDefaultArgument);311REGISTER_MATCHER(hasDefinition);312REGISTER_MATCHER(hasDescendant);313REGISTER_MATCHER(hasDestinationType);314REGISTER_MATCHER(hasDirectBase);315REGISTER_MATCHER(hasDynamicExceptionSpec);316REGISTER_MATCHER(hasEitherOperand);317REGISTER_MATCHER(hasElementType);318REGISTER_MATCHER(hasElse);319REGISTER_MATCHER(hasExplicitSpecifier);320REGISTER_MATCHER(hasExternalFormalLinkage);321REGISTER_MATCHER(hasFalseExpression);322REGISTER_MATCHER(hasFoldInit);323REGISTER_MATCHER(hasGlobalStorage);324REGISTER_MATCHER(hasImplicitDestinationType);325REGISTER_MATCHER(hasInClassInitializer);326REGISTER_MATCHER(hasIncrement);327REGISTER_MATCHER(hasIndex);328REGISTER_MATCHER(hasInit);329REGISTER_MATCHER(hasInitializer);330REGISTER_MATCHER(hasInitStatement);331REGISTER_MATCHER(hasKeywordSelector);332REGISTER_MATCHER(hasLHS);333REGISTER_MATCHER(hasLocalQualifiers);334REGISTER_MATCHER(hasLocalStorage);335REGISTER_MATCHER(hasLoopInit);336REGISTER_MATCHER(hasLoopVariable);337REGISTER_MATCHER(hasMemberName);338REGISTER_MATCHER(hasMethod);339REGISTER_MATCHER(hasName);340REGISTER_MATCHER(hasNamedTypeLoc);341REGISTER_MATCHER(hasNullSelector);342REGISTER_MATCHER(hasObjectExpression);343REGISTER_MATCHER(hasOperands);344REGISTER_MATCHER(hasOperatorName);345REGISTER_MATCHER(hasOverloadedOperatorName);346REGISTER_MATCHER(hasParameter);347REGISTER_MATCHER(hasParent);348REGISTER_MATCHER(hasPattern);349REGISTER_MATCHER(hasPointeeLoc);350REGISTER_MATCHER(hasQualifier);351REGISTER_MATCHER(hasRHS);352REGISTER_MATCHER(hasRangeInit);353REGISTER_MATCHER(hasReceiver);354REGISTER_MATCHER(hasReceiverType);355REGISTER_MATCHER(hasReferentLoc);356REGISTER_MATCHER(hasReplacementType);357REGISTER_MATCHER(hasReturnTypeLoc);358REGISTER_MATCHER(hasReturnValue);359REGISTER_MATCHER(hasPlacementArg);360REGISTER_MATCHER(hasSelector);361REGISTER_MATCHER(hasSingleDecl);362REGISTER_MATCHER(hasSize);363REGISTER_MATCHER(hasSizeExpr);364REGISTER_MATCHER(hasSourceExpression);365REGISTER_MATCHER(hasSpecializedTemplate);366REGISTER_MATCHER(hasStaticStorageDuration);367REGISTER_MATCHER(hasStructuredBlock);368REGISTER_MATCHER(hasSyntacticForm);369REGISTER_MATCHER(hasTargetDecl);370REGISTER_MATCHER(hasTemplateArgument);371REGISTER_MATCHER(hasTemplateArgumentLoc);372REGISTER_MATCHER(hasThen);373REGISTER_MATCHER(hasThreadStorageDuration);374REGISTER_MATCHER(hasTrailingReturn);375REGISTER_MATCHER(hasTrueExpression);376REGISTER_MATCHER(hasTypeLoc);377REGISTER_MATCHER(hasUnaryOperand);378REGISTER_MATCHER(hasUnarySelector);379REGISTER_MATCHER(hasUnderlyingDecl);380REGISTER_MATCHER(hasUnderlyingType);381REGISTER_MATCHER(hasUnqualifiedDesugaredType);382REGISTER_MATCHER(hasUnqualifiedLoc);383REGISTER_MATCHER(hasValueType);384REGISTER_MATCHER(ifStmt);385REGISTER_MATCHER(ignoringElidableConstructorCall);386REGISTER_MATCHER(ignoringImpCasts);387REGISTER_MATCHER(ignoringImplicit);388REGISTER_MATCHER(ignoringParenCasts);389REGISTER_MATCHER(ignoringParenImpCasts);390REGISTER_MATCHER(imaginaryLiteral);391REGISTER_MATCHER(implicitCastExpr);392REGISTER_MATCHER(implicitValueInitExpr);393REGISTER_MATCHER(incompleteArrayType);394REGISTER_MATCHER(indirectFieldDecl);395REGISTER_MATCHER(initListExpr);396REGISTER_MATCHER(injectedClassNameType);397REGISTER_MATCHER(innerType);398REGISTER_MATCHER(integerLiteral);399REGISTER_MATCHER(invocation);400REGISTER_MATCHER(isAllowedToContainClauseKind);401REGISTER_MATCHER(isAnonymous);402REGISTER_MATCHER(isAnyCharacter);403REGISTER_MATCHER(isAnyPointer);404REGISTER_MATCHER(isArray);405REGISTER_MATCHER(isArrow);406REGISTER_MATCHER(isAssignmentOperator);407REGISTER_MATCHER(isAtPosition);408REGISTER_MATCHER(isBaseInitializer);409REGISTER_MATCHER(isBinaryFold);410REGISTER_MATCHER(isBitField);411REGISTER_MATCHER(isCatchAll);412REGISTER_MATCHER(isClass);413REGISTER_MATCHER(isClassMessage);414REGISTER_MATCHER(isClassMethod);415REGISTER_MATCHER(isComparisonOperator);416REGISTER_MATCHER(isConst);417REGISTER_MATCHER(isConstQualified);418REGISTER_MATCHER(isConsteval);419REGISTER_MATCHER(isConstexpr);420REGISTER_MATCHER(isConstinit);421REGISTER_MATCHER(isCopyAssignmentOperator);422REGISTER_MATCHER(isCopyConstructor);423REGISTER_MATCHER(isDefaultConstructor);424REGISTER_MATCHER(isDefaulted);425REGISTER_MATCHER(isDefinition);426REGISTER_MATCHER(isDelegatingConstructor);427REGISTER_MATCHER(isDeleted);428REGISTER_MATCHER(isEnum);429REGISTER_MATCHER(isExceptionVariable);430REGISTER_MATCHER(isExpandedFromMacro);431REGISTER_MATCHER(isExpansionInMainFile);432REGISTER_MATCHER(isExpansionInSystemHeader);433REGISTER_MATCHER(isExplicit);434REGISTER_MATCHER(isExplicitObjectMemberFunction);435REGISTER_MATCHER(isExplicitTemplateSpecialization);436REGISTER_MATCHER(isExpr);437REGISTER_MATCHER(isExternC);438REGISTER_MATCHER(isFinal);439REGISTER_MATCHER(isPrivateKind);440REGISTER_MATCHER(isFirstPrivateKind);441REGISTER_MATCHER(isImplicit);442REGISTER_MATCHER(isInAnonymousNamespace);443REGISTER_MATCHER(isInStdNamespace);444REGISTER_MATCHER(isInTemplateInstantiation);445REGISTER_MATCHER(isInitCapture);446REGISTER_MATCHER(isInline);447REGISTER_MATCHER(isInstanceMessage);448REGISTER_MATCHER(isInstanceMethod);449REGISTER_MATCHER(isInstantiated);450REGISTER_MATCHER(isInstantiationDependent);451REGISTER_MATCHER(isInteger);452REGISTER_MATCHER(isIntegral);453REGISTER_MATCHER(isLambda);454REGISTER_MATCHER(isLeftFold);455REGISTER_MATCHER(isListInitialization);456REGISTER_MATCHER(isMain);457REGISTER_MATCHER(isMemberInitializer);458REGISTER_MATCHER(isMoveAssignmentOperator);459REGISTER_MATCHER(isMoveConstructor);460REGISTER_MATCHER(isNoReturn);461REGISTER_MATCHER(isNoThrow);462REGISTER_MATCHER(isNoneKind);463REGISTER_MATCHER(isOverride);464REGISTER_MATCHER(isPrivate);465REGISTER_MATCHER(isProtected);466REGISTER_MATCHER(isPublic);467REGISTER_MATCHER(isPure);468REGISTER_MATCHER(isRightFold);469REGISTER_MATCHER(isScoped);470REGISTER_MATCHER(isSharedKind);471REGISTER_MATCHER(isSignedInteger);472REGISTER_MATCHER(isStandaloneDirective);473REGISTER_MATCHER(isStaticLocal);474REGISTER_MATCHER(isStaticStorageClass);475REGISTER_MATCHER(isStruct);476REGISTER_MATCHER(isTemplateInstantiation);477REGISTER_MATCHER(isTypeDependent);478REGISTER_MATCHER(isUnaryFold);479REGISTER_MATCHER(isUnion);480REGISTER_MATCHER(isUnsignedInteger);481REGISTER_MATCHER(isUserProvided);482REGISTER_MATCHER(isValueDependent);483REGISTER_MATCHER(isVariadic);484REGISTER_MATCHER(isVirtual);485REGISTER_MATCHER(isVirtualAsWritten);486REGISTER_MATCHER(isVolatileQualified);487REGISTER_MATCHER(isWeak);488REGISTER_MATCHER(isWritten);489REGISTER_MATCHER(lValueReferenceType);490REGISTER_MATCHER(labelDecl);491REGISTER_MATCHER(labelStmt);492REGISTER_MATCHER(lambdaCapture);493REGISTER_MATCHER(lambdaExpr);494REGISTER_MATCHER(linkageSpecDecl);495REGISTER_MATCHER(macroQualifiedType);496REGISTER_MATCHER(materializeTemporaryExpr);497REGISTER_MATCHER(member);498REGISTER_MATCHER(memberExpr);499REGISTER_MATCHER(memberHasSameNameAsBoundNode);500REGISTER_MATCHER(memberPointerType);501REGISTER_MATCHER(namedDecl);502REGISTER_MATCHER(namesType);503REGISTER_MATCHER(namespaceAliasDecl);504REGISTER_MATCHER(namespaceDecl);505REGISTER_MATCHER(nestedNameSpecifier);506REGISTER_MATCHER(nestedNameSpecifierLoc);507REGISTER_MATCHER(nonTypeTemplateParmDecl);508REGISTER_MATCHER(nullPointerConstant);509REGISTER_MATCHER(nullStmt);510REGISTER_MATCHER(numSelectorArgs);511REGISTER_MATCHER(objcCatchStmt);512REGISTER_MATCHER(objcCategoryDecl);513REGISTER_MATCHER(objcCategoryImplDecl);514REGISTER_MATCHER(objcFinallyStmt);515REGISTER_MATCHER(objcImplementationDecl);516REGISTER_MATCHER(objcInterfaceDecl);517REGISTER_MATCHER(objcIvarDecl);518REGISTER_MATCHER(objcIvarRefExpr);519REGISTER_MATCHER(objcMessageExpr);520REGISTER_MATCHER(objcMethodDecl);521REGISTER_MATCHER(objcObjectPointerType);522REGISTER_MATCHER(objcPropertyDecl);523REGISTER_MATCHER(objcProtocolDecl);524REGISTER_MATCHER(objcStringLiteral);525REGISTER_MATCHER(objcThrowStmt);526REGISTER_MATCHER(objcTryStmt);527REGISTER_MATCHER(ofClass);528REGISTER_MATCHER(ofKind);529REGISTER_MATCHER(ompDefaultClause);530REGISTER_MATCHER(ompExecutableDirective);531REGISTER_MATCHER(on);532REGISTER_MATCHER(onImplicitObjectArgument);533REGISTER_MATCHER(opaqueValueExpr);534REGISTER_MATCHER(optionally);535REGISTER_MATCHER(parameterCountIs);536REGISTER_MATCHER(parenExpr);537REGISTER_MATCHER(parenListExpr);538REGISTER_MATCHER(parenType);539REGISTER_MATCHER(parmVarDecl);540REGISTER_MATCHER(pointee);541REGISTER_MATCHER(pointerType);542REGISTER_MATCHER(pointerTypeLoc);543REGISTER_MATCHER(predefinedExpr);544REGISTER_MATCHER(qualType);545REGISTER_MATCHER(qualifiedTypeLoc);546REGISTER_MATCHER(rValueReferenceType);547REGISTER_MATCHER(realFloatingPointType);548REGISTER_MATCHER(recordDecl);549REGISTER_MATCHER(recordType);550REGISTER_MATCHER(referenceType);551REGISTER_MATCHER(referenceTypeLoc);552REGISTER_MATCHER(refersToDeclaration);553REGISTER_MATCHER(refersToIntegralType);554REGISTER_MATCHER(refersToTemplate);555REGISTER_MATCHER(refersToType);556REGISTER_MATCHER(requiresZeroInitialization);557REGISTER_MATCHER(returnStmt);558REGISTER_MATCHER(returns);559REGISTER_MATCHER(sizeOfExpr);560REGISTER_MATCHER(specifiesNamespace);561REGISTER_MATCHER(specifiesType);562REGISTER_MATCHER(specifiesTypeLoc);563REGISTER_MATCHER(statementCountIs);564REGISTER_MATCHER(staticAssertDecl);565REGISTER_MATCHER(stmt);566REGISTER_MATCHER(stmtExpr);567REGISTER_MATCHER(stringLiteral);568REGISTER_MATCHER(substNonTypeTemplateParmExpr);569REGISTER_MATCHER(substTemplateTypeParmType);570REGISTER_MATCHER(switchCase);571REGISTER_MATCHER(switchStmt);572REGISTER_MATCHER(tagDecl);573REGISTER_MATCHER(tagType);574REGISTER_MATCHER(templateArgument);575REGISTER_MATCHER(templateArgumentCountIs);576REGISTER_MATCHER(templateArgumentLoc);577REGISTER_MATCHER(templateName);578REGISTER_MATCHER(templateSpecializationType);579REGISTER_MATCHER(templateSpecializationTypeLoc);580REGISTER_MATCHER(templateTemplateParmDecl);581REGISTER_MATCHER(templateTypeParmDecl);582REGISTER_MATCHER(templateTypeParmType);583REGISTER_MATCHER(throughUsingDecl);584REGISTER_MATCHER(to);585REGISTER_MATCHER(translationUnitDecl);586REGISTER_MATCHER(type);587REGISTER_MATCHER(typeAliasDecl);588REGISTER_MATCHER(typeAliasTemplateDecl);589REGISTER_MATCHER(typeLoc);590REGISTER_MATCHER(typedefDecl);591REGISTER_MATCHER(typedefNameDecl);592REGISTER_MATCHER(typedefType);593REGISTER_MATCHER(unaryExprOrTypeTraitExpr);594REGISTER_MATCHER(unaryOperator);595REGISTER_MATCHER(unaryTransformType);596REGISTER_MATCHER(unless);597REGISTER_MATCHER(unresolvedLookupExpr);598REGISTER_MATCHER(unresolvedMemberExpr);599REGISTER_MATCHER(unresolvedUsingTypenameDecl);600REGISTER_MATCHER(unresolvedUsingValueDecl);601REGISTER_MATCHER(userDefinedLiteral);602REGISTER_MATCHER(usesADL);603REGISTER_MATCHER(usingDecl);604REGISTER_MATCHER(usingEnumDecl);605REGISTER_MATCHER(usingDirectiveDecl);606REGISTER_MATCHER(valueDecl);607REGISTER_MATCHER(varDecl);608REGISTER_MATCHER(variableArrayType);609REGISTER_MATCHER(voidType);610REGISTER_MATCHER(whileStmt);611REGISTER_MATCHER(withInitializer);612}613614RegistryMaps::~RegistryMaps() = default;615616static llvm::ManagedStatic<RegistryMaps> RegistryData;617618ASTNodeKind Registry::nodeMatcherType(MatcherCtor Ctor) {619return Ctor->nodeMatcherType();620}621622internal::MatcherDescriptorPtr::MatcherDescriptorPtr(MatcherDescriptor *Ptr)623: Ptr(Ptr) {}624625internal::MatcherDescriptorPtr::~MatcherDescriptorPtr() { delete Ptr; }626627bool Registry::isBuilderMatcher(MatcherCtor Ctor) {628return Ctor->isBuilderMatcher();629}630631internal::MatcherDescriptorPtr632Registry::buildMatcherCtor(MatcherCtor Ctor, SourceRange NameRange,633ArrayRef<ParserValue> Args, Diagnostics *Error) {634return internal::MatcherDescriptorPtr(635Ctor->buildMatcherCtor(NameRange, Args, Error).release());636}637638// static639std::optional<MatcherCtor> Registry::lookupMatcherCtor(StringRef MatcherName) {640auto it = RegistryData->constructors().find(MatcherName);641return it == RegistryData->constructors().end() ? std::optional<MatcherCtor>()642: it->second.get();643}644645static llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,646const std::set<ASTNodeKind> &KS) {647unsigned Count = 0;648for (std::set<ASTNodeKind>::const_iterator I = KS.begin(), E = KS.end();649I != E; ++I) {650if (I != KS.begin())651OS << "|";652if (Count++ == 3) {653OS << "...";654break;655}656OS << *I;657}658return OS;659}660661std::vector<ArgKind> Registry::getAcceptedCompletionTypes(662ArrayRef<std::pair<MatcherCtor, unsigned>> Context) {663ASTNodeKind InitialTypes[] = {664ASTNodeKind::getFromNodeKind<Decl>(),665ASTNodeKind::getFromNodeKind<QualType>(),666ASTNodeKind::getFromNodeKind<Type>(),667ASTNodeKind::getFromNodeKind<Stmt>(),668ASTNodeKind::getFromNodeKind<NestedNameSpecifier>(),669ASTNodeKind::getFromNodeKind<NestedNameSpecifierLoc>(),670ASTNodeKind::getFromNodeKind<TypeLoc>()};671672// Starting with the above seed of acceptable top-level matcher types, compute673// the acceptable type set for the argument indicated by each context element.674std::set<ArgKind> TypeSet;675for (auto IT : InitialTypes) {676TypeSet.insert(ArgKind::MakeMatcherArg(IT));677}678for (const auto &CtxEntry : Context) {679MatcherCtor Ctor = CtxEntry.first;680unsigned ArgNumber = CtxEntry.second;681std::vector<ArgKind> NextTypeSet;682for (const ArgKind &Kind : TypeSet) {683if (Kind.getArgKind() == Kind.AK_Matcher &&684Ctor->isConvertibleTo(Kind.getMatcherKind()) &&685(Ctor->isVariadic() || ArgNumber < Ctor->getNumArgs()))686Ctor->getArgKinds(Kind.getMatcherKind(), ArgNumber, NextTypeSet);687}688TypeSet.clear();689TypeSet.insert(NextTypeSet.begin(), NextTypeSet.end());690}691return std::vector<ArgKind>(TypeSet.begin(), TypeSet.end());692}693694std::vector<MatcherCompletion>695Registry::getMatcherCompletions(ArrayRef<ArgKind> AcceptedTypes) {696std::vector<MatcherCompletion> Completions;697698// Search the registry for acceptable matchers.699for (const auto &M : RegistryData->constructors()) {700const MatcherDescriptor& Matcher = *M.getValue();701StringRef Name = M.getKey();702703std::set<ASTNodeKind> RetKinds;704unsigned NumArgs = Matcher.isVariadic() ? 1 : Matcher.getNumArgs();705bool IsPolymorphic = Matcher.isPolymorphic();706std::vector<std::vector<ArgKind>> ArgsKinds(NumArgs);707unsigned MaxSpecificity = 0;708bool NodeArgs = false;709for (const ArgKind& Kind : AcceptedTypes) {710if (Kind.getArgKind() != Kind.AK_Matcher &&711Kind.getArgKind() != Kind.AK_Node) {712continue;713}714715if (Kind.getArgKind() == Kind.AK_Node) {716NodeArgs = true;717unsigned Specificity;718ASTNodeKind LeastDerivedKind;719if (Matcher.isConvertibleTo(Kind.getNodeKind(), &Specificity,720&LeastDerivedKind)) {721if (MaxSpecificity < Specificity)722MaxSpecificity = Specificity;723RetKinds.insert(LeastDerivedKind);724for (unsigned Arg = 0; Arg != NumArgs; ++Arg)725Matcher.getArgKinds(Kind.getNodeKind(), Arg, ArgsKinds[Arg]);726if (IsPolymorphic)727break;728}729} else {730unsigned Specificity;731ASTNodeKind LeastDerivedKind;732if (Matcher.isConvertibleTo(Kind.getMatcherKind(), &Specificity,733&LeastDerivedKind)) {734if (MaxSpecificity < Specificity)735MaxSpecificity = Specificity;736RetKinds.insert(LeastDerivedKind);737for (unsigned Arg = 0; Arg != NumArgs; ++Arg)738Matcher.getArgKinds(Kind.getMatcherKind(), Arg, ArgsKinds[Arg]);739if (IsPolymorphic)740break;741}742}743}744745if (!RetKinds.empty() && MaxSpecificity > 0) {746std::string Decl;747llvm::raw_string_ostream OS(Decl);748749std::string TypedText = std::string(Name);750751if (NodeArgs) {752OS << Name;753} else {754755if (IsPolymorphic) {756OS << "Matcher<T> " << Name << "(Matcher<T>";757} else {758OS << "Matcher<" << RetKinds << "> " << Name << "(";759for (const std::vector<ArgKind> &Arg : ArgsKinds) {760if (&Arg != &ArgsKinds[0])761OS << ", ";762763bool FirstArgKind = true;764std::set<ASTNodeKind> MatcherKinds;765// Two steps. First all non-matchers, then matchers only.766for (const ArgKind &AK : Arg) {767if (AK.getArgKind() == ArgKind::AK_Matcher) {768MatcherKinds.insert(AK.getMatcherKind());769} else {770if (!FirstArgKind)771OS << "|";772FirstArgKind = false;773OS << AK.asString();774}775}776if (!MatcherKinds.empty()) {777if (!FirstArgKind) OS << "|";778OS << "Matcher<" << MatcherKinds << ">";779}780}781}782if (Matcher.isVariadic())783OS << "...";784OS << ")";785786TypedText += "(";787if (ArgsKinds.empty())788TypedText += ")";789else if (ArgsKinds[0][0].getArgKind() == ArgKind::AK_String)790TypedText += "\"";791}792793Completions.emplace_back(TypedText, OS.str(), MaxSpecificity);794}795}796797return Completions;798}799800VariantMatcher Registry::constructMatcher(MatcherCtor Ctor,801SourceRange NameRange,802ArrayRef<ParserValue> Args,803Diagnostics *Error) {804return Ctor->create(NameRange, Args, Error);805}806807VariantMatcher Registry::constructBoundMatcher(MatcherCtor Ctor,808SourceRange NameRange,809StringRef BindID,810ArrayRef<ParserValue> Args,811Diagnostics *Error) {812VariantMatcher Out = constructMatcher(Ctor, NameRange, Args, Error);813if (Out.isNull()) return Out;814815std::optional<DynTypedMatcher> Result = Out.getSingleMatcher();816if (Result) {817std::optional<DynTypedMatcher> Bound = Result->tryBind(BindID);818if (Bound) {819return VariantMatcher::SingleMatcher(*Bound);820}821}822Error->addError(NameRange, Error->ET_RegistryNotBindable);823return VariantMatcher();824}825826} // namespace dynamic827} // namespace ast_matchers828} // namespace clang829830831