diff options
author | Samuel Benzaquen <sbenza@google.com> | 2013-08-13 14:54:51 +0000 |
---|---|---|
committer | Samuel Benzaquen <sbenza@google.com> | 2013-08-13 14:54:51 +0000 |
commit | 0239b691674cdcfdba1e4f821cd7e31177032fac (patch) | |
tree | 9ffbc0255bb9c4d7b05d78212cc5a37919589523 /clang/lib/ASTMatchers/Dynamic/Registry.cpp | |
parent | 68443b0a1487c6f7e583de387fb76a778f4ececf (diff) | |
download | bcm5719-llvm-0239b691674cdcfdba1e4f821cd7e31177032fac.tar.gz bcm5719-llvm-0239b691674cdcfdba1e4f821cd7e31177032fac.zip |
Refactor "MatcherList" into "VariantMatcher" and abstract the notion of a list of matchers for the polymorphic case.
Summary:
Refactor "MatcherList" into "VariantMatcher" and abstract the notion of a list of matchers for the polymorphic case.
This work is to support future changes needed for eachOf/allOf/anyOf matchers. We will add a new type on VariantMatcher.
Reviewers: klimek
CC: cfe-commits, revane
Differential Revision: http://llvm-reviews.chandlerc.com/D1365
llvm-svn: 188272
Diffstat (limited to 'clang/lib/ASTMatchers/Dynamic/Registry.cpp')
-rw-r--r-- | clang/lib/ASTMatchers/Dynamic/Registry.cpp | 52 |
1 files changed, 26 insertions, 26 deletions
diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp index e0c72806d9b..47957c760b1 100644 --- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -63,25 +63,25 @@ class OverloadedMatcherCreateCallback : public MatcherCreateCallback { delete Overloads[i]; } - virtual MatcherList run(const SourceRange &NameRange, - ArrayRef<ParserValue> Args, - Diagnostics *Error) const { - std::vector<MatcherList> Constructed; + virtual VariantMatcher run(const SourceRange &NameRange, + ArrayRef<ParserValue> Args, + Diagnostics *Error) const { + std::vector<VariantMatcher> Constructed; Diagnostics::OverloadContext Ctx(Error); for (size_t i = 0, e = Overloads.size(); i != e; ++i) { - MatcherList SubMatcher = Overloads[i]->run(NameRange, Args, Error); - if (!SubMatcher.empty()) { + VariantMatcher SubMatcher = Overloads[i]->run(NameRange, Args, Error); + if (!SubMatcher.isNull()) { Constructed.push_back(SubMatcher); } } - if (Constructed.empty()) return MatcherList(); // No overload matched. + if (Constructed.empty()) return VariantMatcher(); // No overload matched. // We ignore the errors if any matcher succeeded. Ctx.revertErrors(); if (Constructed.size() > 1) { // More than one constructed. It is ambiguous. Error->addError(NameRange, Error->ET_RegistryAmbiguousOverload); - return MatcherList(); + return VariantMatcher(); } return Constructed[0]; } @@ -405,38 +405,38 @@ static llvm::ManagedStatic<RegistryMaps> RegistryData; } // anonymous namespace // static -MatcherList Registry::constructMatcher(StringRef MatcherName, - const SourceRange &NameRange, - ArrayRef<ParserValue> Args, - Diagnostics *Error) { +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 MatcherList(); + return VariantMatcher(); } return it->second->run(NameRange, Args, Error); } // static -MatcherList Registry::constructBoundMatcher(StringRef MatcherName, - const SourceRange &NameRange, - StringRef BindID, - ArrayRef<ParserValue> Args, - Diagnostics *Error) { - MatcherList Out = constructMatcher(MatcherName, NameRange, Args, Error); - if (Out.empty()) return Out; - - ArrayRef<const DynTypedMatcher*> Matchers = Out.matchers(); - if (Matchers.size() == 1) { - OwningPtr<DynTypedMatcher> Bound(Matchers[0]->tryBind(BindID)); +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 *Bound; + return VariantMatcher::SingleMatcher(*Bound); } } Error->addError(NameRange, Error->ET_RegistryNotBindable); - return MatcherList(); + return VariantMatcher(); } } // namespace dynamic |