<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>Hi Yitzhak,</p>
    <p>you had positive reactions from Manuel, so I think that the
      proposed API is in principle interesting.<br>
      The API should go into libTooling? And I assume it will be
      parallel to what we have already?</p>
    <p>Having patches on phabricator is probably a good idea. But I am
      not an authorative figure in the libTooling space,<br>
      in the end the code-owner (manuel?!) has the power to deny entry.
      IMHO its a good direction.</p>
    <p>Best, Jonas<br>
    </p>
    <div class="moz-cite-prefix">Am 13.02.19 um 17:18 schrieb Yitzhak
      Mandelbaum:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAKTLd7wXu8=wOMVR4k6_AXRbUdTWqTtDo6GGNPTufmD_+ru00A@mail.gmail.com">
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      <div dir="ltr">
        <div dir="ltr">
          <div dir="ltr">
            <div dir="ltr">
              <div dir="ltr">
                <div class="gmail_default"
                  style="font-family:arial,helvetica,sans-serif">Jonas,</div>
                <div class="gmail_default"
                  style="font-family:arial,helvetica,sans-serif"><br>
                </div>
                <div class="gmail_default"
                  style="font-family:arial,helvetica,sans-serif">I've
                  updated the revision  (<a
                    href="https://reviews.llvm.org/D56933"
                    target="_blank" moz-do-not-send="true">https://reviews.llvm.org/D56933</a>)
                  with two example clang tidies ported to Transformer. 
                  These are not ideal checks, because they are very
                  particular in their handling of whitespace, but I
                  think they're good demonstrations both of Transformers
                  strengths and its (current) limitations. 
                  Additionally, below are to versions of simple example
                  that isn't a tidy check yet.  Please let me know what
                  you think. </div>
                <div class="gmail_default"
                  style="font-family:arial,helvetica,sans-serif">
                  <div class="gmail_default"><br>
                  </div>
                  <div class="gmail_default">Also, what are the next
                    steps towards considering these libraries for
                    acceptance to clang?  Should I put together a
                    diff(s) for review, or is that still premature?</div>
                </div>
                <div class="gmail_default"
                  style="font-family:arial,helvetica,sans-serif"><br>
                </div>
                <div class="gmail_default"
                  style="font-family:arial,helvetica,sans-serif"><br>
                </div>
                <div class="gmail_default">
                  <div class="gmail_default"><font face="monospace,
                      monospace">  // Simplify
                      `e.emplace_back(std::make_pair(e1, e2))` to
                      `e.emplace_back(e1, e2)`.</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">  // We elide the extra matching
                      required to check that `e` is in a container like
                      std::vector and that </font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">  // the element type is the same as
                      that constructed by the call to make_pair. </font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace"><br>
                    </font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">  </font><span
                      style="font-family:monospace,monospace">using
                      extra_matchers::isFunctionNamed;</span></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">  using
                      extra_matchers::isMethodNamed;  </font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace"><br>
                    </font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">  // Version 1</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">  // This version has three
                      metavariables -- one for the container and two for
                      the</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">  // arguments to `make_pair`.</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">  ExprId Call, Arg0, Arg1;</font></div>
                  <div class="gmail_default"><span
                      style="font-family:monospace,monospace">  auto
                      MakePairCall =</span><br>
                  </div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">     
                      callExpr(callee(isFunctionNamed("::std::make_pair")),</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">               argumentCountIs(2),
                      hasArgument(0, Arg0.bind()),</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">               hasArgument(1,
                      Arg1.bind()));</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">  auto Rule1 = </font><span
                      style="font-family:monospace,monospace">RewriteRule()</span></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">          .matching(cxxMemberCallExpr(</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">             
                      callee(isMethodNamed("emplace_back")),</font></div>
                  <div class="gmail_default"><span
                      style="font-family:monospace,monospace">         
                          argumentCountIs(1), hasArgument(0, bind(Call,
                      make_pair_call))))</span><br>
                  </div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">          .change(Call)</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">          .replaceWith(Arg0, ",",
                      Arg1));</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace"><br>
                    </font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">  // Version 2</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">  // In this version, we extract the
                      source code of the arguments using the `arg()`</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">  // stencil operator on the node bound
                      to `Call`.</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">  auto Rule2 =</font><span
                      style="font-family:monospace,monospace"> RewriteRule()</span></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">          .matching(cxxMemberCallExpr(</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">             
                      callee(isMethodNamed("emplace_back")),
                      argumentCountIs(1),</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">              hasArgument(0, bind(Call,
                      callExpr(callee(isFunctionNamed(</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">                                       
                          "::std::make_tuple")))))))</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">          .change(Call)</font></div>
                  <div class="gmail_default"><font face="monospace,
                      monospace">         
                      .replaceWith(tooling::stencil_generators::args(Call)));</font></div>
                </div>
                <div class="gmail_default"
                  style="font-family:arial,helvetica,sans-serif"><br>
                </div>
                <div class="gmail_default"
                  style="font-family:arial,helvetica,sans-serif">Thanks!</div>
                <div class="gmail_default"
                  style="font-family:arial,helvetica,sans-serif">Yitzhak</div>
              </div>
            </div>
          </div>
        </div>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">On Fri, Jan 18, 2019 at 4:43
          PM Yitzhak Mandelbaum <<a href="mailto:yitzhakm@google.com"
            moz-do-not-send="true">yitzhakm@google.com</a>> wrote:<br>
        </div>
        <blockquote class="gmail_quote" style="margin:0px 0px 0px
          0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
          <div dir="ltr">
            <div class="gmail_default"
              style="font-family:arial,helvetica,sans-serif">
              <div dir="ltr"
                style="font-family:Arial,Helvetica,sans-serif">
                <div dir="ltr">
                  <div class="gmail_default"
                    style="font-family:arial,helvetica,sans-serif">Thanks!
                    I've added it to a revision (<a
                      href="https://reviews.llvm.org/D56933"
                      target="_blank" moz-do-not-send="true">https://reviews.llvm.org/D56933</a>),
                    but I wasn't sure what lists to subscribe it to (if
                    any) given that I don't intend it yet for proper
                    review.</div>
                  <div class="gmail_default"
                    style="font-family:arial,helvetica,sans-serif"><br>
                  </div>
                  <div class="gmail_default"
                    style="font-family:arial,helvetica,sans-serif">I
                    haven't ported check, but do have a demo check
                    (using Transformer as a whole) that I can add. I'll
                    ping the thread when that's done.</div>
                </div>
              </div>
            </div>
          </div>
          <br>
          <div class="gmail_quote">
            <div dir="ltr">On Fri, Jan 18, 2019 at 3:19 PM Jonas Toth
              <<a href="mailto:development@jonas-toth.eu"
                target="_blank" moz-do-not-send="true">development@jonas-toth.eu</a>>
              wrote:<br>
            </div>
            <blockquote class="gmail_quote" style="margin:0px 0px 0px
              0.8ex;border-left:1px solid
              rgb(204,204,204);padding-left:1ex">
              <div bgcolor="#FFFFFF">
                <p>Hi Yitzhak,</p>
                <p>your code looks very interesting.</p>
                <p>It might be a good fit for uitlity that
                  clang-refactor can use, too. (not sure about the state
                  of clang-refactor though)<br>
                  I would be interested how your framework integrates
                  into clang-tidy, do you have a reference check that
                  you ported to your approach (i have seen some
                  references to clang-tidy code)?</p>
                <p>P.S. It might be a good idea to make your diff a full
                  revision, as right now the discussion feature can not
                  be used.</p>
                <p>Best, Jonas<br>
                </p>
                <div
