// static VariantMatcher Registry::constructMatcher(StringRef MatcherName, const SourceRange &NameRange, ArrayRef<ParserValue> Args, Diagnostics *Error) { ConstructorMap::const_iterator it = RegistryData->constructors().find(MatcherName); if (it == RegistryData->constructors().end()) { Error->addError(NameRange, Error->ET_RegistryNotFound) << MatcherName; return VariantMatcher(); } return it->second->run(NameRange, Args, Error); }
// static VariantMatcher Registry::constructBoundMatcher(StringRef MatcherName, const SourceRange &NameRange, StringRef BindID, ArrayRef<ParserValue> Args, Diagnostics *Error) { VariantMatcher Out = constructMatcher(MatcherName, NameRange, Args, Error); if (Out.isNull()) return Out; llvm::Optional<DynTypedMatcher> Result = Out.getSingleMatcher(); if (Result.hasValue()) { llvm::Optional<DynTypedMatcher> Bound = Result->tryBind(BindID); if (Bound.hasValue()) { return VariantMatcher::SingleMatcher(*Bound); } } Error->addError(NameRange, Error->ET_RegistryNotBindable); return VariantMatcher(); }
// static VariantMatcher Registry::constructBoundMatcher(StringRef MatcherName, const SourceRange &NameRange, StringRef BindID, ArrayRef<ParserValue> Args, Diagnostics *Error) { VariantMatcher Out = constructMatcher(MatcherName, NameRange, Args, Error); if (Out.isNull()) return Out; const DynTypedMatcher *Result; if (Out.getSingleMatcher(Result)) { OwningPtr<DynTypedMatcher> Bound(Result->tryBind(BindID)); if (Bound) { return VariantMatcher::SingleMatcher(*Bound); } } Error->addError(NameRange, Error->ET_RegistryNotBindable); return VariantMatcher(); }
VariantMatcher VariantMatcher::VariadicOperatorMatcher( ast_matchers::internal::VariadicOperatorFunction Func, ArrayRef<VariantMatcher> Args) { return VariantMatcher(new VariadicOpPayload(Func, Args)); }
VariantMatcher VariantMatcher::PolymorphicMatcher(ArrayRef<DynTypedMatcher> Matchers) { return VariantMatcher(new PolymorphicPayload(Matchers)); }
VariantMatcher VariantMatcher::SingleMatcher(const DynTypedMatcher &Matcher) { return VariantMatcher(new SinglePayload(Matcher)); }