[clang-tools-extra] r206984 - Add new 'let' command to bind arbitrary values into constants.
Samuel Benzaquen
sbenza at google.com
Wed Apr 23 09:02:32 PDT 2014
Thanks for the report.
Will send a fix shortly.
_Sam
On Wed, Apr 23, 2014 at 11:45 AM, Aaron Ballman <aaron at aaronballman.com>wrote:
> On Wed, Apr 23, 2014 at 10:04 AM, Samuel Benzaquen <sbenza at google.com>
> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140423/eca1ddda/attachment.html>
More information about the cfe-commits
mailing list