<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Wed, Sep 21, 2016 at 8:19 PM Riyaz Puthiyapurayil via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="blue" vlink="purple" class="gmail_msg">
<div class="m_-4570820659090089367WordSection1 gmail_msg">
<p class="MsoNormal gmail_msg">I am new to both clang AST Matchers. From an AST Matcher in a clang tidy check, what is the fastest way to get the enclosing function or method scope (if any) from a matching CallExpr node?<u class="gmail_msg"></u><u class="gmail_msg"></u></p>
<p class="MsoNormal gmail_msg"><u class="gmail_msg"></u> <u class="gmail_msg"></u></p>
<p class="MsoNormal gmail_msg">I tried something like this in clang-query and it seems to work as expected:<u class="gmail_msg"></u><u class="gmail_msg"></u></p>
<p class="MsoNormal gmail_msg"><u class="gmail_msg"></u> <u class="gmail_msg"></u></p>
<div style="border-top:solid #1f497d 1.0pt;border-left:none;border-bottom:solid #1f497d 1.0pt;border-right:none;padding:1.0pt 0in 1.0pt 0in;background:#f2f2f2" class="gmail_msg">
<p class="m_-4570820659090089367CodeBlock gmail_msg" style="background:#f2f2f2">   clang-query> match callExpr(hasAncestor(functionDecl().bind(“contextFuncDef”)).bind(“someFuncCall”)<u class="gmail_msg"></u><u class="gmail_msg"></u></p>
</div>
<p class="MsoNormal gmail_msg"><u class="gmail_msg"></u> <u class="gmail_msg"></u></p>
<p class="MsoNormal gmail_msg">But how does it work internally? Specifically, will it traverse up the AST to bind contextFuncDef every time callExpr is matched? That may be too expensive for my use. Or alternatively, does it save the matching ancestor in contextFuncDef
 as it descends down the AST?</p></div></div></blockquote><div>Both. It memoizes the results of hasAncestor on every level.</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple" class="gmail_msg"><div class="m_-4570820659090089367WordSection1 gmail_msg">
<p class="MsoNormal gmail_msg">Or the more general question would be: are matchers evaluated inside-out or outside-in or in some other way depending on the type of matcher. Is there any documentation outside of source code describing how matchers are implemented?</p></div></div></blockquote><div>The behavior is "as-if" you just run over the AST and match every node. The implementation detail to make this fast is that it uses memoization.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple" class="gmail_msg"><div class="m_-4570820659090089367WordSection1 gmail_msg"><p class="MsoNormal gmail_msg">
<u class="gmail_msg"></u><u class="gmail_msg"></u></p>
<p class="MsoNormal gmail_msg"><u class="gmail_msg"></u> <u class="gmail_msg"></u></p>
<p class="MsoNormal gmail_msg" style="text-align:justify"><i class="gmail_msg"><span style="font-family:"Viner Hand ITC";color:black" class="gmail_msg">-Riyaz<u class="gmail_msg"></u><u class="gmail_msg"></u></span></i></p>
<p class="MsoNormal gmail_msg"><u class="gmail_msg"></u> <u class="gmail_msg"></u></p>
</div>
</div>

_______________________________________________<br class="gmail_msg">
cfe-dev mailing list<br class="gmail_msg">
<a href="mailto:cfe-dev@lists.llvm.org" class="gmail_msg" target="_blank">cfe-dev@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br class="gmail_msg">
</blockquote></div></div>