diff options
| author | Samuel Benzaquen <sbenza@google.com> | 2014-04-02 13:11:45 +0000 |
|---|---|---|
| committer | Samuel Benzaquen <sbenza@google.com> | 2014-04-02 13:11:45 +0000 |
| commit | 2019cea863edd12df1a95ba1cddefcdc91b3c576 (patch) | |
| tree | f18ae3b792b8406f2aed3ef4773516bdf17726af /clang/lib/ASTMatchers/Dynamic/Parser.cpp | |
| parent | 11ff0a26a48af41db54e058cae44ca85fb7551bc (diff) | |
| download | bcm5719-llvm-2019cea863edd12df1a95ba1cddefcdc91b3c576.tar.gz bcm5719-llvm-2019cea863edd12df1a95ba1cddefcdc91b3c576.zip | |
Add support for named values in the parser.
Summary:
Add support for named values in the parser.
This allows injection of arbitrary constants using a custom Sema object.
Completions are not supported right now.
Will be used by clang_query to support the 'let' command.
Usage example:
clang_query> let unique_ptr recordDecl(hasName("unique_ptr"))
clang_query> match varDecl(hasType(unique_ptr))
Reviewers: klimek, pcc
CC: cfe-commits, klimek
Differential Revision: http://llvm-reviews.chandlerc.com/D3229
llvm-svn: 205419
Diffstat (limited to 'clang/lib/ASTMatchers/Dynamic/Parser.cpp')
| -rw-r--r-- | clang/lib/ASTMatchers/Dynamic/Parser.cpp | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/clang/lib/ASTMatchers/Dynamic/Parser.cpp b/clang/lib/ASTMatchers/Dynamic/Parser.cpp index 24ffdcda51b..bc6f73ca452 100644 --- a/clang/lib/ASTMatchers/Dynamic/Parser.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Parser.cpp @@ -424,8 +424,18 @@ bool Parser::parseExpressionImpl(VariantValue *Value) { *Value = Tokenizer->consumeNextToken().Value; return true; - case TokenInfo::TK_Ident: + case TokenInfo::TK_Ident: { + // Identifier could be a name known by Sema as a named value. + const VariantValue NamedValue = + S->getNamedValue(Tokenizer->peekNextToken().Text); + if (!NamedValue.isNothing()) { + Tokenizer->consumeNextToken(); // Actually consume it. + *Value = NamedValue; + return true; + } + // Fallback to full matcher parsing. return parseMatcherExpressionImpl(Value); + } case TokenInfo::TK_CodeCompletion: addExpressionCompletions(); @@ -457,27 +467,23 @@ Parser::Parser(CodeTokenizer *Tokenizer, Sema *S, Diagnostics *Error) : Tokenizer(Tokenizer), S(S), Error(Error) {} -class RegistrySema : public Parser::Sema { -public: - virtual ~RegistrySema() {} - 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(Ctor, NameRange, Args, Error); - } else { - return Registry::constructBoundMatcher(Ctor, NameRange, BindID, Args, - Error); - } +Parser::RegistrySema::~RegistrySema() {} + +llvm::Optional<MatcherCtor> Parser::RegistrySema::lookupMatcherCtor( + StringRef MatcherName, const SourceRange &NameRange, Diagnostics *Error) { + return Registry::lookupMatcherCtor(MatcherName, NameRange, Error); +} + +VariantMatcher Parser::RegistrySema::actOnMatcherExpression( + MatcherCtor Ctor, const SourceRange &NameRange, StringRef BindID, + ArrayRef<ParserValue> Args, Diagnostics *Error) { + if (BindID.empty()) { + return Registry::constructMatcher(Ctor, NameRange, Args, Error); + } else { + return Registry::constructBoundMatcher(Ctor, NameRange, BindID, Args, + Error); } -}; +} bool Parser::parseExpression(StringRef Code, VariantValue *Value, Diagnostics *Error) { |

