diff options
author | Samuel Benzaquen <sbenza@google.com> | 2013-06-21 15:51:31 +0000 |
---|---|---|
committer | Samuel Benzaquen <sbenza@google.com> | 2013-06-21 15:51:31 +0000 |
commit | c6f2c9b5665e1547af171dd9a25672a44e9280a4 (patch) | |
tree | 8993afbf11fbbf9f4b16563b2b6178346dda5b26 /clang/lib/ASTMatchers/Dynamic/Parser.cpp | |
parent | 38fa1ff71026374aec2895e61e142a9cdfd32018 (diff) | |
download | bcm5719-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.cpp | 25 |
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 |