<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div>I will bow out here and leave it to those wiser and more experienced, but first I’ll try to address your points as best I can.</div><div><br class=""></div><div>This is your previous response which describes your goals best:</div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div><p style="font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; font-size: 13.4399995803833px;" class="">... I want to make clang-query tell the user what matchers they can use with the nodes in the binding list.</p></div><div><p style="font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; font-size: 13.4399995803833px;" class="">For example, if I write</p></div><div><p style="font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; font-size: 13.4399995803833px;" class=""> returnStmt()</p></div><div><p style="font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; font-size: 13.4399995803833px;" class="">in clang-query it should tell me that I can write </p></div><div><p style="font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; font-size: 13.4399995803833px;" class=""> hasReturnValue(integerLiteral())</p></div><div><p style="font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; font-size: 13.4399995803833px;" class="">inside the expr():</p></div><div><p style="font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; font-size: 13.4399995803833px;" class=""> <a class="moz-txt-link-freetext" href="http://ce.steveire.com/z/9EF8x0" target="_top" rel="nofollow" link="external" style="font-size: 1em; color: rgb(85, 26, 139);">http://ce.steveire.com/z/9EF8x0</a></p></div><div><p style="font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; font-size: 13.4399995803833px;" class="">That's how I as a newcomer quickly discover hasReturnValue() and integerLiteral().</p></div><div><p style="font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; font-size: 13.4399995803833px;" class="">You have no idea how overwhelming </p></div><div><p style="font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; font-size: 13.4399995803833px;" class=""> <a class="moz-txt-link-freetext" href="http://clang.llvm.org/docs/LibASTMatchersReference.html" target="_top" rel="nofollow" link="external" style="font-size: 1em; color: rgb(85, 26, 139);">http://clang.llvm.org/docs/LibASTMatchersReference.html</a></p></div><div><p style="font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; font-size: 13.4399995803833px;" class="">is to someone who has zero familiarity with the clang AST.</p></div><div><p style="font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; font-size: 13.4399995803833px;" class="">But the above link is interactive and it aids *discovery* which is what my talk was about and which is what I'm trying to make easier with AST Matchers. The above suggested clang-query feature (not upstream yet) tells me at every step which matchers I can use in the context of what I am trying to achieve.</p></div><div><p style="font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; font-size: 13.4399995803833px;" class="">However, if all of the implicit nodes should also appear in that output, and if in</p></div><div><p style="font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; font-size: 13.4399995803833px;" class="">`returnStmt(hasReturnValue(expr().bind("theReturnVal")))`</p></div><div><p style="font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; font-size: 13.4399995803833px;" class="">the expr() should match the exprWithCleanups(), then I don't know how to make that feature work. If the expr() is the exprWithCleanups() then the tool definitely shouldn't tell the user they can write integerLiteral() there. </p></div></blockquote>Why not?  Why can’t it suggest both?  Or why can’t you just manually filter out the implicit matcher possibilities when desired — see below.<font face="Verdana, Geneva, Helvetica, Arial, sans-serif" size="2" class=""><br class=""></font><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div><p style="font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; font-size: 13.4399995803833px;" class="">The output for implicit nodes would add lots of noise and would have to be neutral in terms of what it recommends.</p></div></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div><p style="font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; font-size: 13.4399995803833px;" class="">The entire point of what I'm trying to do is not present the user with exprWithCleanups() and let them achieve their goals without it. I don't know if that's possible with the ideas floating around at the moment about making AST Matchers present all of the implicit nodes.</p></div></blockquote><div>I disagree that just because implicit nodes add noise, we must prevent them from matching at all — you’re taking a way a huge amount of the potential additional usefulness of this feature by insisting upon that, unless I misunderstand you.</div><div><br class=""></div><div>To tell the users what they can write in place of an expr(), you could just loop over the implicit stack of nodes, what I’m calling the "salt", via the desalt() method I proposed:</div><div><br class=""></div><div>```</div><div>Expr *E = theReturnVal; </div><div>OS << "Possible matchers:\n"</div><div>while (E->isImplicit()) {</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>if (shouldDisplayImplicitMatcherPossibilities)</div><div><span class="Apple-tab-span" style="white-space:pre">               </span>OS << "|-(implicit) " << getExprMatcherName(E->getKind()) << "()\n"; //e.g. "exprWithCleanups()"</div><div><span class="Apple-tab-span" style="white-space:pre">  </span>E = E->desalt();</div><div>}</div><div>OS << "`-" << getExprMatcherName(E->getKind()) << "()"; // e.g. "integerLiteral()"</div><div>```</div><div><br class=""></div><div>Easy to omit the stuff you don’t want users to see as you wish.  Not sure why we have to totally prevent implicit nodes from even being matchable at all in this mode just to make that work -- misses a big opportunity to make this useful for experts as well; that is why I describe it as a half measure.</div><div><br class=""></div><div>FWIW, for Types and TypeLocs, I believe the solution is what I suggested for Stmts, since a getAs<T>() is already in place, and there is no semantic loss from using it, so hard to argue against letting the user get or match a RecordType from an ElaboratedType etc.</div><div><br class=""></div><div>Ultimately Stephen, you put in the work, and are entitled to an up or down vote — that’s fair.  Thank you for that work, and good luck to you and others,</div><div><br class=""></div><div>Dave</div><div><br class=""></div><div><br class=""></div><div><br class=""><blockquote type="cite" class=""><div class=""><br class=""></div><br class="Apple-interchange-newline"><div class="">
  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" class="">
  
  <div bgcolor="#FFFFFF" text="#000000" class=""><p class=""><br class="">
    </p>
    <div class="moz-cite-prefix">On 30/06/2020 00:22, David Rector
      wrote:<br class="">
    </div>
    <blockquote type="cite" cite="mid:99ADF8EF-E35F-4708-B0EA-7F31888E8DC1@gmail.com" class="">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" class="">
      <div style="margin: 0px; font-stretch: normal; font-size: 10px;
        line-height: normal; font-family: Courier;" class="">Bottom
        line: you’ve raised a great but subtle point, doggedly pursued
        it, but now, let’s just get rid of the half measures — let’s go
        all out with a solution that is easy and lifts all boats.</div>
    </blockquote><p class=""><br class="">
    </p><p class="">I don't agree that it's a half-measure if we don't go with your
      proposal. I deliberately didn't pursue your proposal long ago. <br class="">
    </p><p class="">I don't think you pointed out anything in your proposal regarding
      the clang-query feature.<br class="">
    </p><p class="">I agree that typeloc matching can also be improved. I've focussed
      on Exprs so far.</p><p class="">I think it would be great to conclude this thread with either <br class="">
    </p><p class="">1) at least a reversal of the default (perhaps so that you can
      pursue your design) or <br class="">
    </p><p class="">2) intention to proceed in the way things are already going with
      my design.<br class="">
    </p><p class="">I don't mind which we do. <br class="">
    </p><p class="">I don't want to be left with the blame of having my design
      half-implemented though :). There are bugs that I can not fix,
      partly because this is not concluded. <br class="">
    </p><p class="">If I can't move forward, then reversal is the only way (to give
      others the space to validate their designs) and I'd like to do
      that soon, so that this thread is not an open item for me (or
      anyone else) to deal with.<br class="">
    </p><p class="">Thanks,</p><p class="">Stephen.<br class="">
    </p><p class=""><br class="">
    </p>
  </div>

</div></blockquote></div><br class=""></body></html>