diff options
author | Samuel Benzaquen <sbenza@google.com> | 2013-10-29 14:37:15 +0000 |
---|---|---|
committer | Samuel Benzaquen <sbenza@google.com> | 2013-10-29 14:37:15 +0000 |
commit | f34ac3ed2c9badee39b3efc72d4c34f922cf3b39 (patch) | |
tree | ab663d97a5623cca3fd1fa9ecea2835f123590c6 /clang/lib/ASTMatchers/Dynamic/VariantValue.cpp | |
parent | e804b1a44e833eabd546381f9af29110f83e0100 (diff) | |
download | bcm5719-llvm-f34ac3ed2c9badee39b3efc72d4c34f922cf3b39.tar.gz bcm5719-llvm-f34ac3ed2c9badee39b3efc72d4c34f922cf3b39.zip |
Resubmit "Refactor DynTypedMatcher into a value type class, just like Matcher<T>."
Summary: This resubmits r193100, plus a fix for a breakage with MSVC.
Reviewers: klimek, rnk
CC: cfe-commits, revane
Differential Revision: http://llvm-reviews.chandlerc.com/D2005
llvm-svn: 193613
Diffstat (limited to 'clang/lib/ASTMatchers/Dynamic/VariantValue.cpp')
-rw-r--r-- | clang/lib/ASTMatchers/Dynamic/VariantValue.cpp | 52 |
1 files changed, 22 insertions, 30 deletions
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(); } |