Add support for .bind("foo") expressions on the dynamic matchers.
Summary: Add support on the parser, registry, and DynTypedMatcher for binding IDs dynamically.
Reviewers: klimek
CC: cfe-commits, revane
Differential Revision: http://llvm-reviews.chandlerc.com/D911
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@183144 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/ASTMatchers/Dynamic/Registry.cpp b/lib/ASTMatchers/Dynamic/Registry.cpp
index 34a230b..6e543fc 100644
--- a/lib/ASTMatchers/Dynamic/Registry.cpp
+++ b/lib/ASTMatchers/Dynamic/Registry.cpp
@@ -148,6 +148,23 @@
return it->second->run(NameRange, Args, Error);
}
+// static
+DynTypedMatcher *Registry::constructBoundMatcher(StringRef MatcherName,
+ const SourceRange &NameRange,
+ StringRef BindID,
+ ArrayRef<ParserValue> Args,
+ Diagnostics *Error) {
+ OwningPtr<DynTypedMatcher> Out(
+ constructMatcher(MatcherName, NameRange, Args, Error));
+ if (!Out) return NULL;
+ DynTypedMatcher *Bound = Out->tryBind(BindID);
+ if (!Bound) {
+ Error->pushErrorFrame(NameRange, Error->ET_RegistryNotBindable);
+ return NULL;
+ }
+ return Bound;
+}
+
} // namespace dynamic
} // namespace ast_matchers
} // namespace clang