1e30903d99ca2d530f95f22430a9a01fe2e1921d4Samuel Benzaquen//===--- Registry.cpp - Matcher registry -------------------------===// 2f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// 3f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// The LLVM Compiler Infrastructure 4f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// 5f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// This file is distributed under the University of Illinois Open Source 6f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// License. See LICENSE.TXT for details. 7f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// 8e30903d99ca2d530f95f22430a9a01fe2e1921d4Samuel Benzaquen//===------------------------------------------------------------===// 9f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// 10f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// \file 11f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// \brief Registry map populated at static initialization time. 12f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// 13e30903d99ca2d530f95f22430a9a01fe2e1921d4Samuel Benzaquen//===------------------------------------------------------------===// 14f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 15f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "clang/ASTMatchers/Dynamic/Registry.h" 16f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "Marshallers.h" 17f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "clang/ASTMatchers/ASTMatchers.h" 18f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "llvm/ADT/StringMap.h" 19f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "llvm/ADT/StringRef.h" 20f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "llvm/Support/ManagedStatic.h" 21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <set> 22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <utility> 23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesusing namespace clang::ast_type_traits; 25f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 26f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimeknamespace clang { 27f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimeknamespace ast_matchers { 28f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimeknamespace dynamic { 29f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimeknamespace { 30f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesusing internal::MatcherDescriptor; 32f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestypedef llvm::StringMap<const MatcherDescriptor *> ConstructorMap; 34f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekclass RegistryMaps { 35f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekpublic: 36f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek RegistryMaps(); 37f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek ~RegistryMaps(); 38f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 39f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek const ConstructorMap &constructors() const { return Constructors; } 40f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 41f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekprivate: 42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void registerMatcher(StringRef MatcherName, MatcherDescriptor *Callback); 43f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek ConstructorMap Constructors; 44f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek}; 45f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 46f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekvoid RegistryMaps::registerMatcher(StringRef MatcherName, 47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MatcherDescriptor *Callback) { 487a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen assert(Constructors.find(MatcherName) == Constructors.end()); 49f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek Constructors[MatcherName] = Callback; 50f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} 51f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 52f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#define REGISTER_MATCHER(name) \ 53f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek registerMatcher(#name, internal::makeMatcherAutoMarshall( \ 54f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek ::clang::ast_matchers::name, #name)); 55f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 560e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen#define SPECIFIC_MATCHER_OVERLOAD(name, Id) \ 570e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen static_cast< ::clang::ast_matchers::name##_Type##Id>( \ 580e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen ::clang::ast_matchers::name) 590e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen 600e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen#define REGISTER_OVERLOADED_2(name) \ 610e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen do { \ 62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MatcherDescriptor *Callbacks[] = { \ 630e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, 0), \ 640e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen #name), \ 650e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, 1), \ 660e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen #name) \ 670e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen }; \ 68ee0da9520fe94f701240e9e1c97773ee412be102Samuel Benzaquen registerMatcher(#name, \ 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines new internal::OverloadedMatcherDescriptor(Callbacks)); \ 706de440e1989ee7932c942dcba85e862c31bf4604Samuel Benzaquen } while (0) 716de440e1989ee7932c942dcba85e862c31bf4604Samuel Benzaquen 72f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/// \brief Generate a registry map with all the known matchers. 73f7f295f321fd434e1e542844a71f538a56f2f8fbManuel KlimekRegistryMaps::RegistryMaps() { 747a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen // TODO: Here is the list of the missing matchers, grouped by reason. 757a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen // 767a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen // Need Variant/Parser fixes: 777a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen // ofKind 787a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen // 797a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen // Polymorphic + argument overload: 807a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen // findAll 817a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen // 827a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen // Other: 837a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen // equals 847a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen // equalsNode 85f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 860e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen REGISTER_OVERLOADED_2(callee); 870e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen REGISTER_OVERLOADED_2(hasPrefix); 880e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen REGISTER_OVERLOADED_2(hasType); 890e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen REGISTER_OVERLOADED_2(isDerivedFrom); 900e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen REGISTER_OVERLOADED_2(isSameOrDerivedFrom); 91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_OVERLOADED_2(loc); 920e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen REGISTER_OVERLOADED_2(pointsTo); 930e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen REGISTER_OVERLOADED_2(references); 940e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen REGISTER_OVERLOADED_2(thisPointerType); 950e1896a753845deee5206b28cdbde1640abb9cacSamuel Benzaquen 967a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(accessSpecDecl); 977a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(alignOfExpr); 98a735090449197f1edcdc85a6080eebc0304a31ddSamuel Benzaquen REGISTER_MATCHER(allOf); 99a735090449197f1edcdc85a6080eebc0304a31ddSamuel Benzaquen REGISTER_MATCHER(anyOf); 100ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen REGISTER_MATCHER(anything); 101ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen REGISTER_MATCHER(argumentCountIs); 1027a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(arraySubscriptExpr); 1037a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(arrayType); 1047a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(asmStmt); 105176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(asString); 1067a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(atomicType); 1077a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(autoType); 108f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(binaryOperator); 109f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(bindTemporaryExpr); 1107a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(blockPointerType); 111f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(boolLiteral); 1127a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(breakStmt); 1137a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(builtinType); 114f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(callExpr); 115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(caseStmt); 1167a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(castExpr); 1177a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(catchStmt); 118f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(characterLiteral); 1197a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(classTemplateDecl); 1207a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(classTemplateSpecializationDecl); 1217a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(complexType); 1227a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(compoundLiteralExpr); 123f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(compoundStmt); 124f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(conditionalOperator); 1257a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(constantArrayType); 126176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(constCastExpr); 127f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(constructExpr); 128f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(constructorDecl); 1297a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(containsDeclaration); 1307a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(continueStmt); 131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(cStyleCastExpr); 13230d405bf736e1f5280e49cc0a7f93c28cfc690d8Stefanus Du Toit REGISTER_MATCHER(ctorInitializer); 133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(CUDAKernelCallExpr); 1347a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(decl); 135176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(declaratorDecl); 1367a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(declCountIs); 137f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(declRefExpr); 138f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(declStmt); 139f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(defaultArgExpr); 140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(defaultStmt); 1417a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(deleteExpr); 1427a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(dependentSizedArrayType); 1437a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(destructorDecl); 144f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(doStmt); 145f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(dynamicCastExpr); 146a735090449197f1edcdc85a6080eebc0304a31ddSamuel Benzaquen REGISTER_MATCHER(eachOf); 1477a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(elaboratedType); 1487a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(enumConstantDecl); 1497a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(enumDecl); 150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(equalsBoundNode); 151176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(equalsIntegralValue); 152f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(explicitCastExpr); 153f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(expr); 154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(exprWithCleanups); 155f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(fieldDecl); 156c5ae717c2b774bfce6bce4bb51072f664b2d54aaDaniel Jasper REGISTER_MATCHER(floatLiteral); 157ee0da9520fe94f701240e9e1c97773ee412be102Samuel Benzaquen REGISTER_MATCHER(forEach); 158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(forEachConstructorInitializer); 159ee0da9520fe94f701240e9e1c97773ee412be102Samuel Benzaquen REGISTER_MATCHER(forEachDescendant); 160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(forEachSwitchCase); 16186e4d744eaa44f7e674e41074913d8ed61f1d433Samuel Benzaquen REGISTER_MATCHER(forField); 1627a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(forRangeStmt); 163f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(forStmt); 164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(friendDecl); 165176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(functionalCastExpr); 166f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(functionDecl); 1677a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(functionTemplateDecl); 1687a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(functionType); 1697a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(gotoStmt); 170ee0da9520fe94f701240e9e1c97773ee412be102Samuel Benzaquen REGISTER_MATCHER(has); 171ee0da9520fe94f701240e9e1c97773ee412be102Samuel Benzaquen REGISTER_MATCHER(hasAncestor); 172ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen REGISTER_MATCHER(hasAnyArgument); 17386e4d744eaa44f7e674e41074913d8ed61f1d433Samuel Benzaquen REGISTER_MATCHER(hasAnyConstructorInitializer); 174f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(hasAnyParameter); 175f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(hasAnySubstatement); 176671840a66f63f55705175e51fb44f77a55e0e3b6Samuel Benzaquen REGISTER_MATCHER(hasAnyTemplateArgument); 1777a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(hasAnyUsingShadowDecl); 178ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen REGISTER_MATCHER(hasArgument); 1797a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(hasArgumentOfType); 180176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(hasAttr); 1817a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(hasBase); 182ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen REGISTER_MATCHER(hasBody); 1837a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(hasCanonicalType); 184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(hasCaseConstant); 185ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen REGISTER_MATCHER(hasCondition); 186f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(hasConditionVariableStatement); 1876c1dc7870f457803a9b256ed868da82532be820bSamuel Benzaquen REGISTER_MATCHER(hasDeclaration); 188176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(hasDeclContext); 1893f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen REGISTER_MATCHER(hasDeducedType); 190ee0da9520fe94f701240e9e1c97773ee412be102Samuel Benzaquen REGISTER_MATCHER(hasDescendant); 191f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(hasDestinationType); 192f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(hasEitherOperand); 1933f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen REGISTER_MATCHER(hasElementType); 194176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(hasElse); 195f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(hasFalseExpression); 196c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines REGISTER_MATCHER(hasGlobalStorage); 197f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(hasImplicitDestinationType); 1987a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(hasIncrement); 1997a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(hasIndex); 200f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(hasInitializer); 2013ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar REGISTER_MATCHER(hasKeywordSelector); 202f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(hasLHS); 2037a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(hasLocalQualifiers); 204c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines REGISTER_MATCHER(hasLocalStorage); 2057a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(hasLoopInit); 206176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(hasLoopVariable); 2077a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(hasMethod); 208f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(hasName); 2093ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar REGISTER_MATCHER(hasNullSelector); 210f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(hasObjectExpression); 211ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen REGISTER_MATCHER(hasOperatorName); 212ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen REGISTER_MATCHER(hasOverloadedOperatorName); 2137a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(hasParameter); 214ee0da9520fe94f701240e9e1c97773ee412be102Samuel Benzaquen REGISTER_MATCHER(hasParent); 2157a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(hasQualifier); 216176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(hasRangeInit); 2173ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar REGISTER_MATCHER(hasReceiverType); 218f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(hasRHS); 2193ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar REGISTER_MATCHER(hasSelector); 2207a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(hasSingleDecl); 2217a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(hasSize); 2227a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(hasSizeExpr); 223f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(hasSourceExpression); 2247a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(hasTargetDecl); 225671840a66f63f55705175e51fb44f77a55e0e3b6Samuel Benzaquen REGISTER_MATCHER(hasTemplateArgument); 226176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(hasThen); 227f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(hasTrueExpression); 228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(hasTypeLoc); 229f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(hasUnaryOperand); 2303ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar REGISTER_MATCHER(hasUnarySelector); 2313f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen REGISTER_MATCHER(hasValueType); 232f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(ifStmt); 2337a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(ignoringImpCasts); 2347a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(ignoringParenCasts); 2357a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(ignoringParenImpCasts); 236f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(implicitCastExpr); 2377a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(incompleteArrayType); 2387a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(initListExpr); 2393f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen REGISTER_MATCHER(innerType); 240f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(integerLiteral); 241f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(isArrow); 242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(isConst); 243f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(isConstQualified); 244ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen REGISTER_MATCHER(isDefinition); 245176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(isDeleted); 246ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen REGISTER_MATCHER(isExplicitTemplateSpecialization); 247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(isExpr); 2487a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(isExternC); 249f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(isImplicit); 2500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines REGISTER_MATCHER(isExpansionInFileMatching); 2510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines REGISTER_MATCHER(isExpansionInMainFile); 252176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(isInstantiated); 2530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines REGISTER_MATCHER(isExpansionInSystemHeader); 2547a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(isInteger); 255176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(isIntegral); 256176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(isInTemplateInstantiation); 257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(isListInitialization); 2587a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(isOverride); 2597a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(isPrivate); 2607a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(isProtected); 2617a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(isPublic); 262176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(isPure); 263ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen REGISTER_MATCHER(isTemplateInstantiation); 2647a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(isVirtual); 26586e4d744eaa44f7e674e41074913d8ed61f1d433Samuel Benzaquen REGISTER_MATCHER(isWritten); 2667a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(labelStmt); 2677a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(lambdaExpr); 268176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(lValueReferenceType); 2697a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(matchesName); 2703ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar REGISTER_MATCHER(matchesSelector); 2717a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(materializeTemporaryExpr); 272f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(member); 2737a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(memberCallExpr); 274f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(memberExpr); 2757a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(memberPointerType); 276f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(methodDecl); 277f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(namedDecl); 2787a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(namespaceDecl); 279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(namesType); 2807a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(nestedNameSpecifier); 2817a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(nestedNameSpecifierLoc); 282f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(newExpr); 2837a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(nullPtrLiteralExpr); 2847a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(nullStmt); 2853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar REGISTER_MATCHER(numSelectorArgs); 286f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(ofClass); 2873ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar REGISTER_MATCHER(objcMessageExpr); 288f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(on); 289f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(onImplicitObjectArgument); 290f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(operatorCallExpr); 2917a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(parameterCountIs); 2927a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(parenType); 293651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(parmVarDecl); 2943f84bb341bfb1312842b09db71d76bc3898ba247Samuel Benzaquen REGISTER_MATCHER(pointee); 2957a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(pointerType); 2967a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(qualType); 297f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(recordDecl); 2987a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(recordType); 2997a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(referenceType); 3007a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(refersToDeclaration); 301176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(refersToIntegralType); 3027a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(refersToType); 303f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(reinterpretCastExpr); 3047a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(returns); 305176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(returnStmt); 306176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(rValueReferenceType); 3077a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(sizeOfExpr); 3087a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(specifiesNamespace); 3097a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(specifiesType); 3107a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(specifiesTypeLoc); 3117a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(statementCountIs); 312f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(staticCastExpr); 313f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(stmt); 314f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(stringLiteral); 315176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(substNonTypeTemplateParmExpr); 316f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(switchCase); 3177a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(switchStmt); 318176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(templateArgument); 319176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(templateArgumentCountIs); 3207a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(templateSpecializationType); 321651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(temporaryObjectExpr); 3227a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(thisExpr); 3237a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(throughUsingDecl); 3247a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(throwExpr); 325f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(to); 3260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines REGISTER_MATCHER(translationUnitDecl); 3277a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(tryStmt); 3287a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(type); 3290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines REGISTER_MATCHER(typedefDecl); 3307a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(typedefType); 331176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(typeLoc); 3327a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(unaryExprOrTypeTraitExpr); 333f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(unaryOperator); 334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(unaryTransformType); 335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(unless); 336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(unresolvedConstructExpr); 337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines REGISTER_MATCHER(unresolvedUsingValueDecl); 3387a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(userDefinedLiteral); 3397a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(usingDecl); 340176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(usingDirectiveDecl); 341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines REGISTER_MATCHER(valueDecl); 342f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(varDecl); 3437a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen REGISTER_MATCHER(variableArrayType); 3440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines REGISTER_MATCHER(voidType); 345f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek REGISTER_MATCHER(whileStmt); 34686e4d744eaa44f7e674e41074913d8ed61f1d433Samuel Benzaquen REGISTER_MATCHER(withInitializer); 347f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} 348f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 349f7f295f321fd434e1e542844a71f538a56f2f8fbManuel KlimekRegistryMaps::~RegistryMaps() { 350f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek for (ConstructorMap::iterator it = Constructors.begin(), 351f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek end = Constructors.end(); 352f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek it != end; ++it) { 353f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek delete it->second; 354f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek } 355f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} 356f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 357f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekstatic llvm::ManagedStatic<RegistryMaps> RegistryData; 358f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 359f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} // anonymous namespace 360f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 361f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek// static 3626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesllvm::Optional<MatcherCtor> Registry::lookupMatcherCtor(StringRef MatcherName) { 363f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek ConstructorMap::const_iterator it = 364f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek RegistryData->constructors().find(MatcherName); 3656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return it == RegistryData->constructors().end() 3666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ? llvm::Optional<MatcherCtor>() 3676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines : it->second; 368651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace { 371651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 372651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesllvm::raw_ostream &operator<<(llvm::raw_ostream &OS, 373651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const std::set<ASTNodeKind> &KS) { 374651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned Count = 0; 375651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (std::set<ASTNodeKind>::const_iterator I = KS.begin(), E = KS.end(); 376651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines I != E; ++I) { 377651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (I != KS.begin()) 378651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << "|"; 379651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Count++ == 3) { 380651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << "..."; 381651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 382651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 383651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << *I; 384651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 385651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return OS; 386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 388176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} // namespace 389651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 390176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstd::vector<ArgKind> Registry::getAcceptedCompletionTypes( 391176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ArrayRef<std::pair<MatcherCtor, unsigned>> Context) { 392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ASTNodeKind InitialTypes[] = { 393176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ASTNodeKind::getFromNodeKind<Decl>(), 394176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ASTNodeKind::getFromNodeKind<QualType>(), 395176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ASTNodeKind::getFromNodeKind<Type>(), 396176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ASTNodeKind::getFromNodeKind<Stmt>(), 397176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ASTNodeKind::getFromNodeKind<NestedNameSpecifier>(), 398176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ASTNodeKind::getFromNodeKind<NestedNameSpecifierLoc>(), 399176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines ASTNodeKind::getFromNodeKind<TypeLoc>()}; 400651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 401651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Starting with the above seed of acceptable top-level matcher types, compute 402651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // the acceptable type set for the argument indicated by each context element. 403176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::set<ArgKind> TypeSet(std::begin(InitialTypes), std::end(InitialTypes)); 404176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (const auto &CtxEntry : Context) { 405176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines MatcherCtor Ctor = CtxEntry.first; 406176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines unsigned ArgNumber = CtxEntry.second; 407176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::vector<ArgKind> NextTypeSet; 408176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (const ArgKind &Kind : TypeSet) { 409176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Kind.getArgKind() == Kind.AK_Matcher && 410176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Ctor->isConvertibleTo(Kind.getMatcherKind()) && 411176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines (Ctor->isVariadic() || ArgNumber < Ctor->getNumArgs())) 412176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Ctor->getArgKinds(Kind.getMatcherKind(), ArgNumber, NextTypeSet); 413651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 414651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TypeSet.clear(); 415176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines TypeSet.insert(NextTypeSet.begin(), NextTypeSet.end()); 416651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 417176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return std::vector<ArgKind>(TypeSet.begin(), TypeSet.end()); 418176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 419651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 420176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstd::vector<MatcherCompletion> 421176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesRegistry::getMatcherCompletions(ArrayRef<ArgKind> AcceptedTypes) { 422176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::vector<MatcherCompletion> Completions; 423651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 424176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Search the registry for acceptable matchers. 425651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (ConstructorMap::const_iterator I = RegistryData->constructors().begin(), 426651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines E = RegistryData->constructors().end(); 427651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines I != E; ++I) { 428651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::set<ASTNodeKind> RetKinds; 429651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned NumArgs = I->second->isVariadic() ? 1 : I->second->getNumArgs(); 430651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool IsPolymorphic = I->second->isPolymorphic(); 431176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::vector<std::vector<ArgKind>> ArgsKinds(NumArgs); 432651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned MaxSpecificity = 0; 433176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (const ArgKind& Kind : AcceptedTypes) { 434176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (Kind.getArgKind() != Kind.AK_Matcher) 435176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines continue; 436651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned Specificity; 437651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ASTNodeKind LeastDerivedKind; 438176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (I->second->isConvertibleTo(Kind.getMatcherKind(), &Specificity, 439176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines &LeastDerivedKind)) { 440651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (MaxSpecificity < Specificity) 441651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines MaxSpecificity = Specificity; 442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines RetKinds.insert(LeastDerivedKind); 443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (unsigned Arg = 0; Arg != NumArgs; ++Arg) 444176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines I->second->getArgKinds(Kind.getMatcherKind(), Arg, ArgsKinds[Arg]); 445651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (IsPolymorphic) 446651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 447651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 448651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 449651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 450651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!RetKinds.empty() && MaxSpecificity > 0) { 451651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string Decl; 452651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::raw_string_ostream OS(Decl); 453651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (IsPolymorphic) { 455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << "Matcher<T> " << I->first() << "(Matcher<T>"; 456651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << "Matcher<" << RetKinds << "> " << I->first() << "("; 458176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (const std::vector<ArgKind> &Arg : ArgsKinds) { 459176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (&Arg != &ArgsKinds[0]) 460651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << ", "; 461176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 462176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines bool FirstArgKind = true; 463176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines std::set<ASTNodeKind> MatcherKinds; 464176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Two steps. First all non-matchers, then matchers only. 465176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines for (const ArgKind &AK : Arg) { 466176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (AK.getArgKind() == ArgKind::AK_Matcher) { 467176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines MatcherKinds.insert(AK.getMatcherKind()); 468176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } else { 469176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!FirstArgKind) OS << "|"; 470176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines FirstArgKind = false; 471176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines OS << AK.asString(); 472176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 473176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines } 474176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!MatcherKinds.empty()) { 475176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (!FirstArgKind) OS << "|"; 476651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << "Matcher<" << MatcherKinds << ">"; 477651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 478651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 479651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 480651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (I->second->isVariadic()) 481651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << "..."; 482651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << ")"; 483651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 484651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string TypedText = I->first(); 485651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TypedText += "("; 486651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (ArgsKinds.empty()) 487651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TypedText += ")"; 488176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines else if (ArgsKinds[0][0].getArgKind() == ArgKind::AK_String) 489651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TypedText += "\""; 490651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 491176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines Completions.emplace_back(TypedText, OS.str(), MaxSpecificity); 492651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 493651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 494651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 495176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return Completions; 496651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 497651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 498651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// static 499651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesVariantMatcher Registry::constructMatcher(MatcherCtor Ctor, 500651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const SourceRange &NameRange, 501651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ArrayRef<ParserValue> Args, 502651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Diagnostics *Error) { 503651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Ctor->create(NameRange, Args, Error); 504f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} 505f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 5064f37d925927dfdd0c770702ffb22de38fc2007dcSamuel Benzaquen// static 507651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesVariantMatcher Registry::constructBoundMatcher(MatcherCtor Ctor, 5089d02807c3ea9782442b98201df68294cd7cd7313Samuel Benzaquen const SourceRange &NameRange, 5099d02807c3ea9782442b98201df68294cd7cd7313Samuel Benzaquen StringRef BindID, 5109d02807c3ea9782442b98201df68294cd7cd7313Samuel Benzaquen ArrayRef<ParserValue> Args, 5119d02807c3ea9782442b98201df68294cd7cd7313Samuel Benzaquen Diagnostics *Error) { 512651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines VariantMatcher Out = constructMatcher(Ctor, NameRange, Args, Error); 5139d02807c3ea9782442b98201df68294cd7cd7313Samuel Benzaquen if (Out.isNull()) return Out; 5149d02807c3ea9782442b98201df68294cd7cd7313Samuel Benzaquen 515b7488d77414b000ce2506b520a6b29f845fb3950Samuel Benzaquen llvm::Optional<DynTypedMatcher> Result = Out.getSingleMatcher(); 516b7488d77414b000ce2506b520a6b29f845fb3950Samuel Benzaquen if (Result.hasValue()) { 517b7488d77414b000ce2506b520a6b29f845fb3950Samuel Benzaquen llvm::Optional<DynTypedMatcher> Bound = Result->tryBind(BindID); 518b7488d77414b000ce2506b520a6b29f845fb3950Samuel Benzaquen if (Bound.hasValue()) { 5199d02807c3ea9782442b98201df68294cd7cd7313Samuel Benzaquen return VariantMatcher::SingleMatcher(*Bound); 520ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen } 5214f37d925927dfdd0c770702ffb22de38fc2007dcSamuel Benzaquen } 5228a77c20375874c0759a5cd5b4a34e83465d821b2Samuel Benzaquen Error->addError(NameRange, Error->ET_RegistryNotBindable); 5239d02807c3ea9782442b98201df68294cd7cd7313Samuel Benzaquen return VariantMatcher(); 5244f37d925927dfdd0c770702ffb22de38fc2007dcSamuel Benzaquen} 5254f37d925927dfdd0c770702ffb22de38fc2007dcSamuel Benzaquen 526f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} // namespace dynamic 527f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} // namespace ast_matchers 528f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} // namespace clang 529