diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/ASTMatchers/ASTMatchFinder.cpp | 72 | ||||
-rw-r--r-- | clang/lib/ASTMatchers/ASTMatchersInternal.cpp | 18 | ||||
-rw-r--r-- | clang/lib/ASTMatchers/Dynamic/Marshallers.h | 11 | ||||
-rw-r--r-- | clang/lib/ASTMatchers/Dynamic/Parser.cpp | 22 | ||||
-rw-r--r-- | clang/lib/ASTMatchers/Dynamic/Registry.cpp | 8 | ||||
-rw-r--r-- | clang/lib/ASTMatchers/Dynamic/VariantValue.cpp | 52 |
6 files changed, 79 insertions, 104 deletions
diff --git a/clang/lib/ASTMatchers/ASTMatchFinder.cpp b/clang/lib/ASTMatchers/ASTMatchFinder.cpp index 78bd9be9357..fbb696f4644 100644 --- a/clang/lib/ASTMatchers/ASTMatchFinder.cpp +++ b/clang/lib/ASTMatchers/ASTMatchFinder.cpp @@ -295,25 +295,26 @@ private: class MatchASTVisitor : public RecursiveASTVisitor<MatchASTVisitor>, public ASTMatchFinder { public: - MatchASTVisitor(std::vector<std::pair<const internal::DynTypedMatcher*, - MatchCallback*> > *MatcherCallbackPairs) - : MatcherCallbackPairs(MatcherCallbackPairs), - ActiveASTContext(NULL) { - } + MatchASTVisitor( + std::vector<std::pair<internal::DynTypedMatcher, MatchCallback *> > * + MatcherCallbackPairs) + : MatcherCallbackPairs(MatcherCallbackPairs), ActiveASTContext(NULL) {} void onStartOfTranslationUnit() { - for (std::vector<std::pair<const internal::DynTypedMatcher*, - MatchCallback*> >::const_iterator - I = MatcherCallbackPairs->begin(), E = MatcherCallbackPairs->end(); + for (std::vector<std::pair<internal::DynTypedMatcher, + MatchCallback *> >::const_iterator + I = MatcherCallbackPairs->begin(), + E = MatcherCallbackPairs->end(); I != E; ++I) { I->second->onStartOfTranslationUnit(); } } void onEndOfTranslationUnit() { - for (std::vector<std::pair<const internal::DynTypedMatcher*, - MatchCallback*> >::const_iterator - I = MatcherCallbackPairs->begin(), E = MatcherCallbackPairs->end(); + for (std::vector<std::pair<internal::DynTypedMatcher, + MatchCallback *> >::const_iterator + I = MatcherCallbackPairs->begin(), + E = MatcherCallbackPairs->end(); I != E; ++I) { I->second->onEndOfTranslationUnit(); } @@ -450,12 +451,13 @@ public: // Matches all registered matchers on the given node and calls the // result callback for every node that matches. void match(const ast_type_traits::DynTypedNode& Node) { - for (std::vector<std::pair<const internal::DynTypedMatcher*, - MatchCallback*> >::const_iterator - I = MatcherCallbackPairs->begin(), E = MatcherCallbackPairs->end(); + for (std::vector<std::pair<internal::DynTypedMatcher, + MatchCallback *> >::const_iterator + I = MatcherCallbackPairs->begin(), + E = MatcherCallbackPairs->end(); I != E; ++I) { BoundNodesTreeBuilder Builder; - if (I->first->matches(Node, this, &Builder)) { + if (I->first.matches(Node, this, &Builder)) { MatchVisitor Visitor(ActiveASTContext, I->second); Builder.visitMatches(&Visitor); } @@ -603,8 +605,8 @@ private: return false; } - std::vector<std::pair<const internal::DynTypedMatcher*, - MatchCallback*> > *const MatcherCallbackPairs; + std::vector<std::pair<internal::DynTypedMatcher, MatchCallback *> > *const + MatcherCallbackPairs; ASTContext *ActiveASTContext; // Maps a canonical type to its TypedefDecls. @@ -743,11 +745,10 @@ bool MatchASTVisitor::TraverseNestedNameSpecifierLoc( class MatchASTConsumer : public ASTConsumer { public: MatchASTConsumer( - std::vector<std::pair<const internal::DynTypedMatcher*, - MatchCallback*> > *MatcherCallbackPairs, - MatchFinder::ParsingDoneTestCallback *ParsingDone) - : Visitor(MatcherCallbackPairs), - ParsingDone(ParsingDone) {} + std::vector<std::pair<internal::DynTypedMatcher, MatchCallback *> > * + MatcherCallbackPairs, + MatchFinder::ParsingDoneTestCallback *ParsingDone) + : Visitor(MatcherCallbackPairs), ParsingDone(ParsingDone) {} private: virtual void HandleTranslationUnit(ASTContext &Context) { @@ -778,49 +779,36 @@ MatchFinder::ParsingDoneTestCallback::~ParsingDoneTestCallback() {} MatchFinder::MatchFinder() : ParsingDone(NULL) {} -MatchFinder::~MatchFinder() { - for (std::vector<std::pair<const internal::DynTypedMatcher*, - MatchCallback*> >::const_iterator - It = MatcherCallbackPairs.begin(), End = MatcherCallbackPairs.end(); - It != End; ++It) { - delete It->first; - } -} +MatchFinder::~MatchFinder() {} void MatchFinder::addMatcher(const DeclarationMatcher &NodeMatch, MatchCallback *Action) { - MatcherCallbackPairs.push_back(std::make_pair( - new internal::Matcher<Decl>(NodeMatch), Action)); + MatcherCallbackPairs.push_back(std::make_pair(NodeMatch, Action)); } void MatchFinder::addMatcher(const TypeMatcher &NodeMatch, MatchCallback *Action) { - MatcherCallbackPairs.push_back(std::make_pair( - new internal::Matcher<QualType>(NodeMatch), Action)); + MatcherCallbackPairs.push_back(std::make_pair(NodeMatch, Action)); } void MatchFinder::addMatcher(const StatementMatcher &NodeMatch, MatchCallback *Action) { - MatcherCallbackPairs.push_back(std::make_pair( - new internal::Matcher<Stmt>(NodeMatch), Action)); + MatcherCallbackPairs.push_back(std::make_pair(NodeMatch, Action)); } void MatchFinder::addMatcher(const NestedNameSpecifierMatcher &NodeMatch, MatchCallback *Action) { - MatcherCallbackPairs.push_back(std::make_pair( - new NestedNameSpecifierMatcher(NodeMatch), Action)); + MatcherCallbackPairs.push_back(std::make_pair(NodeMatch, Action)); } void MatchFinder::addMatcher(const NestedNameSpecifierLocMatcher &NodeMatch, MatchCallback *Action) { - MatcherCallbackPairs.push_back(std::make_pair( - new NestedNameSpecifierLocMatcher(NodeMatch), Action)); + MatcherCallbackPairs.push_back(std::make_pair(NodeMatch, Action)); } void MatchFinder::addMatcher(const TypeLocMatcher &NodeMatch, MatchCallback *Action) { - MatcherCallbackPairs.push_back(std::make_pair( - new TypeLocMatcher(NodeMatch), Action)); + MatcherCallbackPairs.push_back(std::make_pair(NodeMatch, Action)); } ASTConsumer *MatchFinder::newASTConsumer() { diff --git a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp index e7465167da1..d15eb54002f 100644 --- a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp +++ b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -26,25 +26,23 @@ void BoundNodesTreeBuilder::visitMatches(Visitor *ResultVisitor) { } } +DynTypedMatcher::MatcherStorage::~MatcherStorage() {} + void BoundNodesTreeBuilder::addMatch(const BoundNodesTreeBuilder &Other) { for (unsigned i = 0, e = Other.Bindings.size(); i != e; ++i) { Bindings.push_back(Other.Bindings[i]); } } -DynTypedMatcher::~DynTypedMatcher() {} - -DynTypedMatcher *DynTypedMatcher::tryBind(StringRef ID) const { return NULL; } - bool AllOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder, - ArrayRef<const DynTypedMatcher *> InnerMatchers) { + ArrayRef<DynTypedMatcher> InnerMatchers) { // allOf leads to one matcher for each alternative in the first // matcher combined with each alternative in the second matcher. // Thus, we can reuse the same Builder. for (size_t i = 0, e = InnerMatchers.size(); i != e; ++i) { - if (!InnerMatchers[i]->matches(DynNode, Finder, Builder)) + if (!InnerMatchers[i].matches(DynNode, Finder, Builder)) return false; } return true; @@ -53,12 +51,12 @@ bool AllOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode, bool EachOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder, - ArrayRef<const DynTypedMatcher *> InnerMatchers) { + ArrayRef<DynTypedMatcher> InnerMatchers) { BoundNodesTreeBuilder Result; bool Matched = false; for (size_t i = 0, e = InnerMatchers.size(); i != e; ++i) { BoundNodesTreeBuilder BuilderInner(*Builder); - if (InnerMatchers[i]->matches(DynNode, Finder, &BuilderInner)) { + if (InnerMatchers[i].matches(DynNode, Finder, &BuilderInner)) { Matched = true; Result.addMatch(BuilderInner); } @@ -70,10 +68,10 @@ bool EachOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode, bool AnyOfVariadicOperator(const ast_type_traits::DynTypedNode DynNode, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder, - ArrayRef<const DynTypedMatcher *> InnerMatchers) { + ArrayRef<DynTypedMatcher> InnerMatchers) { for (size_t i = 0, e = InnerMatchers.size(); i != e; ++i) { BoundNodesTreeBuilder Result = *Builder; - if (InnerMatchers[i]->matches(DynNode, Finder, &Result)) { + if (InnerMatchers[i].matches(DynNode, Finder, &Result)) { *Builder = Result; return true; } diff --git a/clang/lib/ASTMatchers/Dynamic/Marshallers.h b/clang/lib/ASTMatchers/Dynamic/Marshallers.h index 0df9c8cd60d..ae0c300d094 100644 --- a/clang/lib/ASTMatchers/Dynamic/Marshallers.h +++ b/clang/lib/ASTMatchers/Dynamic/Marshallers.h @@ -167,15 +167,13 @@ private: /// out of the polymorphic object. template <class PolyMatcher> static void mergePolyMatchers(const PolyMatcher &Poly, - std::vector<const DynTypedMatcher *> &Out, + std::vector<DynTypedMatcher> &Out, ast_matchers::internal::EmptyTypeList) {} template <class PolyMatcher, class TypeList> static void mergePolyMatchers(const PolyMatcher &Poly, - std::vector<const DynTypedMatcher *> &Out, - TypeList) { - Out.push_back(ast_matchers::internal::Matcher<typename TypeList::head>(Poly) - .clone()); + std::vector<DynTypedMatcher> &Out, TypeList) { + Out.push_back(ast_matchers::internal::Matcher<typename TypeList::head>(Poly)); mergePolyMatchers(Poly, Out, typename TypeList::tail()); } @@ -193,10 +191,9 @@ template <typename T> static VariantMatcher outvalueToVariantMatcher(const T &PolyMatcher, typename T::ReturnTypes * = NULL) { - std::vector<const DynTypedMatcher *> Matchers; + std::vector<DynTypedMatcher> Matchers; mergePolyMatchers(PolyMatcher, Matchers, typename T::ReturnTypes()); VariantMatcher Out = VariantMatcher::PolymorphicMatcher(Matchers); - llvm::DeleteContainerPointers(Matchers); return Out; } diff --git a/clang/lib/ASTMatchers/Dynamic/Parser.cpp b/clang/lib/ASTMatchers/Dynamic/Parser.cpp index 37e6c10478c..df9596e9b93 100644 --- a/clang/lib/ASTMatchers/Dynamic/Parser.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Parser.cpp @@ -390,29 +390,29 @@ bool Parser::parseExpression(StringRef Code, Sema *S, return true; } -DynTypedMatcher *Parser::parseMatcherExpression(StringRef Code, - Diagnostics *Error) { +llvm::Optional<DynTypedMatcher> +Parser::parseMatcherExpression(StringRef Code, Diagnostics *Error) { RegistrySema S; return parseMatcherExpression(Code, &S, Error); } -DynTypedMatcher *Parser::parseMatcherExpression(StringRef Code, - Parser::Sema *S, - Diagnostics *Error) { +llvm::Optional<DynTypedMatcher> +Parser::parseMatcherExpression(StringRef Code, Parser::Sema *S, + Diagnostics *Error) { VariantValue Value; if (!parseExpression(Code, S, &Value, Error)) - return NULL; + return llvm::Optional<DynTypedMatcher>(); if (!Value.isMatcher()) { Error->addError(SourceRange(), Error->ET_ParserNotAMatcher); - return NULL; + return llvm::Optional<DynTypedMatcher>(); } - const DynTypedMatcher *Result; - if (!Value.getMatcher().getSingleMatcher(Result)) { + llvm::Optional<DynTypedMatcher> Result = + Value.getMatcher().getSingleMatcher(); + if (!Result.hasValue()) { Error->addError(SourceRange(), Error->ET_ParserOverloadedType) << Value.getTypeAsString(); - return NULL; } - return Result->clone(); + return Result; } } // namespace dynamic diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp index 3f8e7d4cd9d..3a17038d985 100644 --- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -329,10 +329,10 @@ VariantMatcher Registry::constructBoundMatcher(StringRef MatcherName, VariantMatcher Out = constructMatcher(MatcherName, NameRange, Args, Error); if (Out.isNull()) return Out; - const DynTypedMatcher *Result; - if (Out.getSingleMatcher(Result)) { - OwningPtr<DynTypedMatcher> Bound(Result->tryBind(BindID)); - if (Bound) { + llvm::Optional<DynTypedMatcher> Result = Out.getSingleMatcher(); + if (Result.hasValue()) { + llvm::Optional<DynTypedMatcher> Bound = Result->tryBind(BindID); + if (Bound.hasValue()) { return VariantMatcher::SingleMatcher(*Bound); } } diff --git a/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp b/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp index c350d78aa14..3e49e1b8ef0 100644 --- a/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp +++ b/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp @@ -26,44 +26,37 @@ VariantMatcher::Payload::~Payload() {} class VariantMatcher::SinglePayload : public VariantMatcher::Payload { public: - SinglePayload(const DynTypedMatcher &Matcher) : Matcher(Matcher.clone()) {} + SinglePayload(const DynTypedMatcher &Matcher) : Matcher(Matcher) {} - virtual bool getSingleMatcher(const DynTypedMatcher *&Out) const { - Out = Matcher.get(); - return true; + virtual llvm::Optional<DynTypedMatcher> getSingleMatcher() const { + return Matcher; } virtual std::string getTypeAsString() const { - return (Twine("Matcher<") + Matcher->getSupportedKind().asStringRef() + ">") + return (Twine("Matcher<") + Matcher.getSupportedKind().asStringRef() + ">") .str(); } virtual void makeTypedMatcher(MatcherOps &Ops) const { - if (Ops.canConstructFrom(*Matcher)) - Ops.constructFrom(*Matcher); + if (Ops.canConstructFrom(Matcher)) + Ops.constructFrom(Matcher); } private: - OwningPtr<const DynTypedMatcher> Matcher; + const DynTypedMatcher Matcher; }; class VariantMatcher::PolymorphicPayload : public VariantMatcher::Payload { public: - PolymorphicPayload(ArrayRef<const DynTypedMatcher *> MatchersIn) { - for (size_t i = 0, e = MatchersIn.size(); i != e; ++i) { - Matchers.push_back(MatchersIn[i]->clone()); - } - } + PolymorphicPayload(ArrayRef<DynTypedMatcher> MatchersIn) + : Matchers(MatchersIn) {} - virtual ~PolymorphicPayload() { - llvm::DeleteContainerPointers(Matchers); - } + virtual ~PolymorphicPayload() {} - virtual bool getSingleMatcher(const DynTypedMatcher *&Out) const { + virtual llvm::Optional<DynTypedMatcher> getSingleMatcher() const { if (Matchers.size() != 1) - return false; - Out = Matchers[0]; - return true; + return llvm::Optional<DynTypedMatcher>(); + return Matchers[0]; } virtual std::string getTypeAsString() const { @@ -71,7 +64,7 @@ public: for (size_t i = 0, e = Matchers.size(); i != e; ++i) { if (i != 0) Inner += "|"; - Inner += Matchers[i]->getSupportedKind().asStringRef(); + Inner += Matchers[i].getSupportedKind().asStringRef(); } return (Twine("Matcher<") + Inner + ">").str(); } @@ -79,17 +72,17 @@ public: virtual void makeTypedMatcher(MatcherOps &Ops) const { const DynTypedMatcher *Found = NULL; for (size_t i = 0, e = Matchers.size(); i != e; ++i) { - if (Ops.canConstructFrom(*Matchers[i])) { + if (Ops.canConstructFrom(Matchers[i])) { if (Found) return; - Found = Matchers[i]; + Found = &Matchers[i]; } } if (Found) Ops.constructFrom(*Found); } - std::vector<const DynTypedMatcher *> Matchers; + const std::vector<DynTypedMatcher> Matchers; }; class VariantMatcher::VariadicOpPayload : public VariantMatcher::Payload { @@ -98,8 +91,8 @@ public: ArrayRef<VariantMatcher> Args) : Func(Func), Args(Args) {} - virtual bool getSingleMatcher(const DynTypedMatcher *&Out) const { - return false; + virtual llvm::Optional<DynTypedMatcher> getSingleMatcher() const { + return llvm::Optional<DynTypedMatcher>(); } virtual std::string getTypeAsString() const { @@ -128,7 +121,7 @@ VariantMatcher VariantMatcher::SingleMatcher(const DynTypedMatcher &Matcher) { } VariantMatcher -VariantMatcher::PolymorphicMatcher(ArrayRef<const DynTypedMatcher *> Matchers) { +VariantMatcher::PolymorphicMatcher(ArrayRef<DynTypedMatcher> Matchers) { return VariantMatcher(new PolymorphicPayload(Matchers)); } @@ -138,9 +131,8 @@ VariantMatcher VariantMatcher::VariadicOperatorMatcher( return VariantMatcher(new VariadicOpPayload(Func, Args)); } -bool VariantMatcher::getSingleMatcher(const DynTypedMatcher *&Out) const { - if (Value) return Value->getSingleMatcher(Out); - return false; +llvm::Optional<DynTypedMatcher> VariantMatcher::getSingleMatcher() const { + return Value ? Value->getSingleMatcher() : llvm::Optional<DynTypedMatcher>(); } void VariantMatcher::reset() { Value.reset(); } |