summaryrefslogtreecommitdiffstats
path: root/clang/lib/ASTMatchers/Dynamic/Parser.cpp
diff options
context:
space:
mode:
authorSamuel Benzaquen <sbenza@google.com>2014-04-02 13:11:45 +0000
committerSamuel Benzaquen <sbenza@google.com>2014-04-02 13:11:45 +0000
commit2019cea863edd12df1a95ba1cddefcdc91b3c576 (patch)
treef18ae3b792b8406f2aed3ef4773516bdf17726af /clang/lib/ASTMatchers/Dynamic/Parser.cpp
parent11ff0a26a48af41db54e058cae44ca85fb7551bc (diff)
downloadbcm5719-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.cpp48
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) {
OpenPOWER on IntegriCloud