diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:18:08 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:18:08 +0000 |
commit | bab175ec4b075c8076ba14c762900392533f6ee4 (patch) | |
tree | 01f4f29419a2cb10abe13c1e63cd2a66068b0137 /lib/ASTMatchers/Dynamic/Registry.cpp | |
parent | 8b7a8012d223fac5d17d16a66bb39168a9a1dfc0 (diff) |
Notes
Diffstat (limited to 'lib/ASTMatchers/Dynamic/Registry.cpp')
-rw-r--r-- | lib/ASTMatchers/Dynamic/Registry.cpp | 61 |
1 files changed, 34 insertions, 27 deletions
diff --git a/lib/ASTMatchers/Dynamic/Registry.cpp b/lib/ASTMatchers/Dynamic/Registry.cpp index a8d4b88d8580..d1cab80c1a53 100644 --- a/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/lib/ASTMatchers/Dynamic/Registry.cpp @@ -31,7 +31,7 @@ namespace { using internal::MatcherDescriptor; -typedef llvm::StringMap<const MatcherDescriptor *> ConstructorMap; +typedef llvm::StringMap<std::unique_ptr<const MatcherDescriptor>> ConstructorMap; class RegistryMaps { public: RegistryMaps(); @@ -40,14 +40,16 @@ public: const ConstructorMap &constructors() const { return Constructors; } private: - void registerMatcher(StringRef MatcherName, MatcherDescriptor *Callback); + void registerMatcher(StringRef MatcherName, + std::unique_ptr<MatcherDescriptor> Callback); + ConstructorMap Constructors; }; -void RegistryMaps::registerMatcher(StringRef MatcherName, - MatcherDescriptor *Callback) { +void RegistryMaps::registerMatcher( + StringRef MatcherName, std::unique_ptr<MatcherDescriptor> Callback) { assert(Constructors.find(MatcherName) == Constructors.end()); - Constructors[MatcherName] = Callback; + Constructors[MatcherName] = std::move(Callback); } #define REGISTER_MATCHER(name) \ @@ -55,19 +57,19 @@ void RegistryMaps::registerMatcher(StringRef MatcherName, ::clang::ast_matchers::name, #name)); #define SPECIFIC_MATCHER_OVERLOAD(name, Id) \ - static_cast< ::clang::ast_matchers::name##_Type##Id>( \ + static_cast<::clang::ast_matchers::name##_Type##Id>( \ ::clang::ast_matchers::name) #define REGISTER_OVERLOADED_2(name) \ do { \ - MatcherDescriptor *Callbacks[] = { \ - internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, 0), \ - #name), \ - internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, 1), \ - #name) \ - }; \ - registerMatcher(#name, \ - new internal::OverloadedMatcherDescriptor(Callbacks)); \ + std::unique_ptr<MatcherDescriptor> Callbacks[] = { \ + internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, 0), \ + #name), \ + internal::makeMatcherAutoMarshall(SPECIFIC_MATCHER_OVERLOAD(name, 1), \ + #name)}; \ + registerMatcher( \ + #name, \ + llvm::make_unique<internal::OverloadedMatcherDescriptor>(Callbacks)); \ } while (0) /// \brief Generate a registry map with all the known matchers. @@ -198,6 +200,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(hasAncestor); REGISTER_MATCHER(hasAnyArgument); REGISTER_MATCHER(hasAnyConstructorInitializer); + REGISTER_MATCHER(hasAnyDeclaration); REGISTER_MATCHER(hasAnyName); REGISTER_MATCHER(hasAnyParameter); REGISTER_MATCHER(hasAnySubstatement); @@ -225,9 +228,11 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(hasEitherOperand); REGISTER_MATCHER(hasElementType); REGISTER_MATCHER(hasElse); + REGISTER_MATCHER(hasExternalFormalLinkage); REGISTER_MATCHER(hasFalseExpression); REGISTER_MATCHER(hasGlobalStorage); REGISTER_MATCHER(hasImplicitDestinationType); + REGISTER_MATCHER(hasInClassInitializer); REGISTER_MATCHER(hasIncrement); REGISTER_MATCHER(hasIndex); REGISTER_MATCHER(hasInitializer); @@ -248,6 +253,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(hasQualifier); REGISTER_MATCHER(hasRangeInit); REGISTER_MATCHER(hasReceiverType); + REGISTER_MATCHER(hasReplacementType); REGISTER_MATCHER(hasReturnValue); REGISTER_MATCHER(hasRHS); REGISTER_MATCHER(hasSelector); @@ -265,6 +271,8 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(hasTypeLoc); REGISTER_MATCHER(hasUnaryOperand); REGISTER_MATCHER(hasUnarySelector); + REGISTER_MATCHER(hasUnderlyingDecl); + REGISTER_MATCHER(hasUnqualifiedDesugaredType); REGISTER_MATCHER(hasValueType); REGISTER_MATCHER(ifStmt); REGISTER_MATCHER(ignoringImplicit); @@ -391,8 +399,10 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(switchCase); REGISTER_MATCHER(switchStmt); REGISTER_MATCHER(templateArgument); + REGISTER_MATCHER(templateName); REGISTER_MATCHER(templateArgumentCountIs); REGISTER_MATCHER(templateSpecializationType); + REGISTER_MATCHER(templateTypeParmDecl); REGISTER_MATCHER(templateTypeParmType); REGISTER_MATCHER(throughUsingDecl); REGISTER_MATCHER(to); @@ -421,9 +431,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(withInitializer); } -RegistryMaps::~RegistryMaps() { - llvm::DeleteContainerSeconds(Constructors); -} +RegistryMaps::~RegistryMaps() {} static llvm::ManagedStatic<RegistryMaps> RegistryData; @@ -431,11 +439,10 @@ static llvm::ManagedStatic<RegistryMaps> RegistryData; // static llvm::Optional<MatcherCtor> Registry::lookupMatcherCtor(StringRef MatcherName) { - ConstructorMap::const_iterator it = - RegistryData->constructors().find(MatcherName); + auto it = RegistryData->constructors().find(MatcherName); return it == RegistryData->constructors().end() ? llvm::Optional<MatcherCtor>() - : it->second; + : it->second.get(); } namespace { @@ -494,12 +501,12 @@ Registry::getMatcherCompletions(ArrayRef<ArgKind> AcceptedTypes) { // Search the registry for acceptable matchers. for (const auto &M : RegistryData->constructors()) { - const auto *Matcher = M.getValue(); + const MatcherDescriptor& Matcher = *M.getValue(); StringRef Name = M.getKey(); std::set<ASTNodeKind> RetKinds; - unsigned NumArgs = Matcher->isVariadic() ? 1 : Matcher->getNumArgs(); - bool IsPolymorphic = Matcher->isPolymorphic(); + unsigned NumArgs = Matcher.isVariadic() ? 1 : Matcher.getNumArgs(); + bool IsPolymorphic = Matcher.isPolymorphic(); std::vector<std::vector<ArgKind>> ArgsKinds(NumArgs); unsigned MaxSpecificity = 0; for (const ArgKind& Kind : AcceptedTypes) { @@ -507,13 +514,13 @@ Registry::getMatcherCompletions(ArrayRef<ArgKind> AcceptedTypes) { continue; unsigned Specificity; ASTNodeKind LeastDerivedKind; - if (Matcher->isConvertibleTo(Kind.getMatcherKind(), &Specificity, - &LeastDerivedKind)) { + if (Matcher.isConvertibleTo(Kind.getMatcherKind(), &Specificity, + &LeastDerivedKind)) { if (MaxSpecificity < Specificity) MaxSpecificity = Specificity; RetKinds.insert(LeastDerivedKind); for (unsigned Arg = 0; Arg != NumArgs; ++Arg) - Matcher->getArgKinds(Kind.getMatcherKind(), Arg, ArgsKinds[Arg]); + Matcher.getArgKinds(Kind.getMatcherKind(), Arg, ArgsKinds[Arg]); if (IsPolymorphic) break; } @@ -549,7 +556,7 @@ Registry::getMatcherCompletions(ArrayRef<ArgKind> AcceptedTypes) { } } } - if (Matcher->isVariadic()) + if (Matcher.isVariadic()) OS << "..."; OS << ")"; |