Registry.cpp revision 321369
1259701Sdim//===--- Registry.cpp - Matcher registry -------------------------===// 2259701Sdim// 3259701Sdim// The LLVM Compiler Infrastructure 4259701Sdim// 5259701Sdim// This file is distributed under the University of Illinois Open Source 6259701Sdim// License. See LICENSE.TXT for details. 7259701Sdim// 8259701Sdim//===------------------------------------------------------------===// 9259701Sdim/// 10259701Sdim/// \file 11259701Sdim/// \brief Registry map populated at static initialization time. 12259701Sdim/// 13259701Sdim//===------------------------------------------------------------===// 14259701Sdim 15259701Sdim#include "clang/ASTMatchers/Dynamic/Registry.h" 16259701Sdim#include "Marshallers.h" 17259701Sdim#include "clang/ASTMatchers/ASTMatchers.h" 18296417Sdim#include "llvm/ADT/STLExtras.h" 19259701Sdim#include "llvm/ADT/StringMap.h" 20259701Sdim#include "llvm/ADT/StringRef.h" 21259701Sdim#include "llvm/Support/ManagedStatic.h" 22276479Sdim#include <set> 23276479Sdim#include <utility> 24259701Sdim 25276479Sdimusing namespace clang::ast_type_traits; 26276479Sdim 27259701Sdimnamespace clang { 28259701Sdimnamespace ast_matchers { 29259701Sdimnamespace dynamic { 30259701Sdimnamespace { 31259701Sdim 32276479Sdimusing internal::MatcherDescriptor; 33259701Sdim 34314564Sdimtypedef llvm::StringMap<std::unique_ptr<const MatcherDescriptor>> ConstructorMap; 35259701Sdimclass RegistryMaps { 36259701Sdimpublic: 37259701Sdim RegistryMaps(); 38259701Sdim ~RegistryMaps(); 39259701Sdim 40259701Sdim const ConstructorMap &constructors() const { return Constructors; } 41259701Sdim 42259701Sdimprivate: 43314564Sdim void registerMatcher(StringRef MatcherName, 44314564Sdim std::unique_ptr<MatcherDescriptor> Callback); 45314564Sdim 46259701Sdim ConstructorMap Constructors; 47259701Sdim}; 48259701Sdim 49314564Sdimvoid RegistryMaps::registerMatcher( 50314564Sdim StringRef MatcherName, std::unique_ptr<MatcherDescriptor> Callback) { 51259701Sdim assert(Constructors.find(MatcherName) == Constructors.end()); 52314564Sdim Constructors[MatcherName] = std::move(Callback); 53259701Sdim} 54259701Sdim 55259701Sdim#define REGISTER_MATCHER(name) \ 56259701Sdim registerMatcher(#name, internal::makeMatcherAutoMarshall( \ 57259701Sdim ::clang::ast_matchers::name, #name)); 58259701Sdim 59321369Sdim#define REGISTER_MATCHER_OVERLOAD(name) \ 60321369Sdim registerMatcher(#name, \ 61321369Sdim llvm::make_unique<internal::OverloadedMatcherDescriptor>(name##Callbacks)) 62321369Sdim 63259701Sdim#define SPECIFIC_MATCHER_OVERLOAD(name, Id) \ 64314564Sdim static_cast<::clang::ast_matchers::name##_Type##Id>( \ 65259701Sdim ::clang::ast_matchers::name) 66259701Sdim 67321369Sdim#define MATCHER_OVERLOAD_ENTRY(name, Id) \ 68321369Sdim internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, Id), \ 69321369Sdim #name) 70321369Sdim 71259701Sdim#define REGISTER_OVERLOADED_2(name) \ 72259701Sdim do { \ 73321369Sdim std::unique_ptr<MatcherDescriptor> name##Callbacks[] = { \ 74321369Sdim MATCHER_OVERLOAD_ENTRY(name, 0), \ 75321369Sdim MATCHER_OVERLOAD_ENTRY(name, 1)}; \ 76321369Sdim REGISTER_MATCHER_OVERLOAD(name); \ 77259701Sdim } while (0) 78259701Sdim 79259701Sdim/// \brief Generate a registry map with all the known matchers. 80259701SdimRegistryMaps::RegistryMaps() { 81259701Sdim // TODO: Here is the list of the missing matchers, grouped by reason. 82259701Sdim // 83259701Sdim // Need Variant/Parser fixes: 84259701Sdim // ofKind 85259701Sdim // 86259701Sdim // Polymorphic + argument overload: 87259701Sdim // findAll 88259701Sdim // 89259701Sdim // Other: 90259701Sdim // equalsNode 91259701Sdim 92259701Sdim REGISTER_OVERLOADED_2(callee); 93259701Sdim REGISTER_OVERLOADED_2(hasPrefix); 94259701Sdim REGISTER_OVERLOADED_2(hasType); 95259701Sdim REGISTER_OVERLOADED_2(isDerivedFrom); 96259701Sdim REGISTER_OVERLOADED_2(isSameOrDerivedFrom); 97276479Sdim REGISTER_OVERLOADED_2(loc); 98259701Sdim REGISTER_OVERLOADED_2(pointsTo); 99259701Sdim REGISTER_OVERLOADED_2(references); 100259701Sdim REGISTER_OVERLOADED_2(thisPointerType); 101259701Sdim 102321369Sdim std::unique_ptr<MatcherDescriptor> equalsCallbacks[] = { 103321369Sdim MATCHER_OVERLOAD_ENTRY(equals, 0), 104321369Sdim MATCHER_OVERLOAD_ENTRY(equals, 1), 105321369Sdim MATCHER_OVERLOAD_ENTRY(equals, 2), 106321369Sdim }; 107321369Sdim REGISTER_MATCHER_OVERLOAD(equals); 108321369Sdim 109259701Sdim REGISTER_MATCHER(accessSpecDecl); 110309124Sdim REGISTER_MATCHER(addrLabelExpr); 111259701Sdim REGISTER_MATCHER(alignOfExpr); 112259701Sdim REGISTER_MATCHER(allOf); 113259701Sdim REGISTER_MATCHER(anyOf); 114259701Sdim REGISTER_MATCHER(anything); 115259701Sdim REGISTER_MATCHER(argumentCountIs); 116259701Sdim REGISTER_MATCHER(arraySubscriptExpr); 117259701Sdim REGISTER_MATCHER(arrayType); 118280031Sdim REGISTER_MATCHER(asmStmt); 119259701Sdim REGISTER_MATCHER(asString); 120309124Sdim REGISTER_MATCHER(atomicExpr); 121259701Sdim REGISTER_MATCHER(atomicType); 122259701Sdim REGISTER_MATCHER(autoType); 123259701Sdim REGISTER_MATCHER(binaryOperator); 124309124Sdim REGISTER_MATCHER(binaryConditionalOperator); 125259701Sdim REGISTER_MATCHER(blockPointerType); 126296417Sdim REGISTER_MATCHER(booleanType); 127259701Sdim REGISTER_MATCHER(breakStmt); 128259701Sdim REGISTER_MATCHER(builtinType); 129259701Sdim REGISTER_MATCHER(callExpr); 130276479Sdim REGISTER_MATCHER(caseStmt); 131259701Sdim REGISTER_MATCHER(castExpr); 132259701Sdim REGISTER_MATCHER(characterLiteral); 133259701Sdim REGISTER_MATCHER(classTemplateDecl); 134259701Sdim REGISTER_MATCHER(classTemplateSpecializationDecl); 135259701Sdim REGISTER_MATCHER(complexType); 136259701Sdim REGISTER_MATCHER(compoundLiteralExpr); 137259701Sdim REGISTER_MATCHER(compoundStmt); 138259701Sdim REGISTER_MATCHER(conditionalOperator); 139280031Sdim REGISTER_MATCHER(constantArrayType); 140259701Sdim REGISTER_MATCHER(containsDeclaration); 141259701Sdim REGISTER_MATCHER(continueStmt); 142280031Sdim REGISTER_MATCHER(cStyleCastExpr); 143296417Sdim REGISTER_MATCHER(cudaKernelCallExpr); 144296417Sdim REGISTER_MATCHER(cxxBindTemporaryExpr); 145296417Sdim REGISTER_MATCHER(cxxBoolLiteral); 146296417Sdim REGISTER_MATCHER(cxxCatchStmt); 147296417Sdim REGISTER_MATCHER(cxxConstCastExpr); 148296417Sdim REGISTER_MATCHER(cxxConstructExpr); 149296417Sdim REGISTER_MATCHER(cxxConstructorDecl); 150296417Sdim REGISTER_MATCHER(cxxConversionDecl); 151296417Sdim REGISTER_MATCHER(cxxCtorInitializer); 152296417Sdim REGISTER_MATCHER(cxxDefaultArgExpr); 153296417Sdim REGISTER_MATCHER(cxxDeleteExpr); 154296417Sdim REGISTER_MATCHER(cxxDestructorDecl); 155296417Sdim REGISTER_MATCHER(cxxDynamicCastExpr); 156296417Sdim REGISTER_MATCHER(cxxForRangeStmt); 157296417Sdim REGISTER_MATCHER(cxxFunctionalCastExpr); 158296417Sdim REGISTER_MATCHER(cxxMemberCallExpr); 159296417Sdim REGISTER_MATCHER(cxxMethodDecl); 160296417Sdim REGISTER_MATCHER(cxxNewExpr); 161296417Sdim REGISTER_MATCHER(cxxNullPtrLiteralExpr); 162296417Sdim REGISTER_MATCHER(cxxOperatorCallExpr); 163296417Sdim REGISTER_MATCHER(cxxRecordDecl); 164296417Sdim REGISTER_MATCHER(cxxReinterpretCastExpr); 165296417Sdim REGISTER_MATCHER(cxxStaticCastExpr); 166321369Sdim REGISTER_MATCHER(cxxStdInitializerListExpr); 167296417Sdim REGISTER_MATCHER(cxxTemporaryObjectExpr); 168296417Sdim REGISTER_MATCHER(cxxThisExpr); 169296417Sdim REGISTER_MATCHER(cxxThrowExpr); 170296417Sdim REGISTER_MATCHER(cxxTryStmt); 171296417Sdim REGISTER_MATCHER(cxxUnresolvedConstructExpr); 172296417Sdim REGISTER_MATCHER(decayedType); 173259701Sdim REGISTER_MATCHER(decl); 174280031Sdim REGISTER_MATCHER(declaratorDecl); 175259701Sdim REGISTER_MATCHER(declCountIs); 176259701Sdim REGISTER_MATCHER(declRefExpr); 177259701Sdim REGISTER_MATCHER(declStmt); 178276479Sdim REGISTER_MATCHER(defaultStmt); 179259701Sdim REGISTER_MATCHER(dependentSizedArrayType); 180309124Sdim REGISTER_MATCHER(designatedInitExpr); 181309124Sdim REGISTER_MATCHER(designatorCountIs); 182259701Sdim REGISTER_MATCHER(doStmt); 183259701Sdim REGISTER_MATCHER(eachOf); 184259701Sdim REGISTER_MATCHER(elaboratedType); 185259701Sdim REGISTER_MATCHER(enumConstantDecl); 186259701Sdim REGISTER_MATCHER(enumDecl); 187309124Sdim REGISTER_MATCHER(enumType); 188276479Sdim REGISTER_MATCHER(equalsBoundNode); 189280031Sdim REGISTER_MATCHER(equalsIntegralValue); 190259701Sdim REGISTER_MATCHER(explicitCastExpr); 191259701Sdim REGISTER_MATCHER(expr); 192276479Sdim REGISTER_MATCHER(exprWithCleanups); 193259701Sdim REGISTER_MATCHER(fieldDecl); 194259701Sdim REGISTER_MATCHER(floatLiteral); 195259701Sdim REGISTER_MATCHER(forEach); 196309124Sdim REGISTER_MATCHER(forEachArgumentWithParam); 197276479Sdim REGISTER_MATCHER(forEachConstructorInitializer); 198259701Sdim REGISTER_MATCHER(forEachDescendant); 199276479Sdim REGISTER_MATCHER(forEachSwitchCase); 200259701Sdim REGISTER_MATCHER(forField); 201309124Sdim REGISTER_MATCHER(forFunction); 202259701Sdim REGISTER_MATCHER(forStmt); 203276479Sdim REGISTER_MATCHER(friendDecl); 204259701Sdim REGISTER_MATCHER(functionDecl); 205309124Sdim REGISTER_MATCHER(functionProtoType); 206259701Sdim REGISTER_MATCHER(functionTemplateDecl); 207259701Sdim REGISTER_MATCHER(functionType); 208309124Sdim REGISTER_MATCHER(gnuNullExpr); 209259701Sdim REGISTER_MATCHER(gotoStmt); 210259701Sdim REGISTER_MATCHER(has); 211259701Sdim REGISTER_MATCHER(hasAncestor); 212259701Sdim REGISTER_MATCHER(hasAnyArgument); 213259701Sdim REGISTER_MATCHER(hasAnyConstructorInitializer); 214314564Sdim REGISTER_MATCHER(hasAnyDeclaration); 215309124Sdim REGISTER_MATCHER(hasAnyName); 216259701Sdim REGISTER_MATCHER(hasAnyParameter); 217259701Sdim REGISTER_MATCHER(hasAnySubstatement); 218259701Sdim REGISTER_MATCHER(hasAnyTemplateArgument); 219259701Sdim REGISTER_MATCHER(hasAnyUsingShadowDecl); 220259701Sdim REGISTER_MATCHER(hasArgument); 221259701Sdim REGISTER_MATCHER(hasArgumentOfType); 222280031Sdim REGISTER_MATCHER(hasAttr); 223296417Sdim REGISTER_MATCHER(hasAutomaticStorageDuration); 224259701Sdim REGISTER_MATCHER(hasBase); 225309124Sdim REGISTER_MATCHER(hasBitWidth); 226259701Sdim REGISTER_MATCHER(hasBody); 227259701Sdim REGISTER_MATCHER(hasCanonicalType); 228276479Sdim REGISTER_MATCHER(hasCaseConstant); 229309124Sdim REGISTER_MATCHER(hasCastKind); 230259701Sdim REGISTER_MATCHER(hasCondition); 231259701Sdim REGISTER_MATCHER(hasConditionVariableStatement); 232296417Sdim REGISTER_MATCHER(hasDecayedType); 233280031Sdim REGISTER_MATCHER(hasDeclaration); 234259701Sdim REGISTER_MATCHER(hasDeclContext); 235259701Sdim REGISTER_MATCHER(hasDeducedType); 236259701Sdim REGISTER_MATCHER(hasDescendant); 237259701Sdim REGISTER_MATCHER(hasDestinationType); 238309124Sdim REGISTER_MATCHER(hasDynamicExceptionSpec); 239259701Sdim REGISTER_MATCHER(hasEitherOperand); 240259701Sdim REGISTER_MATCHER(hasElementType); 241280031Sdim REGISTER_MATCHER(hasElse); 242314564Sdim REGISTER_MATCHER(hasExternalFormalLinkage); 243259701Sdim REGISTER_MATCHER(hasFalseExpression); 244276479Sdim REGISTER_MATCHER(hasGlobalStorage); 245259701Sdim REGISTER_MATCHER(hasImplicitDestinationType); 246314564Sdim REGISTER_MATCHER(hasInClassInitializer); 247259701Sdim REGISTER_MATCHER(hasIncrement); 248259701Sdim REGISTER_MATCHER(hasIndex); 249259701Sdim REGISTER_MATCHER(hasInitializer); 250288943Sdim REGISTER_MATCHER(hasKeywordSelector); 251259701Sdim REGISTER_MATCHER(hasLHS); 252259701Sdim REGISTER_MATCHER(hasLocalQualifiers); 253276479Sdim REGISTER_MATCHER(hasLocalStorage); 254259701Sdim REGISTER_MATCHER(hasLoopInit); 255280031Sdim REGISTER_MATCHER(hasLoopVariable); 256259701Sdim REGISTER_MATCHER(hasMethod); 257259701Sdim REGISTER_MATCHER(hasName); 258288943Sdim REGISTER_MATCHER(hasNullSelector); 259259701Sdim REGISTER_MATCHER(hasObjectExpression); 260259701Sdim REGISTER_MATCHER(hasOperatorName); 261259701Sdim REGISTER_MATCHER(hasOverloadedOperatorName); 262259701Sdim REGISTER_MATCHER(hasParameter); 263259701Sdim REGISTER_MATCHER(hasParent); 264259701Sdim REGISTER_MATCHER(hasQualifier); 265280031Sdim REGISTER_MATCHER(hasRangeInit); 266288943Sdim REGISTER_MATCHER(hasReceiverType); 267314564Sdim REGISTER_MATCHER(hasReplacementType); 268309124Sdim REGISTER_MATCHER(hasReturnValue); 269259701Sdim REGISTER_MATCHER(hasRHS); 270288943Sdim REGISTER_MATCHER(hasSelector); 271259701Sdim REGISTER_MATCHER(hasSingleDecl); 272259701Sdim REGISTER_MATCHER(hasSize); 273259701Sdim REGISTER_MATCHER(hasSizeExpr); 274259701Sdim REGISTER_MATCHER(hasSourceExpression); 275296417Sdim REGISTER_MATCHER(hasStaticStorageDuration); 276309124Sdim REGISTER_MATCHER(hasSyntacticForm); 277259701Sdim REGISTER_MATCHER(hasTargetDecl); 278259701Sdim REGISTER_MATCHER(hasTemplateArgument); 279280031Sdim REGISTER_MATCHER(hasThen); 280296417Sdim REGISTER_MATCHER(hasThreadStorageDuration); 281259701Sdim REGISTER_MATCHER(hasTrueExpression); 282276479Sdim REGISTER_MATCHER(hasTypeLoc); 283259701Sdim REGISTER_MATCHER(hasUnaryOperand); 284288943Sdim REGISTER_MATCHER(hasUnarySelector); 285314564Sdim REGISTER_MATCHER(hasUnderlyingDecl); 286314564Sdim REGISTER_MATCHER(hasUnqualifiedDesugaredType); 287259701Sdim REGISTER_MATCHER(hasValueType); 288259701Sdim REGISTER_MATCHER(ifStmt); 289309124Sdim REGISTER_MATCHER(ignoringImplicit); 290259701Sdim REGISTER_MATCHER(ignoringImpCasts); 291259701Sdim REGISTER_MATCHER(ignoringParenCasts); 292259701Sdim REGISTER_MATCHER(ignoringParenImpCasts); 293309124Sdim REGISTER_MATCHER(ignoringParens); 294259701Sdim REGISTER_MATCHER(implicitCastExpr); 295309124Sdim REGISTER_MATCHER(implicitValueInitExpr); 296259701Sdim REGISTER_MATCHER(incompleteArrayType); 297259701Sdim REGISTER_MATCHER(initListExpr); 298296417Sdim REGISTER_MATCHER(injectedClassNameType); 299259701Sdim REGISTER_MATCHER(innerType); 300259701Sdim REGISTER_MATCHER(integerLiteral); 301296417Sdim REGISTER_MATCHER(isAnonymous); 302309124Sdim REGISTER_MATCHER(isAnyCharacter); 303309124Sdim REGISTER_MATCHER(isAnyPointer); 304259701Sdim REGISTER_MATCHER(isArrow); 305296417Sdim REGISTER_MATCHER(isBaseInitializer); 306309124Sdim REGISTER_MATCHER(isBitField); 307288943Sdim REGISTER_MATCHER(isCatchAll); 308296417Sdim REGISTER_MATCHER(isClass); 309276479Sdim REGISTER_MATCHER(isConst); 310321369Sdim REGISTER_MATCHER(isConstexpr); 311259701Sdim REGISTER_MATCHER(isConstQualified); 312309124Sdim REGISTER_MATCHER(isCopyAssignmentOperator); 313296417Sdim REGISTER_MATCHER(isCopyConstructor); 314296417Sdim REGISTER_MATCHER(isDefaultConstructor); 315309124Sdim REGISTER_MATCHER(isDefaulted); 316259701Sdim REGISTER_MATCHER(isDefinition); 317280031Sdim REGISTER_MATCHER(isDeleted); 318296417Sdim REGISTER_MATCHER(isExceptionVariable); 319296417Sdim REGISTER_MATCHER(isExplicit); 320259701Sdim REGISTER_MATCHER(isExplicitTemplateSpecialization); 321276479Sdim REGISTER_MATCHER(isExpr); 322259701Sdim REGISTER_MATCHER(isExternC); 323296417Sdim REGISTER_MATCHER(isFinal); 324296417Sdim REGISTER_MATCHER(isInline); 325259701Sdim REGISTER_MATCHER(isImplicit); 326280031Sdim REGISTER_MATCHER(isExpansionInFileMatching); 327280031Sdim REGISTER_MATCHER(isExpansionInMainFile); 328280031Sdim REGISTER_MATCHER(isInstantiated); 329280031Sdim REGISTER_MATCHER(isExpansionInSystemHeader); 330259701Sdim REGISTER_MATCHER(isInteger); 331280031Sdim REGISTER_MATCHER(isIntegral); 332280031Sdim REGISTER_MATCHER(isInTemplateInstantiation); 333309124Sdim REGISTER_MATCHER(isLambda); 334276479Sdim REGISTER_MATCHER(isListInitialization); 335296417Sdim REGISTER_MATCHER(isMemberInitializer); 336309124Sdim REGISTER_MATCHER(isMoveAssignmentOperator); 337296417Sdim REGISTER_MATCHER(isMoveConstructor); 338296417Sdim REGISTER_MATCHER(isNoThrow); 339259701Sdim REGISTER_MATCHER(isOverride); 340259701Sdim REGISTER_MATCHER(isPrivate); 341259701Sdim REGISTER_MATCHER(isProtected); 342259701Sdim REGISTER_MATCHER(isPublic); 343280031Sdim REGISTER_MATCHER(isPure); 344309124Sdim REGISTER_MATCHER(isSignedInteger); 345321369Sdim REGISTER_MATCHER(isStaticStorageClass); 346296417Sdim REGISTER_MATCHER(isStruct); 347259701Sdim REGISTER_MATCHER(isTemplateInstantiation); 348296417Sdim REGISTER_MATCHER(isUnion); 349309124Sdim REGISTER_MATCHER(isUnsignedInteger); 350296417Sdim REGISTER_MATCHER(isVariadic); 351259701Sdim REGISTER_MATCHER(isVirtual); 352309124Sdim REGISTER_MATCHER(isVirtualAsWritten); 353296417Sdim REGISTER_MATCHER(isVolatileQualified); 354259701Sdim REGISTER_MATCHER(isWritten); 355309124Sdim REGISTER_MATCHER(labelDecl); 356259701Sdim REGISTER_MATCHER(labelStmt); 357259701Sdim REGISTER_MATCHER(lambdaExpr); 358280031Sdim REGISTER_MATCHER(lValueReferenceType); 359259701Sdim REGISTER_MATCHER(matchesName); 360288943Sdim REGISTER_MATCHER(matchesSelector); 361259701Sdim REGISTER_MATCHER(materializeTemporaryExpr); 362259701Sdim REGISTER_MATCHER(member); 363259701Sdim REGISTER_MATCHER(memberExpr); 364259701Sdim REGISTER_MATCHER(memberPointerType); 365259701Sdim REGISTER_MATCHER(namedDecl); 366296417Sdim REGISTER_MATCHER(namespaceAliasDecl); 367280031Sdim REGISTER_MATCHER(namespaceDecl); 368259701Sdim REGISTER_MATCHER(namesType); 369259701Sdim REGISTER_MATCHER(nestedNameSpecifier); 370259701Sdim REGISTER_MATCHER(nestedNameSpecifierLoc); 371309124Sdim REGISTER_MATCHER(nullPointerConstant); 372259701Sdim REGISTER_MATCHER(nullStmt); 373288943Sdim REGISTER_MATCHER(numSelectorArgs); 374259701Sdim REGISTER_MATCHER(ofClass); 375321369Sdim REGISTER_MATCHER(objcCategoryDecl); 376296417Sdim REGISTER_MATCHER(objcInterfaceDecl); 377321369Sdim REGISTER_MATCHER(objcIvarDecl); 378288943Sdim REGISTER_MATCHER(objcMessageExpr); 379321369Sdim REGISTER_MATCHER(objcMethodDecl); 380296417Sdim REGISTER_MATCHER(objcObjectPointerType); 381321369Sdim REGISTER_MATCHER(objcPropertyDecl); 382321369Sdim REGISTER_MATCHER(objcProtocolDecl); 383259701Sdim REGISTER_MATCHER(on); 384259701Sdim REGISTER_MATCHER(onImplicitObjectArgument); 385309124Sdim REGISTER_MATCHER(opaqueValueExpr); 386259701Sdim REGISTER_MATCHER(parameterCountIs); 387309124Sdim REGISTER_MATCHER(parenExpr); 388309124Sdim REGISTER_MATCHER(parenListExpr); 389259701Sdim REGISTER_MATCHER(parenType); 390276479Sdim REGISTER_MATCHER(parmVarDecl); 391259701Sdim REGISTER_MATCHER(pointee); 392259701Sdim REGISTER_MATCHER(pointerType); 393309124Sdim REGISTER_MATCHER(predefinedExpr); 394259701Sdim REGISTER_MATCHER(qualType); 395309124Sdim REGISTER_MATCHER(realFloatingPointType); 396259701Sdim REGISTER_MATCHER(recordDecl); 397259701Sdim REGISTER_MATCHER(recordType); 398259701Sdim REGISTER_MATCHER(referenceType); 399259701Sdim REGISTER_MATCHER(refersToDeclaration); 400280031Sdim REGISTER_MATCHER(refersToIntegralType); 401259701Sdim REGISTER_MATCHER(refersToType); 402309124Sdim REGISTER_MATCHER(requiresZeroInitialization); 403280031Sdim REGISTER_MATCHER(returns); 404259701Sdim REGISTER_MATCHER(returnStmt); 405280031Sdim REGISTER_MATCHER(rValueReferenceType); 406259701Sdim REGISTER_MATCHER(sizeOfExpr); 407259701Sdim REGISTER_MATCHER(specifiesNamespace); 408259701Sdim REGISTER_MATCHER(specifiesType); 409259701Sdim REGISTER_MATCHER(specifiesTypeLoc); 410259701Sdim REGISTER_MATCHER(statementCountIs); 411288943Sdim REGISTER_MATCHER(staticAssertDecl); 412259701Sdim REGISTER_MATCHER(stmt); 413309124Sdim REGISTER_MATCHER(stmtExpr); 414259701Sdim REGISTER_MATCHER(stringLiteral); 415280031Sdim REGISTER_MATCHER(substNonTypeTemplateParmExpr); 416296417Sdim REGISTER_MATCHER(substTemplateTypeParmType); 417259701Sdim REGISTER_MATCHER(switchCase); 418259701Sdim REGISTER_MATCHER(switchStmt); 419280031Sdim REGISTER_MATCHER(templateArgument); 420314564Sdim REGISTER_MATCHER(templateName); 421280031Sdim REGISTER_MATCHER(templateArgumentCountIs); 422259701Sdim REGISTER_MATCHER(templateSpecializationType); 423314564Sdim REGISTER_MATCHER(templateTypeParmDecl); 424296417Sdim REGISTER_MATCHER(templateTypeParmType); 425259701Sdim REGISTER_MATCHER(throughUsingDecl); 426259701Sdim REGISTER_MATCHER(to); 427288943Sdim REGISTER_MATCHER(translationUnitDecl); 428259701Sdim REGISTER_MATCHER(type); 429280031Sdim REGISTER_MATCHER(typedefDecl); 430309124Sdim REGISTER_MATCHER(typedefNameDecl); 431280031Sdim REGISTER_MATCHER(typedefType); 432309124Sdim REGISTER_MATCHER(typeAliasDecl); 433321369Sdim REGISTER_MATCHER(typeAliasTemplateDecl); 434259701Sdim REGISTER_MATCHER(typeLoc); 435259701Sdim REGISTER_MATCHER(unaryExprOrTypeTraitExpr); 436259701Sdim REGISTER_MATCHER(unaryOperator); 437276479Sdim REGISTER_MATCHER(unaryTransformType); 438276479Sdim REGISTER_MATCHER(unless); 439309124Sdim REGISTER_MATCHER(unresolvedLookupExpr); 440296417Sdim REGISTER_MATCHER(unresolvedUsingTypenameDecl); 441276479Sdim REGISTER_MATCHER(unresolvedUsingValueDecl); 442259701Sdim REGISTER_MATCHER(userDefinedLiteral); 443259701Sdim REGISTER_MATCHER(usingDecl); 444280031Sdim REGISTER_MATCHER(usingDirectiveDecl); 445280031Sdim REGISTER_MATCHER(valueDecl); 446259701Sdim REGISTER_MATCHER(varDecl); 447259701Sdim REGISTER_MATCHER(variableArrayType); 448280031Sdim REGISTER_MATCHER(voidType); 449259701Sdim REGISTER_MATCHER(whileStmt); 450259701Sdim REGISTER_MATCHER(withInitializer); 451259701Sdim} 452259701Sdim 453314564SdimRegistryMaps::~RegistryMaps() {} 454259701Sdim 455259701Sdimstatic llvm::ManagedStatic<RegistryMaps> RegistryData; 456259701Sdim 457259701Sdim} // anonymous namespace 458259701Sdim 459259701Sdim// static 460276479Sdimllvm::Optional<MatcherCtor> Registry::lookupMatcherCtor(StringRef MatcherName) { 461314564Sdim auto it = RegistryData->constructors().find(MatcherName); 462276479Sdim return it == RegistryData->constructors().end() 463276479Sdim ? llvm::Optional<MatcherCtor>() 464314564Sdim : it->second.get(); 465276479Sdim} 466276479Sdim 467276479Sdimnamespace { 468276479Sdim 469276479Sdimllvm::raw_ostream &operator<<(llvm::raw_ostream &OS, 470276479Sdim const std::set<ASTNodeKind> &KS) { 471276479Sdim unsigned Count = 0; 472276479Sdim for (std::set<ASTNodeKind>::const_iterator I = KS.begin(), E = KS.end(); 473276479Sdim I != E; ++I) { 474276479Sdim if (I != KS.begin()) 475276479Sdim OS << "|"; 476276479Sdim if (Count++ == 3) { 477276479Sdim OS << "..."; 478276479Sdim break; 479276479Sdim } 480276479Sdim OS << *I; 481259701Sdim } 482276479Sdim return OS; 483276479Sdim} 484259701Sdim 485280031Sdim} // namespace 486276479Sdim 487280031Sdimstd::vector<ArgKind> Registry::getAcceptedCompletionTypes( 488280031Sdim ArrayRef<std::pair<MatcherCtor, unsigned>> Context) { 489276479Sdim ASTNodeKind InitialTypes[] = { 490280031Sdim ASTNodeKind::getFromNodeKind<Decl>(), 491280031Sdim ASTNodeKind::getFromNodeKind<QualType>(), 492280031Sdim ASTNodeKind::getFromNodeKind<Type>(), 493280031Sdim ASTNodeKind::getFromNodeKind<Stmt>(), 494280031Sdim ASTNodeKind::getFromNodeKind<NestedNameSpecifier>(), 495280031Sdim ASTNodeKind::getFromNodeKind<NestedNameSpecifierLoc>(), 496280031Sdim ASTNodeKind::getFromNodeKind<TypeLoc>()}; 497276479Sdim 498276479Sdim // Starting with the above seed of acceptable top-level matcher types, compute 499276479Sdim // the acceptable type set for the argument indicated by each context element. 500280031Sdim std::set<ArgKind> TypeSet(std::begin(InitialTypes), std::end(InitialTypes)); 501280031Sdim for (const auto &CtxEntry : Context) { 502280031Sdim MatcherCtor Ctor = CtxEntry.first; 503280031Sdim unsigned ArgNumber = CtxEntry.second; 504280031Sdim std::vector<ArgKind> NextTypeSet; 505280031Sdim for (const ArgKind &Kind : TypeSet) { 506280031Sdim if (Kind.getArgKind() == Kind.AK_Matcher && 507280031Sdim Ctor->isConvertibleTo(Kind.getMatcherKind()) && 508280031Sdim (Ctor->isVariadic() || ArgNumber < Ctor->getNumArgs())) 509280031Sdim Ctor->getArgKinds(Kind.getMatcherKind(), ArgNumber, NextTypeSet); 510276479Sdim } 511276479Sdim TypeSet.clear(); 512280031Sdim TypeSet.insert(NextTypeSet.begin(), NextTypeSet.end()); 513276479Sdim } 514280031Sdim return std::vector<ArgKind>(TypeSet.begin(), TypeSet.end()); 515280031Sdim} 516276479Sdim 517280031Sdimstd::vector<MatcherCompletion> 518280031SdimRegistry::getMatcherCompletions(ArrayRef<ArgKind> AcceptedTypes) { 519280031Sdim std::vector<MatcherCompletion> Completions; 520276479Sdim 521280031Sdim // Search the registry for acceptable matchers. 522296417Sdim for (const auto &M : RegistryData->constructors()) { 523314564Sdim const MatcherDescriptor& Matcher = *M.getValue(); 524296417Sdim StringRef Name = M.getKey(); 525296417Sdim 526276479Sdim std::set<ASTNodeKind> RetKinds; 527314564Sdim unsigned NumArgs = Matcher.isVariadic() ? 1 : Matcher.getNumArgs(); 528314564Sdim bool IsPolymorphic = Matcher.isPolymorphic(); 529280031Sdim std::vector<std::vector<ArgKind>> ArgsKinds(NumArgs); 530276479Sdim unsigned MaxSpecificity = 0; 531280031Sdim for (const ArgKind& Kind : AcceptedTypes) { 532280031Sdim if (Kind.getArgKind() != Kind.AK_Matcher) 533280031Sdim continue; 534276479Sdim unsigned Specificity; 535276479Sdim ASTNodeKind LeastDerivedKind; 536314564Sdim if (Matcher.isConvertibleTo(Kind.getMatcherKind(), &Specificity, 537314564Sdim &LeastDerivedKind)) { 538276479Sdim if (MaxSpecificity < Specificity) 539276479Sdim MaxSpecificity = Specificity; 540276479Sdim RetKinds.insert(LeastDerivedKind); 541276479Sdim for (unsigned Arg = 0; Arg != NumArgs; ++Arg) 542314564Sdim Matcher.getArgKinds(Kind.getMatcherKind(), Arg, ArgsKinds[Arg]); 543276479Sdim if (IsPolymorphic) 544276479Sdim break; 545276479Sdim } 546276479Sdim } 547276479Sdim 548276479Sdim if (!RetKinds.empty() && MaxSpecificity > 0) { 549276479Sdim std::string Decl; 550276479Sdim llvm::raw_string_ostream OS(Decl); 551276479Sdim 552276479Sdim if (IsPolymorphic) { 553296417Sdim OS << "Matcher<T> " << Name << "(Matcher<T>"; 554276479Sdim } else { 555296417Sdim OS << "Matcher<" << RetKinds << "> " << Name << "("; 556280031Sdim for (const std::vector<ArgKind> &Arg : ArgsKinds) { 557280031Sdim if (&Arg != &ArgsKinds[0]) 558276479Sdim OS << ", "; 559280031Sdim 560280031Sdim bool FirstArgKind = true; 561280031Sdim std::set<ASTNodeKind> MatcherKinds; 562280031Sdim // Two steps. First all non-matchers, then matchers only. 563280031Sdim for (const ArgKind &AK : Arg) { 564280031Sdim if (AK.getArgKind() == ArgKind::AK_Matcher) { 565280031Sdim MatcherKinds.insert(AK.getMatcherKind()); 566280031Sdim } else { 567280031Sdim if (!FirstArgKind) OS << "|"; 568280031Sdim FirstArgKind = false; 569280031Sdim OS << AK.asString(); 570280031Sdim } 571280031Sdim } 572280031Sdim if (!MatcherKinds.empty()) { 573280031Sdim if (!FirstArgKind) OS << "|"; 574276479Sdim OS << "Matcher<" << MatcherKinds << ">"; 575276479Sdim } 576276479Sdim } 577276479Sdim } 578314564Sdim if (Matcher.isVariadic()) 579276479Sdim OS << "..."; 580276479Sdim OS << ")"; 581276479Sdim 582296417Sdim std::string TypedText = Name; 583276479Sdim TypedText += "("; 584276479Sdim if (ArgsKinds.empty()) 585276479Sdim TypedText += ")"; 586280031Sdim else if (ArgsKinds[0][0].getArgKind() == ArgKind::AK_String) 587276479Sdim TypedText += "\""; 588276479Sdim 589280031Sdim Completions.emplace_back(TypedText, OS.str(), MaxSpecificity); 590276479Sdim } 591276479Sdim } 592276479Sdim 593280031Sdim return Completions; 594276479Sdim} 595276479Sdim 596259701Sdim// static 597276479SdimVariantMatcher Registry::constructMatcher(MatcherCtor Ctor, 598296417Sdim SourceRange NameRange, 599276479Sdim ArrayRef<ParserValue> Args, 600276479Sdim Diagnostics *Error) { 601276479Sdim return Ctor->create(NameRange, Args, Error); 602276479Sdim} 603276479Sdim 604276479Sdim// static 605276479SdimVariantMatcher Registry::constructBoundMatcher(MatcherCtor Ctor, 606296417Sdim SourceRange NameRange, 607259701Sdim StringRef BindID, 608259701Sdim ArrayRef<ParserValue> Args, 609259701Sdim Diagnostics *Error) { 610276479Sdim VariantMatcher Out = constructMatcher(Ctor, NameRange, Args, Error); 611259701Sdim if (Out.isNull()) return Out; 612259701Sdim 613259701Sdim llvm::Optional<DynTypedMatcher> Result = Out.getSingleMatcher(); 614259701Sdim if (Result.hasValue()) { 615259701Sdim llvm::Optional<DynTypedMatcher> Bound = Result->tryBind(BindID); 616259701Sdim if (Bound.hasValue()) { 617259701Sdim return VariantMatcher::SingleMatcher(*Bound); 618259701Sdim } 619259701Sdim } 620259701Sdim Error->addError(NameRange, Error->ET_RegistryNotBindable); 621259701Sdim return VariantMatcher(); 622259701Sdim} 623259701Sdim 624259701Sdim} // namespace dynamic 625259701Sdim} // namespace ast_matchers 626259701Sdim} // namespace clang 627