summaryrefslogtreecommitdiffstats
path: root/clang/lib/ASTMatchers/Dynamic/Registry.cpp
diff options
context:
space:
mode:
authorSamuel Benzaquen <sbenza@google.com>2013-08-13 14:54:51 +0000
committerSamuel Benzaquen <sbenza@google.com>2013-08-13 14:54:51 +0000
commit0239b691674cdcfdba1e4f821cd7e31177032fac (patch)
tree9ffbc0255bb9c4d7b05d78212cc5a37919589523 /clang/lib/ASTMatchers/Dynamic/Registry.cpp
parent68443b0a1487c6f7e583de387fb76a778f4ececf (diff)
downloadbcm5719-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.cpp52
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
OpenPOWER on IntegriCloud