summaryrefslogtreecommitdiffstats
path: root/clang/lib/ASTMatchers/Dynamic/VariantValue.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/ASTMatchers/Dynamic/VariantValue.cpp')
-rw-r--r--clang/lib/ASTMatchers/Dynamic/VariantValue.cpp60
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;
OpenPOWER on IntegriCloud