Thanks for the report. Will send a fix shortly. _Sam
On Wed, Apr 23, 2014 at 11:45 AM, Aaron Ballman <[email protected]>wrote: > On Wed, Apr 23, 2014 at 10:04 AM, Samuel Benzaquen <[email protected]> > wrote: > > Author: sbenza > > Date: Wed Apr 23 09:04:52 2014 > > New Revision: 206984 > > > > URL: http://llvm.org/viewvc/llvm-project?rev=206984&view=rev > > Log: > > Add new 'let' command to bind arbitrary values into constants. > > > > Summary: > > Add new 'let' command to bind arbitrary values into constants. > > These constants can then be used in the matcher expressions. > > > > Reviewers: pcc > > > > CC: cfe-commits > > > > Differential Revision: http://reviews.llvm.org/D3383 > > > > Modified: > > clang-tools-extra/trunk/clang-query/Query.cpp > > clang-tools-extra/trunk/clang-query/Query.h > > clang-tools-extra/trunk/clang-query/QueryParser.cpp > > clang-tools-extra/trunk/clang-query/QueryParser.h > > clang-tools-extra/trunk/clang-query/QuerySession.h > > clang-tools-extra/trunk/clang-query/tool/ClangQuery.cpp > > clang-tools-extra/trunk/unittests/clang-query/QueryEngineTest.cpp > > clang-tools-extra/trunk/unittests/clang-query/QueryParserTest.cpp > > > > Modified: clang-tools-extra/trunk/clang-query/Query.cpp > > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-query/Query.cpp?rev=206984&r1=206983&r2=206984&view=diff > > > ============================================================================== > > --- clang-tools-extra/trunk/clang-query/Query.cpp (original) > > +++ clang-tools-extra/trunk/clang-query/Query.cpp Wed Apr 23 09:04:52 > 2014 > > @@ -54,7 +54,7 @@ struct CollectBoundNodes : MatchFinder:: > > } > > }; > > > > -} > > +} // namespace > > > > bool MatchQuery::run(llvm::raw_ostream &OS, QuerySession &QS) const { > > unsigned MatchCount = 0; > > @@ -124,6 +124,15 @@ bool MatchQuery::run(llvm::raw_ostream & > > return true; > > } > > > > +bool LetQuery::run(llvm::raw_ostream &OS, QuerySession &QS) const { > > + if (Value) { > > + QS.NamedValues[Name] = Value; > > + } else { > > + QS.NamedValues.erase(Name); > > + } > > + return true; > > +} > > + > > #ifndef _MSC_VER > > const QueryKind SetQueryKind<bool>::value; > > const QueryKind SetQueryKind<OutputKind>::value; > > > > Modified: clang-tools-extra/trunk/clang-query/Query.h > > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-query/Query.h?rev=206984&r1=206983&r2=206984&view=diff > > > ============================================================================== > > --- clang-tools-extra/trunk/clang-query/Query.h (original) > > +++ clang-tools-extra/trunk/clang-query/Query.h Wed Apr 23 09:04:52 2014 > > @@ -28,9 +28,10 @@ enum QueryKind { > > QK_Invalid, > > QK_NoOp, > > QK_Help, > > + QK_Let, > > QK_Match, > > QK_SetBool, > > - QK_SetOutputKind > > + QK_SetOutputKind, > > }; > > > > class QuerySession; > > @@ -86,6 +87,17 @@ struct MatchQuery : Query { > > static bool classof(const Query *Q) { return Q->Kind == QK_Match; } > > }; > > > > +struct LetQuery : Query { > > + LetQuery(StringRef Name, const ast_matchers::dynamic::VariantValue > &Value) > > + : Query(QK_Let), Name(Name), Value(Value) {} > > + bool run(llvm::raw_ostream &OS, QuerySession &QS) const override; > > + > > + std::string Name; > > + ast_matchers::dynamic::VariantValue Value; > > + > > + static bool classof(const Query *Q) { return Q->Kind == QK_Let; } > > +}; > > + > > template <typename T> struct SetQueryKind {}; > > > > template <> struct SetQueryKind<bool> { > > > > Modified: clang-tools-extra/trunk/clang-query/QueryParser.cpp > > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-query/QueryParser.cpp?rev=206984&r1=206983&r2=206984&view=diff > > > ============================================================================== > > --- clang-tools-extra/trunk/clang-query/QueryParser.cpp (original) > > +++ clang-tools-extra/trunk/clang-query/QueryParser.cpp Wed Apr 23 > 09:04:52 2014 > > @@ -132,12 +132,16 @@ QueryRef QueryParser::endQuery(QueryRef > > return Q; > > } > > > > +namespace { > > + > > enum ParsedQueryKind { > > PQK_Invalid, > > PQK_NoOp, > > PQK_Help, > > + PQK_Let, > > PQK_Match, > > - PQK_Set > > + PQK_Set, > > + PQK_Unlet, > > }; > > > > enum ParsedQueryVariable { > > @@ -146,16 +150,52 @@ enum ParsedQueryVariable { > > PQV_BindRoot > > }; > > > > +QueryRef makeInvalidQueryFromDiagnostics(const Diagnostics &Diag) { > > + std::string ErrStr; > > + llvm::raw_string_ostream OS(ErrStr); > > + Diag.printToStreamFull(OS); > > + return new InvalidQuery(OS.str()); > > +} > > + > > +class QuerySessionSema : public Parser::RegistrySema { > > +public: > > + QuerySessionSema(const QuerySession &QS) : QS(QS) {} > > + > > + ast_matchers::dynamic::VariantValue getNamedValue(StringRef Name) > override { > > + return QS.NamedValues.lookup(Name); > > + } > > + > > +private: > > + const QuerySession &QS; > > +}; > > + > > +} // namespace > > + > > +QueryRef QueryParser::completeMatcherExpression() { > > + std::vector<MatcherCompletion> Comps = Parser::completeExpression( > > + StringRef(Begin, End - Begin), CompletionPos - Begin); > > + for (std::vector<MatcherCompletion>::iterator I = Comps.begin(), > > + E = Comps.end(); > > + I != E; ++I) { > > + Completions.push_back(LineEditor::Completion(I->TypedText, > I->MatcherDecl)); > > + } > > + return QueryRef(); > > +} > > + > > QueryRef QueryParser::doParse() { > > StringRef CommandStr; > > ParsedQueryKind QKind = lexOrCompleteWord<ParsedQueryKind>(CommandStr) > > .Case("", PQK_NoOp) > > .Case("help", PQK_Help) > > .Case("m", PQK_Match, > /*IsCompletion=*/false) > > + .Case("let", PQK_Let) > > .Case("match", PQK_Match) > > .Case("set", PQK_Set) > > + .Case("unlet", PQK_Unlet) > > .Default(PQK_Invalid); > > > > + QuerySessionSema S(QS); > > + > > switch (QKind) { > > case PQK_NoOp: > > return new NoOpQuery; > > @@ -163,29 +203,36 @@ QueryRef QueryParser::doParse() { > > case PQK_Help: > > return endQuery(new HelpQuery); > > > > + case PQK_Let: { > > + StringRef Name = lexWord(); > > + > > + if (Name.empty()) > > + return new InvalidQuery("expected variable name"); > > + > > + if (CompletionPos) > > + return completeMatcherExpression(); > > + > > + Diagnostics Diag; > > + ast_matchers::dynamic::VariantValue Value; > > + if (!Parser::parseExpression(StringRef(Begin, End - Begin), &S, > &Value, > > + &Diag)) { > > + return makeInvalidQueryFromDiagnostics(Diag); > > + } > > + > > + return new LetQuery(Name, Value); > > + } > > + > > case PQK_Match: { > > - if (CompletionPos) { > > - std::vector<MatcherCompletion> Comps = Parser::completeExpression( > > - StringRef(Begin, End - Begin), CompletionPos - Begin); > > - for (std::vector<MatcherCompletion>::iterator I = Comps.begin(), > > - E = Comps.end(); > > - I != E; ++I) { > > - Completions.push_back( > > - LineEditor::Completion(I->TypedText, I->MatcherDecl)); > > - } > > - return QueryRef(); > > - } else { > > - Diagnostics Diag; > > - Optional<DynTypedMatcher> Matcher = > > - Parser::parseMatcherExpression(StringRef(Begin, End - Begin), > &Diag); > > - if (!Matcher) { > > - std::string ErrStr; > > - llvm::raw_string_ostream OS(ErrStr); > > - Diag.printToStreamFull(OS); > > - return new InvalidQuery(OS.str()); > > - } > > - return new MatchQuery(*Matcher); > > + if (CompletionPos) > > + return completeMatcherExpression(); > > + > > + Diagnostics Diag; > > + Optional<DynTypedMatcher> Matcher = Parser::parseMatcherExpression( > > + StringRef(Begin, End - Begin), &S, &Diag); > > + if (!Matcher) { > > + return makeInvalidQueryFromDiagnostics(Diag); > > } > > + return new MatchQuery(*Matcher); > > } > > > > case PQK_Set: { > > @@ -214,6 +261,15 @@ QueryRef QueryParser::doParse() { > > return endQuery(Q); > > } > > > > + case PQK_Unlet: { > > + StringRef Name = lexWord(); > > + > > + if (Name.empty()) > > + return new InvalidQuery("expected variable name"); > > + > > + return endQuery(new LetQuery(Name, {})); > > This commit broke the MSVC build bots (because of the {}): > http://bb.pgr.jp/builders/ninja-clang-i686-msc17-R/builds/8179 > > ~Aaron >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
