[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