diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2013-11-23 01:13:16 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2013-11-23 01:13:16 +0000 |
commit | 00cba4f6dda891c5f3e7fd904a6f6d992e9e0702 (patch) | |
tree | b1203080cee2f2ea18d7300ae01907a36e81528b /clang/lib/ASTMatchers/Dynamic/Parser.cpp | |
parent | 28eace65c09a51e24fb5651ee035e2c6c102da69 (diff) | |
download | bcm5719-llvm-00cba4f6dda891c5f3e7fd904a6f6d992e9e0702.tar.gz bcm5719-llvm-00cba4f6dda891c5f3e7fd904a6f6d992e9e0702.zip |
Split registry matcher resolution into a lookup phase and a construction phase.
The looked-up matchers will be used during code completion.
Differential Revision: http://llvm-reviews.chandlerc.com/D2207
llvm-svn: 195534
Diffstat (limited to 'clang/lib/ASTMatchers/Dynamic/Parser.cpp')
-rw-r--r-- | clang/lib/ASTMatchers/Dynamic/Parser.cpp | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/clang/lib/ASTMatchers/Dynamic/Parser.cpp b/clang/lib/ASTMatchers/Dynamic/Parser.cpp index df9596e9b93..59a75479ef4 100644 --- a/clang/lib/ASTMatchers/Dynamic/Parser.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Parser.cpp @@ -18,6 +18,7 @@ #include "clang/ASTMatchers/Dynamic/Parser.h" #include "clang/ASTMatchers/Dynamic/Registry.h" #include "clang/Basic/CharInfo.h" +#include "llvm/ADT/Optional.h" #include "llvm/ADT/Twine.h" namespace clang { @@ -242,6 +243,9 @@ bool Parser::parseMatcherExpressionImpl(VariantValue *Value) { return false; } + llvm::Optional<MatcherCtor> Ctor = + S->lookupMatcherCtor(NameToken.Text, NameToken.Range, Error); + std::vector<ParserValue> Args; TokenInfo EndToken; while (Tokenizer->nextTokenKind() != TokenInfo::TK_Eof) { @@ -306,13 +310,16 @@ bool Parser::parseMatcherExpressionImpl(VariantValue *Value) { BindID = IDToken.Value.getString(); } + if (!Ctor) + return false; + // Merge the start and end infos. Diagnostics::Context Ctx(Diagnostics::Context::ConstructMatcher, Error, NameToken.Text, NameToken.Range); SourceRange MatcherRange = NameToken.Range; MatcherRange.End = EndToken.Range.End; VariantMatcher Result = S->actOnMatcherExpression( - NameToken.Text, MatcherRange, BindID, Args, Error); + *Ctor, MatcherRange, BindID, Args, Error); if (Result.isNull()) return false; *Value = Result; @@ -358,16 +365,21 @@ Parser::Parser(CodeTokenizer *Tokenizer, Sema *S, class RegistrySema : public Parser::Sema { public: virtual ~RegistrySema() {} - VariantMatcher actOnMatcherExpression(StringRef MatcherName, + llvm::Optional<MatcherCtor> lookupMatcherCtor(StringRef MatcherName, + const SourceRange &NameRange, + Diagnostics *Error) { + return Registry::lookupMatcherCtor(MatcherName, NameRange, Error); + } + VariantMatcher actOnMatcherExpression(MatcherCtor Ctor, const SourceRange &NameRange, StringRef BindID, ArrayRef<ParserValue> Args, Diagnostics *Error) { if (BindID.empty()) { - return Registry::constructMatcher(MatcherName, NameRange, Args, Error); + return Registry::constructMatcher(Ctor, NameRange, Args, Error); } else { - return Registry::constructBoundMatcher(MatcherName, NameRange, BindID, - Args, Error); + return Registry::constructBoundMatcher(Ctor, NameRange, BindID, Args, + Error); } } }; |