summaryrefslogtreecommitdiffstats
path: root/clang/lib/ASTMatchers/Dynamic/Parser.cpp
diff options
context:
space:
mode:
authorSamuel Benzaquen <sbenza@google.com>2013-06-21 15:51:31 +0000
committerSamuel Benzaquen <sbenza@google.com>2013-06-21 15:51:31 +0000
commitc6f2c9b5665e1547af171dd9a25672a44e9280a4 (patch)
tree8993afbf11fbbf9f4b16563b2b6178346dda5b26 /clang/lib/ASTMatchers/Dynamic/Parser.cpp
parent38fa1ff71026374aec2895e61e142a9cdfd32018 (diff)
downloadbcm5719-llvm-c6f2c9b5665e1547af171dd9a25672a44e9280a4.tar.gz
bcm5719-llvm-c6f2c9b5665e1547af171dd9a25672a44e9280a4.zip
Add support for polymorphic matchers. Use runtime type checking to determine the right polymorphic overload to use.
llvm-svn: 184558
Diffstat (limited to 'clang/lib/ASTMatchers/Dynamic/Parser.cpp')
-rw-r--r--clang/lib/ASTMatchers/Dynamic/Parser.cpp25
1 files changed, 15 insertions, 10 deletions
diff --git a/clang/lib/ASTMatchers/Dynamic/Parser.cpp b/clang/lib/ASTMatchers/Dynamic/Parser.cpp
index eff50f4061c..fc09a30ddd9 100644
--- a/clang/lib/ASTMatchers/Dynamic/Parser.cpp
+++ b/clang/lib/ASTMatchers/Dynamic/Parser.cpp
@@ -315,15 +315,15 @@ bool Parser::parseMatcherExpressionImpl(VariantValue *Value) {
// Merge the start and end infos.
SourceRange MatcherRange = NameToken.Range;
MatcherRange.End = EndToken.Range.End;
- DynTypedMatcher *Result = S->actOnMatcherExpression(
+ MatcherList Result = S->actOnMatcherExpression(
NameToken.Text, MatcherRange, BindID, Args, Error);
- if (Result == NULL) {
+ if (Result.empty()) {
Error->pushErrorFrame(NameToken.Range, Error->ET_ParserMatcherFailure)
<< NameToken.Text;
return false;
}
- Value->takeMatcher(Result);
+ *Value = Result;
return true;
}
@@ -367,11 +367,11 @@ Parser::Parser(CodeTokenizer *Tokenizer, Sema *S,
class RegistrySema : public Parser::Sema {
public:
virtual ~RegistrySema() {}
- DynTypedMatcher *actOnMatcherExpression(StringRef MatcherName,
- const SourceRange &NameRange,
- StringRef BindID,
- ArrayRef<ParserValue> Args,
- Diagnostics *Error) {
+ MatcherList actOnMatcherExpression(StringRef MatcherName,
+ const SourceRange &NameRange,
+ StringRef BindID,
+ ArrayRef<ParserValue> Args,
+ Diagnostics *Error) {
if (BindID.empty()) {
return Registry::constructMatcher(MatcherName, NameRange, Args, Error);
} else {
@@ -411,11 +411,16 @@ DynTypedMatcher *Parser::parseMatcherExpression(StringRef Code,
VariantValue Value;
if (!parseExpression(Code, S, &Value, Error))
return NULL;
- if (!Value.isMatcher()) {
+ if (!Value.isMatchers()) {
Error->pushErrorFrame(SourceRange(), Error->ET_ParserNotAMatcher);
return NULL;
}
- return Value.getMatcher().clone();
+ if (Value.getMatchers().matchers().size() != 1) {
+ Error->pushErrorFrame(SourceRange(), Error->ET_ParserOverloadedType)
+ << Value.getTypeAsString();
+ return NULL;
+ }
+ return Value.getMatchers().matchers()[0]->clone();
}
} // namespace dynamic
OpenPOWER on IntegriCloud