diff options
Diffstat (limited to 'lib/ASTMatchers')
-rw-r--r-- | lib/ASTMatchers/ASTMatchFinder.cpp | 38 | ||||
-rw-r--r-- | lib/ASTMatchers/ASTMatchersInternal.cpp | 13 | ||||
-rw-r--r-- | lib/ASTMatchers/Dynamic/Marshallers.h | 69 | ||||
-rw-r--r-- | lib/ASTMatchers/Dynamic/Parser.cpp | 1 | ||||
-rw-r--r-- | lib/ASTMatchers/Dynamic/Registry.cpp | 61 |
5 files changed, 115 insertions, 67 deletions
diff --git a/lib/ASTMatchers/ASTMatchFinder.cpp b/lib/ASTMatchers/ASTMatchFinder.cpp index 19e5743ea1cb6..49b15ee68500a 100644 --- a/lib/ASTMatchers/ASTMatchFinder.cpp +++ b/lib/ASTMatchers/ASTMatchFinder.cpp @@ -126,6 +126,8 @@ public: traverse(*Q); else if (const TypeLoc *T = DynNode.get<TypeLoc>()) traverse(*T); + else if (const auto *C = DynNode.get<CXXCtorInitializer>()) + traverse(*C); // FIXME: Add other base types after adding tests. // It's OK to always overwrite the bound nodes, as if there was @@ -194,6 +196,12 @@ public: return false; return traverse(NNS); } + bool TraverseConstructorInitializer(CXXCtorInitializer *CtorInit) { + if (!CtorInit) + return true; + ScopedIncrement ScopedDepth(&CurrentDepth); + return traverse(*CtorInit); + } bool shouldVisitTemplateInstantiations() const { return true; } bool shouldVisitImplicitCode() const { return true; } @@ -235,6 +243,10 @@ private: bool baseTraverse(NestedNameSpecifierLoc NNS) { return VisitorBase::TraverseNestedNameSpecifierLoc(NNS); } + bool baseTraverse(const CXXCtorInitializer &CtorInit) { + return VisitorBase::TraverseConstructorInitializer( + const_cast<CXXCtorInitializer *>(&CtorInit)); + } // Sets 'Matched' to true if 'Matcher' matches 'Node' and: // 0 < CurrentDepth <= MaxDepth. @@ -371,6 +383,7 @@ public: bool TraverseTypeLoc(TypeLoc TypeNode); bool TraverseNestedNameSpecifier(NestedNameSpecifier *NNS); bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS); + bool TraverseConstructorInitializer(CXXCtorInitializer *CtorInit); // Matches children or descendants of 'Node' with 'BaseMatcher'. bool memoizedMatchesRecursively(const ast_type_traits::DynTypedNode &Node, @@ -472,6 +485,8 @@ public: match(*N); } else if (auto *N = Node.get<TypeLoc>()) { match(*N); + } else if (auto *N = Node.get<CXXCtorInitializer>()) { + match(*N); } } @@ -593,6 +608,9 @@ private: void matchDispatch(const NestedNameSpecifierLoc *Node) { matchWithoutFilter(*Node, Matchers->NestedNameSpecifierLoc); } + void matchDispatch(const CXXCtorInitializer *Node) { + matchWithoutFilter(*Node, Matchers->CtorInit); + } void matchDispatch(const void *) { /* Do nothing. */ } /// @} @@ -864,6 +882,17 @@ bool MatchASTVisitor::TraverseNestedNameSpecifierLoc( RecursiveASTVisitor<MatchASTVisitor>::TraverseNestedNameSpecifierLoc(NNS); } +bool MatchASTVisitor::TraverseConstructorInitializer( + CXXCtorInitializer *CtorInit) { + if (!CtorInit) + return true; + + match(*CtorInit); + + return RecursiveASTVisitor<MatchASTVisitor>::TraverseConstructorInitializer( + CtorInit); +} + class MatchASTConsumer : public ASTConsumer { public: MatchASTConsumer(MatchFinder *Finder, @@ -934,6 +963,12 @@ void MatchFinder::addMatcher(const TypeLocMatcher &NodeMatch, Matchers.AllCallbacks.insert(Action); } +void MatchFinder::addMatcher(const CXXCtorInitializerMatcher &NodeMatch, + MatchCallback *Action) { + Matchers.CtorInit.emplace_back(NodeMatch, Action); + Matchers.AllCallbacks.insert(Action); +} + bool MatchFinder::addDynamicMatcher(const internal::DynTypedMatcher &NodeMatch, MatchCallback *Action) { if (NodeMatch.canConvertTo<Decl>()) { @@ -954,6 +989,9 @@ bool MatchFinder::addDynamicMatcher(const internal::DynTypedMatcher &NodeMatch, } else if (NodeMatch.canConvertTo<TypeLoc>()) { addMatcher(NodeMatch.convertTo<TypeLoc>(), Action); return true; + } else if (NodeMatch.canConvertTo<CXXCtorInitializer>()) { + addMatcher(NodeMatch.convertTo<CXXCtorInitializer>(), Action); + return true; } return false; } diff --git a/lib/ASTMatchers/ASTMatchersInternal.cpp b/lib/ASTMatchers/ASTMatchersInternal.cpp index 107052ef1dedf..f0bfbf9e32d87 100644 --- a/lib/ASTMatchers/ASTMatchersInternal.cpp +++ b/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -72,10 +72,10 @@ private: }; class IdDynMatcher : public DynMatcherInterface { - public: +public: IdDynMatcher(StringRef ID, - const IntrusiveRefCntPtr<DynMatcherInterface> &InnerMatcher) - : ID(ID), InnerMatcher(InnerMatcher) {} + IntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher) + : ID(ID), InnerMatcher(std::move(InnerMatcher)) {} bool dynMatches(const ast_type_traits::DynTypedNode &DynNode, ASTMatchFinder *Finder, @@ -85,7 +85,7 @@ class IdDynMatcher : public DynMatcherInterface { return Result; } - private: +private: const std::string ID; const IntrusiveRefCntPtr<DynMatcherInterface> InnerMatcher; }; @@ -210,8 +210,9 @@ bool DynTypedMatcher::matchesNoKindCheck( llvm::Optional<DynTypedMatcher> DynTypedMatcher::tryBind(StringRef ID) const { if (!AllowBind) return llvm::None; auto Result = *this; - Result.Implementation = new IdDynMatcher(ID, Result.Implementation); - return Result; + Result.Implementation = + new IdDynMatcher(ID, std::move(Result.Implementation)); + return std::move(Result); } bool DynTypedMatcher::canConvertTo(ast_type_traits::ASTNodeKind To) const { diff --git a/lib/ASTMatchers/Dynamic/Marshallers.h b/lib/ASTMatchers/Dynamic/Marshallers.h index 7b1a307026334..fb6b349a811c7 100644 --- a/lib/ASTMatchers/Dynamic/Marshallers.h +++ b/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/lib/ASTMatchers/Dynamic/Parser.cpp b/lib/ASTMatchers/Dynamic/Parser.cpp index cf9dab6dc7dbd..ce8d0a9a02062 100644 --- a/lib/ASTMatchers/Dynamic/Parser.cpp +++ b/lib/ASTMatchers/Dynamic/Parser.cpp @@ -16,7 +16,6 @@ #include "clang/ASTMatchers/Dynamic/Registry.h" #include "clang/Basic/CharInfo.h" #include "llvm/ADT/Optional.h" -#include "llvm/ADT/Twine.h" #include "llvm/Support/ManagedStatic.h" #include <string> #include <vector> diff --git a/lib/ASTMatchers/Dynamic/Registry.cpp b/lib/ASTMatchers/Dynamic/Registry.cpp index a8d4b88d85809..d1cab80c1a530 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 << ")"; |