class="gmail-m_7143118796014398919gmail-m_5125166849334550517moz-cite-prefix">Am
                  18.01.19 um 19:29 schrieb Yitzhak Mandelbaum via
                  cfe-dev:<br>
                </div>
                <blockquote type="cite">
                  <div dir="ltr">
                    <div dir="ltr">
                      <div class="gmail_default"
                        style="font-family:arial,helvetica,sans-serif">After
                        some delay, I've created a diff to accompany the
                        doc.  In particular, here's the Stencil library,
                        which provides for generating code in a
                        format-string style:</div>
                      <div class="gmail_default"
                        style="font-family:arial,helvetica,sans-serif"><br>
                      </div>
                      <div class="gmail_default"><font face="arial,
                          helvetica, sans-serif"><a
                            href="https://reviews.llvm.org/differential/diff/182553/"
                            target="_blank" moz-do-not-send="true">https://reviews.llvm.org/differential/diff/182553/</a></font><br>
                      </div>
                      <div class="gmail_default"><font face="arial,
                          helvetica, sans-serif"><br>
                        </font></div>
                      <div class="gmail_default"><font face="arial,
                          helvetica, sans-serif">Please see the tests
                          for various examples and the doc for more
                          explanation.</font></div>
                    </div>
                  </div>
                  <br>
                  <div class="gmail_quote">
                    <div dir="ltr">On Fri, Nov 16, 2018 at 10:22 AM
                      Yitzhak Mandelbaum <<a
                        href="mailto:yitzhakm@google.com"
                        target="_blank" moz-do-not-send="true">yitzhakm@google.com</a>>
                      wrote:<br>
                    </div>
                    <blockquote class="gmail_quote" style="margin:0px
                      0px 0px 0.8ex;border-left:1px solid
                      rgb(204,204,204);padding-left:1ex">
                      <div dir="ltr">
                        <div dir="ltr">
                          <div dir="ltr">
                            <div class="gmail_default"><font
                                face="arial, helvetica, sans-serif">Hi
                                all,</font></div>
                            <div class="gmail_default"><font
                                face="arial, helvetica, sans-serif"><br>
                              </font></div>
                            <div class="gmail_default"><font
                                face="arial, helvetica, sans-serif">I
                                have a proposal for a framework that
                                makes it easier to write source to
                                source transformations with the
                                clang::Tooling libraries, including
                                clang-tidy checks.</font></div>
                            <div class="gmail_default"><font
                                face="arial, helvetica, sans-serif"><br>
                              </font></div>
                            <div class="gmail_default"><font
                                face="arial, helvetica, sans-serif">The
                                full proposal is in this doc:</font></div>
                            <div class="gmail_default"><font
                                face="arial, helvetica, sans-serif"><br>
                              </font></div>
                            <div class="gmail_default"><font
                                face="arial, helvetica, sans-serif"><a
