diff options
author | Samuel Benzaquen <sbenza@google.com> | 2013-08-28 18:42:04 +0000 |
---|---|---|
committer | Samuel Benzaquen <sbenza@google.com> | 2013-08-28 18:42:04 +0000 |
commit | 4adca6262e56bf626b72d6784f0e48c0e2d1aa46 (patch) | |
tree | 737efefb78a823246c6461fe820556c878ff4ee4 /clang/lib/ASTMatchers/Dynamic/VariantValue.cpp | |
parent | 6d09904cc97466446bd6672351865b936a26dd9c (diff) | |
download | bcm5719-llvm-4adca6262e56bf626b72d6784f0e48c0e2d1aa46.tar.gz bcm5719-llvm-4adca6262e56bf626b72d6784f0e48c0e2d1aa46.zip |
Add support for eachOf/allOf/anyOf variadic matchers in the dynamic layer.
Summary:
Add support for eachOf/allOf/anyOf variadic matchers in the dynamic layer.
These function require some late binding behavior for the type conversions, thus changes in VariadicValue's MatcherList.
Second try. This time with a fix for C++11 builds.
Reviewers: klimek
CC: cfe-commits, revane
Differential Revision: http://llvm-reviews.chandlerc.com/D1536
llvm-svn: 189500
Diffstat (limited to 'clang/lib/ASTMatchers/Dynamic/VariantValue.cpp')
-rw-r--r-- | clang/lib/ASTMatchers/Dynamic/VariantValue.cpp | 60 |
1 files changed, 44 insertions, 16 deletions
diff --git a/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp b/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp index 87aca7da853..c350d78aa14 100644 --- a/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp +++ b/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp @@ -38,13 +38,9 @@ public: .str(); } - virtual bool hasTypedMatcher(const MatcherOps &Ops) const { - return Ops.canConstructFrom(*Matcher); - } - - virtual const DynTypedMatcher *getTypedMatcher(const MatcherOps &Ops) const { - assert(hasTypedMatcher(Ops)); - return Matcher.get(); + virtual void makeTypedMatcher(MatcherOps &Ops) const { + if (Ops.canConstructFrom(*Matcher)) + Ops.constructFrom(*Matcher); } private: @@ -80,25 +76,51 @@ public: return (Twine("Matcher<") + Inner + ">").str(); } - virtual bool hasTypedMatcher(const MatcherOps &Ops) const { - return getTypedMatcher(Ops) != NULL; - } - - virtual const DynTypedMatcher *getTypedMatcher(const MatcherOps &Ops) const { - const DynTypedMatcher* Found = NULL; + 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 (Found) return NULL; + if (Found) + return; Found = Matchers[i]; } } - return Found; + if (Found) + Ops.constructFrom(*Found); } -private: std::vector<const DynTypedMatcher *> Matchers; }; +class VariantMatcher::VariadicOpPayload : public VariantMatcher::Payload { +public: + VariadicOpPayload(ast_matchers::internal::VariadicOperatorFunction Func, + ArrayRef<VariantMatcher> Args) + : Func(Func), Args(Args) {} + + virtual bool getSingleMatcher(const DynTypedMatcher *&Out) const { + return false; + } + + virtual std::string getTypeAsString() const { + std::string Inner; + for (size_t i = 0, e = Args.size(); i != e; ++i) { + if (i != 0) + Inner += "&"; + Inner += Args[i].getTypeAsString(); + } + return Inner; + } + + virtual void makeTypedMatcher(MatcherOps &Ops) const { + Ops.constructVariadicOperator(Func, Args); + } + +private: + const ast_matchers::internal::VariadicOperatorFunction Func; + const std::vector<VariantMatcher> Args; +}; + VariantMatcher::VariantMatcher() {} VariantMatcher VariantMatcher::SingleMatcher(const DynTypedMatcher &Matcher) { @@ -110,6 +132,12 @@ VariantMatcher::PolymorphicMatcher(ArrayRef<const DynTypedMatcher *> Matchers) { return VariantMatcher(new PolymorphicPayload(Matchers)); } +VariantMatcher VariantMatcher::VariadicOperatorMatcher( + ast_matchers::internal::VariadicOperatorFunction Func, + ArrayRef<VariantMatcher> Args) { + return VariantMatcher(new VariadicOpPayload(Func, Args)); +} + bool VariantMatcher::getSingleMatcher(const DynTypedMatcher *&Out) const { if (Value) return Value->getSingleMatcher(Out); return false; |