<html>
<head></head>
<body>
<p><span style="font-size: 12.727272033691406px;">Hi,</span><br style="font-size: 12.727272033691406px;" /><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">I need your help again. Look, in my tool I was trying to use the syntax that's shown here:</span><br style="font-size: 12.727272033691406px;" /><br style="font-size: 12.727272033691406px;" /><a style="font-size: 12.727272033691406px; color: #0021a5; text-decoration: none;" href="http://clang.llvm.org/docs/LibASTMatchersTutorial.html" target="_blank">http://clang.llvm.org/docs/LibASTMatchersTutorial.html</a><br style="font-size: 12.727272033691406px;" /><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">Namely I'm referring to this part:</span><br style="font-size: 12.727272033691406px;" /><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">int main(int argc, const char **argv) {</span><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">  CommonOptionsParser OptionsParser(argc, argv);</span><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">  ClangTool Tool(OptionsParser.getCompilations(),</span><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">                 OptionsParser.getSourcePathList());</span><br style="font-size: 12.727272033691406px;" /><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">  LoopPrinter Printer;</span><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">  MatchFinder Finder;</span><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">  Finder.addMatcher(LoopMatcher, &Printer);</span><br style="font-size: 12.727272033691406px;" /><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">  return Tool.run(newFrontendActionFactory(&Finder));</span><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">}</span><br style="font-size: 12.727272033691406px;" /><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">However, now I want to create a object "Printer" with different features depending on the arguments provided in command line. So I was thinking on implement a factory method pattern to create a different LoopPrinter object:</span><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">class OptionsFactory {</span><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">    public:</span><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">      LoopPrinter getOption() {</span><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">        if(...)</span><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">             return LoopPrinter(attribute1, attribute2);</span><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">       else</span><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">             return LoopPrinter(attribute1);</span><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">      }</span><br style="font-size: 12.727272033691406px;" /><span style="font-size: 12.727272033691406px;">};</span></p>
<p>I was searching for a better solution and there are some things that I can't completely understand.</p>
<p>- Why are there two classes MatchFinder:<br/>
<a href="http://clang.llvm.org/doxygen/classclang_1_1tooling_1_1MatchFinder.html">http://clang.llvm.org/doxygen/classclang_1_1tooling_1_1MatchFinder.html</a><br/>
<a href="http://clang.llvm.org/doxygen/classclang_1_1ast__matchers_1_1MatchFinder.html">http://clang.llvm.org/doxygen/classclang_1_1ast__matchers_1_1MatchFinder.html</a></p>
<p>- What the method in ast_matchers:MatchFinder</p>
<table class="memberdecls" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;"><tbody><tr><td class="memItemLeft" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; padding: 1px 0px 0px 8px; margin: 4px; border-width: 1px; border-color: #e0e0e0; border-style: solid none none; background-color: #fafafa;" align="right" valign="top"><p><a class="el" style="color: #3d2185; text-decoration: none; font-weight: bold; cursor: pointer;" href="http://clang.llvm.org/doxygen/classclang_1_1ASTConsumer.html">clang::ASTConsumer</a> * </p>
</td><td class="memItemRight" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; padding: 1px 8px 0px; margin: 4px; border-width: 1px; border-color: #e0e0e0; border-style: solid none none; background-color: #fafafa;" valign="bottom"><p><a class="el" style="color: #3d2185; text-decoration: none; font-weight: bold; cursor: pointer;" href="http://clang.llvm.org/doxygen/classclang_1_1ast__matchers_1_1MatchFinder.html#a4807049e6e39572d19ff127406df3d81">newASTConsumer</a> ()</p>
</td></tr></tbody></table><p>is used for? I see we can 'associate' an ASTConsumer to the Frontend as in:<br/>
<a href="http://clang.llvm.org/docs/RAVFrontendAction.html">http://clang.llvm.org/docs/RAVFrontendAction.html</a></p>
<p>but, is this possible using Matchers? Would it have any sense to create an ASTConsumer in my class OptionsFactory?</p>
<p>I have improved a lot since you last helped me, but clang is too big!</p>
<p>By the way, do you know how to use CommandLine? I posted a new thread </p>
<p><a href="http://lists.cs.uiuc.edu/pipermail/cfe-dev/2013-May/029473.html">http://lists.cs.uiuc.edu/pipermail/cfe-dev/2013-May/029473.html</a></p>
<p>If you know how to solve that problem, please, let me know.</p>
<p>Thanks in advance,</p>
<p>Pedro.</p>
<br/>
<div><em>El dia 27 abr 2013 18:39, Manuel Klimek <klimek@google.com> escribió:</em></div><blockquote class="replyBlock" style="border-left: 2px solid #000083; margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div dir="ltr">On Sat, Apr 27, 2013 at 6:36 PM, Gábor Kozár <span dir="ltr"><<a href="mailto:kozargabor@gmail.com" target="_blank">kozargabor@gmail.com</a>></span> wrote:<br /><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0 0 0 .8ex; border-left: 1px #ccc solid; padding-left: 1ex;"><div dir="ltr"><div class="im"><div class="gmail_extra"><br /><div class="gmail_quote">2013/4/27 Manuel Klimek <span dir="ltr"><<a href="mailto:klimek@google.com" target="_blank">klimek@google.com</a>></span><br /><blockquote class="gmail_quote" style="margin: 0 0 0 .8ex; border-left: 1px #ccc solid; padding-left: 1ex;">Just use the empty string for binding and getNodeAs :)</blockquote></div><br/>
</div></div><div class="gmail_extra">That would potentially lead to confusion when there are more nodes bound, but the programmer forgot to supply the proper name. In my suggestion, the parameterless getNodeAs would have an assert to check there is exactly one node bound (and whose name is the default name).</div></div></blockquote><div>If you put everything behind constants, I think it'll be easy enough to see what's happening - and that's a generally good strategy anyway, as you get a compile error if you mistype...</div><div>Thus, I think it'd not add enough value to special case the interface.</div><div> </div><blockquote class="gmail_quote" style="margin: 0 0 0 .8ex; border-left: 1px #ccc solid; padding-left: 1ex;"><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br /><br /><div class="gmail_quote">2013/4/27 Manuel Klimek <span dir="ltr"><<a href="mailto:klimek@google.com" target="_blank">klimek@google.com</a>></span><br /><blockquote class="gmail_quote" style="margin: 0 0 0 .8ex; border-left: 1px #ccc solid; padding-left: 1ex;"><div dir="ltr"><div>On Sat, Apr 27, 2013 at 6:28 PM, Gábor Kozár <span dir="ltr"><<a href="mailto:kozargabor@gmail.com" target="_blank">kozargabor@gmail.com</a>></span> wrote:</div><div class="gmail_extra"><div class="gmail_quote"><div><blockquote class="gmail_quote" style="margin: 0 0 0 .8ex; border-left: 1px #ccc solid; padding-left: 1ex;"><div dir="ltr"><div class="gmail_extra">Hi,</div><div><div class="gmail_extra">2013/4/26 Pedro Delgado Perez <span dir="ltr"><<a href="mailto:pedro.delgadoperez@mail.uca.es" target="_blank">pedro.delgadoperez@mail.uca.es</a>></span><br /><blockquote class="gmail_quote" style="margin: 0 0 0 .8ex; border-left: 1px #ccc solid; padding-left: 1ex;">Hehehe... I found the problem with this. I was binding wrongly the matcher! I used a id in the matcher thas was different from the id in the function that retrieves the nodes... I think this will be a typical mistake for newbies... </blockquote></div></div><div class="gmail_extra">Ah, yes, that happens a lot to me as well. Now that I think about it, it might be worthwhile adding a parameterless .bind() and .getNodeAs<T>() for situations where only one node is bound. Should be fairly trivial, but also not all that useful...</div></div></blockquote></div><div>Just use the empty string for binding and getNodeAs :)</div><div><div> </div><blockquote class="gmail_quote" style="margin: 0 0 0 .8ex; border-left: 1px #ccc solid; padding-left: 1ex;"><div dir="ltr"><div class="gmail_extra"><div><br /><div class="gmail_quote">2013/4/26 Pedro Delgado Perez <span dir="ltr"><<a href="mailto:pedro.delgadoperez@mail.uca.es" target="_blank">pedro.delgadoperez@mail.uca.es</a>></span><br /><blockquote class="gmail_quote" style="margin: 0 0 0 .8ex; border-left: 1px #ccc solid; padding-left: 1ex;">Thanks both! Now I can see all this much clearer and I have the enough knowledge to start out with clang.</blockquote></div><br/>
</div><p>You're welcome. Good luck!</p>
</div></div></blockquote></div></div></div></div></blockquote></div></div></div></div></blockquote></div></div></div><div class="gmail_extra"><div><br /><div class="gmail_quote">2013/4/25 Manuel Klimek <span dir="ltr"><<a href="mailto:klimek@google.com" target="_blank">klimek@google.com</a>></span><br /><blockquote class="gmail_quote" style="margin: 0 0 0 .8ex; border-left: 1px #ccc solid; padding-left: 1ex;">And btw thanks a lot for all the great user support you're giving here!</blockquote></div><br/>
</div><p>Thank you, I'm happy to help. Clang is a great project!</p>
</div><div class="gmail_extra">As soon as the university term is over, I'm also planning on trying to contribute code-wise, mainly to the Static Analyzer but I guess also on just about anything that catches my attention. :) I'm quite excited - this is going to be the first open source project I contribute to.</div><div class="gmail_extra">Gabor<br /><br /></div></blockquote><br/>
<br/>
</body>
</html>