<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">Hi,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks for your help! I was able to write the matcher with nested “on” statements.
<br>
<br>
However, I am having trouble correctly retrieving the argument “foo” in SCB. Right now, I am retrieving it like:<br>
<br>
std::string Buffer;<br>
llvm::raw_string_ostream Stream(Buffer);<br>
<br>
<o:p></o:p></p>
<p class="MsoNormal">callArg->getArg(0)->prettyPrint(Stream, nullptr, result.Context->getPrintingPolicy())<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">and printing Stream.str() gives me “this->foo”, whereas I want to retrieve “foo” by itself. I have tried using the different Ignore functions (IgnoreCasts, IgnoreImplicit, etc), but none of them have worked.
<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Ultimately, I want to write a replacement like:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Replacements.emplace(source_manager, <br>
    CharSourceRange::getCharRange(call->getExprLoc(), <br>
    Lexer::getLocForEndOfToken(call->getExprLoc(), 0, source_manager, context.getLangOpts()),<br>
   “via(“ + argument + “).get”);<br>
<br>
where argument is “foo”. Furthermore, using prettyPrint function for this seems kind of hacky as well, what is the proper way to retrieve the argument name?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">David Lai<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:12.0pt;color:black">From: </span></b><span style="font-size:12.0pt;color:black">Manuel Klimek <klimek@google.com><br>
<b>Date: </b>Wednesday, March 28, 2018 at 1:56 AM<br>
<b>To: </b>David Lai <dlai@fb.com><br>
<b>Cc: </b>"cfe-dev@lists.llvm.org" <cfe-dev@lists.llvm.org><br>
<b>Subject: </b>Re: [cfe-dev] Clang AST Matcher - Matching nested function and method calls<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<div>
<p class="MsoNormal"><a name="_MailOriginalBody">On Wed, Mar 28, 2018 at 7:32 AM David Lai via cfe-dev <</a><a href="mailto:cfe-dev@lists.llvm.org"><span style="mso-bookmark:_MailOriginalBody">cfe-dev@lists.llvm.org</span><span style="mso-bookmark:_MailOriginalBody"></span></a><span style="mso-bookmark:_MailOriginalBody">>
 wrote:<o:p></o:p></span></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="mso-bookmark:_MailOriginalBody">Hi,<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="mso-bookmark:_MailOriginalBody"> <o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;margin-bottom:12.0pt"><span style="mso-bookmark:_MailOriginalBody">I am quite new to clang AST matchers and wondering if you could help me with a match. I am writing a matcher to generate replacements.
<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;margin-bottom:12.0pt"><span style="mso-bookmark:_MailOriginalBody">Consider this,<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="mso-bookmark:_MailOriginalBody">SomeClientBuilder SCB(Foo& f) {<br>
  return SomeClientBuilder.setFoo(f);<br>
}<br>
<br>
class SomeClientBuilder {<br>
  Fruit apple(…);<br>
  Fruit pear(…);<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="mso-bookmark:_MailOriginalBody">};<br>
<br>
I would like to change <br>
    “return SCB(foo).apple(req).get(…)”<br>
to<br>
    “return SCB().pear(req).via(foo).get(…)”<br>
<br>
I would like to create a matcher that:<br>
    - matches SCB so it has 1 argument of type Foo<br>
    - matches method named apple() and is a method in SomeClientBuilder<br>
<br>
After many attempts, I came up with two matchers.<br>
<br>
1. cxxMemberCallExpr(callee(cxxMethodDecl(hasName("apple"), ofClass(cxxRecordDecl(hasName("SomeClientBuilder "))))))<br>
    - this matcher does not restrict SCB to have 1 argument of type Foo<o:p></o:p></span></p>
</div>
</div>
</blockquote>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody">You should be able to compine this with the "on" matcher for cxxMemberCallExpr.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody">See </span><a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__clang.llvm.org_docs_LibASTMatchersReference.html&d=DwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=RTaV7ZjEllVE-LoIBoiXow&m=4ARLvd38CywT-pqlZDgtWgtvsxJ8t_6QGD757MYfADA&s=-qaJ9Lnz5kkDFR7yAS7zO-y6K6-v0rie9r-yZD3dr20&e="><span style="mso-bookmark:_MailOriginalBody">http://clang.llvm.org/docs/LibASTMatchersReference.html</span><span style="mso-bookmark:_MailOriginalBody"></span></a><span style="mso-bookmark:_MailOriginalBody"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody">on() takes an expr matcher as argument, with which you can match the nested call expr.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody"> <o:p></o:p></span></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="mso-bookmark:_MailOriginalBody"><br>
2. callExpr(callee(functionDecl(hasName("SCB"))), argumentCountIs(1), hasArgument(0, hasType(cxxRecordDecl(hasName("Foo")))))<br>
    - this matcher does not match the “apple()” methods<br>
<br>
I have tried combining the matchers together with no success. What do you think would be the best way to accomplish what I want to do?<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="mso-bookmark:_MailOriginalBody"> <o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="mso-bookmark:_MailOriginalBody"> <o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="mso-bookmark:_MailOriginalBody">Thanks,<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="mso-bookmark:_MailOriginalBody">David Lai<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="mso-bookmark:_MailOriginalBody"> <o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;margin-bottom:12.0pt"><span style="mso-bookmark:_MailOriginalBody"><o:p> </o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="mso-bookmark:_MailOriginalBody"> <o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginalBody">_______________________________________________<br>
cfe-dev mailing list<br>
</span><a href="mailto:cfe-dev@lists.llvm.org" target="_blank"><span style="mso-bookmark:_MailOriginalBody">cfe-dev@lists.llvm.org</span><span style="mso-bookmark:_MailOriginalBody"></span></a><span style="mso-bookmark:_MailOriginalBody"><br>
</span><a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_cfe-2Ddev&d=DwMFaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=RTaV7ZjEllVE-LoIBoiXow&m=4ARLvd38CywT-pqlZDgtWgtvsxJ8t_6QGD757MYfADA&s=lMNDe1uxwny2yvL6ytGFa_FGihfH0JstZpxwwxauCSM&e=" target="_blank"><span style="mso-bookmark:_MailOriginalBody">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</span><span style="mso-bookmark:_MailOriginalBody"></span></a><span style="mso-bookmark:_MailOriginalBody"><o:p></o:p></span></p>
</blockquote>
</div>
</div>
</div>
</body>
</html>