diff options
author | Justin Lebar <jlebar@google.com> | 2016-10-10 16:26:40 +0000 |
---|---|---|
committer | Justin Lebar <jlebar@google.com> | 2016-10-10 16:26:40 +0000 |
commit | 82380d8eb489289ce296d6889673aec08c1b83bb (patch) | |
tree | 5f435304cf3c2587ed4e6437dc951b5cb9603ad9 /clang | |
parent | 03b062019277fd3ac63a6e2e6ebcc1be3dd620b9 (diff) | |
download | llvm-82380d8eb489289ce296d6889673aec08c1b83bb.zip llvm-82380d8eb489289ce296d6889673aec08c1b83bb.tar.gz llvm-82380d8eb489289ce296d6889673aec08c1b83bb.tar.bz2 |
[AST] Convert Marshallers to use unique_ptr.
Reviewers: timshen
Subscribers: cfe-commits, klimek
Differential Revision: https://reviews.llvm.org/D25425
llvm-svn: 283773
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/ASTMatchers/Dynamic/Marshallers.h | 69 | ||||
-rw-r--r-- | clang/lib/ASTMatchers/Dynamic/Registry.cpp | 53 |
2 files changed, 62 insertions, 60 deletions
diff --git a/clang/lib/ASTMatchers/Dynamic/Marshallers.h b/clang/lib/ASTMatchers/Dynamic/Marshallers.h index 7b1a307..fb6b349 100644 --- a/clang/lib/ASTMatchers/Dynamic/Marshallers.h +++ b/clang/lib/ASTMatchers/Dynamic/Marshallers.h @@ -480,8 +480,8 @@ template <template <typename ToArg, typename FromArg> class ArgumentAdapterT, typename FromTypes, typename ToTypes> class AdaptativeOverloadCollector { public: - AdaptativeOverloadCollector(StringRef Name, - std::vector<MatcherDescriptor *> &Out) + AdaptativeOverloadCollector( + StringRef Name, std::vector<std::unique_ptr<MatcherDescriptor>> &Out) : Name(Name), Out(Out) { collect(FromTypes()); } @@ -499,7 +499,7 @@ private: inline void collect(FromTypeList); StringRef Name; - std::vector<MatcherDescriptor *> &Out; + std::vector<std::unique_ptr<MatcherDescriptor>> &Out; }; /// \brief MatcherDescriptor that wraps multiple "overloads" of the same @@ -509,8 +509,10 @@ private: /// more than one overloads match the arguments. class OverloadedMatcherDescriptor : public MatcherDescriptor { public: - OverloadedMatcherDescriptor(ArrayRef<MatcherDescriptor *> Callbacks) - : Overloads(Callbacks.begin(), Callbacks.end()) {} + OverloadedMatcherDescriptor( + MutableArrayRef<std::unique_ptr<MatcherDescriptor>> Callbacks) + : Overloads(std::make_move_iterator(Callbacks.begin()), + std::make_move_iterator(Callbacks.end())) {} ~OverloadedMatcherDescriptor() override {} @@ -641,36 +643,37 @@ private: /// \brief 0-arg overload template <typename ReturnType> -MatcherDescriptor *makeMatcherAutoMarshall(ReturnType (*Func)(), - StringRef MatcherName) { +std::unique_ptr<MatcherDescriptor> +makeMatcherAutoMarshall(ReturnType (*Func)(), StringRef MatcherName) { std::vector<ast_type_traits::ASTNodeKind> RetTypes; BuildReturnTypeVector<ReturnType>::build(RetTypes); - return new FixedArgCountMatcherDescriptor( + return llvm::make_unique<FixedArgCountMatcherDescriptor>( matcherMarshall0<ReturnType>, reinterpret_cast<void (*)()>(Func), MatcherName, RetTypes, None); } /// \brief 1-arg overload template <typename ReturnType, typename ArgType1> -MatcherDescriptor *makeMatcherAutoMarshall(ReturnType (*Func)(ArgType1), - StringRef MatcherName) { +std::unique_ptr<MatcherDescriptor> +makeMatcherAutoMarshall(ReturnType (*Func)(ArgType1), StringRef MatcherName) { std::vector<ast_type_traits::ASTNodeKind> RetTypes; BuildReturnTypeVector<ReturnType>::build(RetTypes); ArgKind AK = ArgTypeTraits<ArgType1>::getKind(); - return new FixedArgCountMatcherDescriptor( + return llvm::make_unique<FixedArgCountMatcherDescriptor>( matcherMarshall1<ReturnType, ArgType1>, reinterpret_cast<void (*)()>(Func), MatcherName, RetTypes, AK); } /// \brief 2-arg overload template <typename ReturnType, typename ArgType1, typename ArgType2> -MatcherDescriptor *makeMatcherAutoMarshall(ReturnType (*Func)(ArgType1, ArgType2), - StringRef MatcherName) { +std::unique_ptr<MatcherDescriptor> +makeMatcherAutoMarshall(ReturnType (*Func)(ArgType1, ArgType2), + StringRef MatcherName) { std::vector<ast_type_traits::ASTNodeKind> RetTypes; BuildReturnTypeVector<ReturnType>::build(RetTypes); ArgKind AKs[] = { ArgTypeTraits<ArgType1>::getKind(), ArgTypeTraits<ArgType2>::getKind() }; - return new FixedArgCountMatcherDescriptor( + return llvm::make_unique<FixedArgCountMatcherDescriptor>( matcherMarshall2<ReturnType, ArgType1, ArgType2>, reinterpret_cast<void (*)()>(Func), MatcherName, RetTypes, AKs); } @@ -678,10 +681,10 @@ MatcherDescriptor *makeMatcherAutoMarshall(ReturnType (*Func)(ArgType1, ArgType2 /// \brief Variadic overload. template <typename ResultT, typename ArgT, ResultT (*Func)(ArrayRef<const ArgT *>)> -MatcherDescriptor *makeMatcherAutoMarshall( +std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( ast_matchers::internal::VariadicFunction<ResultT, ArgT, Func> VarFunc, StringRef MatcherName) { - return new VariadicFuncMatcherDescriptor(VarFunc, MatcherName); + return llvm::make_unique<VariadicFuncMatcherDescriptor>(VarFunc, MatcherName); } /// \brief Overload for VariadicDynCastAllOfMatchers. @@ -689,24 +692,24 @@ MatcherDescriptor *makeMatcherAutoMarshall( /// Not strictly necessary, but DynCastAllOfMatcherDescriptor gives us better /// completion results for that type of matcher. template <typename BaseT, typename DerivedT> -MatcherDescriptor * -makeMatcherAutoMarshall(ast_matchers::internal::VariadicDynCastAllOfMatcher< - BaseT, DerivedT> VarFunc, - StringRef MatcherName) { - return new DynCastAllOfMatcherDescriptor(VarFunc, MatcherName); +std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( + ast_matchers::internal::VariadicDynCastAllOfMatcher<BaseT, DerivedT> + VarFunc, + StringRef MatcherName) { + return llvm::make_unique<DynCastAllOfMatcherDescriptor>(VarFunc, MatcherName); } /// \brief Argument adaptative overload. template <template <typename ToArg, typename FromArg> class ArgumentAdapterT, typename FromTypes, typename ToTypes> -MatcherDescriptor * -makeMatcherAutoMarshall(ast_matchers::internal::ArgumentAdaptingMatcherFunc< - ArgumentAdapterT, FromTypes, ToTypes>, - StringRef MatcherName) { - std::vector<MatcherDescriptor *> Overloads; +std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( + ast_matchers::internal::ArgumentAdaptingMatcherFunc<ArgumentAdapterT, + FromTypes, ToTypes>, + StringRef MatcherName) { + std::vector<std::unique_ptr<MatcherDescriptor>> Overloads; AdaptativeOverloadCollector<ArgumentAdapterT, FromTypes, ToTypes>(MatcherName, Overloads); - return new OverloadedMatcherDescriptor(Overloads); + return llvm::make_unique<OverloadedMatcherDescriptor>(Overloads); } template <template <typename ToArg, typename FromArg> class ArgumentAdapterT, @@ -721,12 +724,12 @@ inline void AdaptativeOverloadCollector<ArgumentAdapterT, FromTypes, /// \brief Variadic operator overload. template <unsigned MinCount, unsigned MaxCount> -MatcherDescriptor * -makeMatcherAutoMarshall(ast_matchers::internal::VariadicOperatorMatcherFunc< - MinCount, MaxCount> Func, - StringRef MatcherName) { - return new VariadicOperatorMatcherDescriptor(MinCount, MaxCount, Func.Op, - MatcherName); +std::unique_ptr<MatcherDescriptor> makeMatcherAutoMarshall( + ast_matchers::internal::VariadicOperatorMatcherFunc<MinCount, MaxCount> + Func, + StringRef MatcherName) { + return llvm::make_unique<VariadicOperatorMatcherDescriptor>( + MinCount, MaxCount, Func.Op, MatcherName); } } // namespace internal diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp index 6e594d7..9741a50 100644 --- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/clang/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. @@ -426,9 +428,7 @@ RegistryMaps::RegistryMaps() { REGISTER_MATCHER(withInitializer); } -RegistryMaps::~RegistryMaps() { - llvm::DeleteContainerSeconds(Constructors); -} +RegistryMaps::~RegistryMaps() {} static llvm::ManagedStatic<RegistryMaps> RegistryData; @@ -436,11 +436,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 { @@ -499,12 +498,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) { @@ -512,13 +511,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; } @@ -554,7 +553,7 @@ Registry::getMatcherCompletions(ArrayRef<ArgKind> AcceptedTypes) { } } } - if (Matcher->isVariadic()) + if (Matcher.isVariadic()) OS << "..."; OS << ")"; |