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