href="https://docs.google.com/document/d/1ppw0RhjwsrbBcHYhI85pe6ISDbA6r5d00ot3N8cQWeQ/edit?usp=sharing"
                                  target="_blank" moz-do-not-send="true">https://docs.google.com/document/d/1ppw0RhjwsrbBcHYhI85pe6ISDbA6r5d00ot3N8cQWeQ/edit?usp=sharing</a></font><br>
                            </div>
                            <div class="gmail_default"><font
                                face="arial, helvetica, sans-serif"><br>
                              </font></div>
                            <div class="gmail_default"><font
                                face="arial, helvetica, sans-serif">From
                                the doc:</font></div>
                            <div class="gmail_default"><font
                                face="arial, helvetica, sans-serif">Transformer
                                is a framework that aims to simplify
                                development of clang-based
                                source-to-source transformations.  It
                                focuses on the particular class of
                                transformations that act only locally —
                                that is, use local information about the
                                code and make local changes  (like a
                                syntax-aware “find-and-replace”); and at
                                scale — that is, will be carried out on
                                many source files.  The target audience
                                is users that are comfortable with, or
                                willing to become comfortable with, the
                                clang AST matchers library.<br>
                              </font></div>
                            <div class="gmail_default"><font
                                face="arial, helvetica, sans-serif"><br>
                              </font></div>
                            <div class="gmail_default"><font
                                face="arial, helvetica, sans-serif">I
                                have a working prototype of this library
                                which I've used on small examples inside
                                Google.  I plan to put together a patch
                                for reference next week, although the
                                doc should stand on its own.</font></div>
                            <div class="gmail_default"><font
                                face="arial, helvetica, sans-serif"><br>
                              </font></div>
                            <div class="gmail_default"><font
                                face="arial, helvetica, sans-serif">Thanks!</font></div>
                            <div class="gmail_default"><font
                                face="arial, helvetica, sans-serif">Yitzhak
                                Mandelbaum</font></div>
                          </div>
                        </div>
                      </div>
                    </blockquote>
                  </div>
                  <br>
                  <fieldset
class="gmail-m_7143118796014398919gmail-m_5125166849334550517mimeAttachmentHeader"></fieldset>
                  <pre class="gmail-m_7143118796014398919gmail-m_5125166849334550517moz-quote-pre">_______________________________________________
cfe-dev mailing list
<a class="gmail-m_7143118796014398919gmail-m_5125166849334550517moz-txt-link-abbreviated" href="mailto:cfe-dev@lists.llvm.org" target="_blank" moz-do-not-send="true">cfe-dev@lists.llvm.org</a>
<a class="gmail-m_7143118796014398919gmail-m_5125166849334550517moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" target="_blank" moz-do-not-send="true">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a>
</pre>
                </blockquote>
              </div>
            </blockquote>
          </div>
        </blockquote>
      </div>
    </blockquote>
  </body>
</html>