<div dir="ltr"><div><div><div><div><div><div><div>Hi,<br><br></div>Indeed, there are matchers that are not currently implemented, although their implementation would be fairly trivial. Check out the documentation about writing AST matchers: <a href="http://clang.llvm.org/docs/LibASTMatchers.html">http://clang.llvm.org/docs/LibASTMatchers.html</a><br>

<br></div>Sorry, you're correct, argumentCountIs wrong here, I meant parameterCountIs(). By the way, the list of available matchers is listed here: <a href="http://clang.llvm.org/docs/LibASTMatchersReference.html">http://clang.llvm.org/docs/LibASTMatchersReference.html</a> - try looking through the list to find if what you need it available.<br>

<br></div>As for your further requirement that the constructor not be empty, I'm fairly sure that there is no such matcher readily available for you to use, but it shouldn't be too difficult to implement one, all the information you need is in the documentation for CXXConstructorDecl: <a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html">http://clang.llvm.org/doxygen/classclang_1_1CXXConstructorDecl.html</a><br>

<br></div>I have put together quickly the matcher that I believe suits your needs, just so that you can see how it works:<br><br>namespace clang {<br>namespace ast_matchers {<br><br>using namespace clang::ast_matchers::internal;<br>

<br>AST_MATCHER(CXXConstructorDecl, defaultNonTrivialCtor)<br>{<br>    return Node.isThisDeclarationADefinition()<br>        && Node.isDefaultConstructor()<br>        && (Node.getNumCtorInitializers() != 0 || !Node.hasTrivialBody());<br>

}<br><br>} // ast_matchers<br>} // clang<br><br></div>(Don't forget to include ASTMatchers.h, ASTMatchersInternal.h and ASTMatchersMacros.h)<br><br></div>Meanwhile I found that you can actually put this together using existing matchers, which should be the preferred method:<br>

<br>constructorDecl(isDefinition(), parameterCountIs(0),<br>        anyOf(hasAnyConstructorInitializer(anything()), has(compoundStmt(has(stmt())))));<br></div><div><div><div><div><div><br></div><div>(I did a quick test, and seems to work as intended, but you should make sure to test it thoroughly yourself.)<br>

<br></div><div>The matcher you put together looks good, and those macros are there for you to use when implementing matchers.<br></div><div>You can, of course, use AST visitors (RecursiveASTVisitor<Derived>) to find the node that satisfies these conditions, but usually matchers are preferred, as a higher-level and (usually) much less messy solution. However, in some situations AST Visitors are preferred - this is your choice to make, depending on your use case.<br>

<br></div><div>Don't worry about matcher performance: if you're using MatchFinder to run your matchers, then it is guaranteed that all matchers will be executed in just one traversal of the AST, i.e. two matchers won't need two traversals.<br>

<br></div><div>Hope this helps,<br><br>Gabor<br></div></div></div></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/4/19 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">

<div>
<p>Hi again,</p>
<p>Well, I've just understood that not all the methods in a class have a matcher related. For instance, I'm trying to match the default constructor declaration of a class:</p>
<p>class Foo {<br>
public:<br>
<strong>Foo(){}</strong><br>
Foo(int a){... ...}<br>
}</p>
<br>
<p>And in CXXConstructorDecl we have isDefaultConstructor(), but I can't find an AST_MATCHER to do this. So, I suppose I would have to implement a new AST_MATCHER like this:</p>
<p><em>AST_MATCHER(CXXConstructorDecl, isDefaultConstructor){</em><br>
<em>return Node.isDefaultConstructor();</em><br>
<em>}</em></p>
<p>Wouldn't it? But, this happens often, so... would you recommend me use AST_MATCHERS? Or it would be better to do something like it is explained in <a href="http://clang.llvm.org/docs/RAVFrontendAction.html" target="_blank">http://clang.llvm.org/docs/RAVFrontendAction.html</a> ? This way, I can directly use the methods in the classes. For instance:</p>


<pre style="overflow-x:auto;overflow-y:hidden;border:thin dotted #0c3762;margin:0px 0px 12px;padding:0.8em;background-color:#f0f0f0;color:#333333"> bool VisitCXXConstructorDecl(CXXConstructorDecl *Declaration) {    if (Declaration->isDefaultConstructor()) {</pre>

<p>I have to visit a lot of kind of nodes with different features, not only this. </p>
<p>Please, I need a path to get down to work.</p>
<p>Thanks in advance,</p><div class="im">
<p>Pedro.</p>
<br>
<div><em>El dia 19 abr 2013 01:58, Gábor Kozár <<a href="mailto:kozargabor@gmail.com" target="_blank">kozargabor@gmail.com</a>> escribió:</em></div><blockquote style="border-left:2px solid #000083;margin:0pt 0pt 0pt 0.8ex;padding-left:1ex">

<div dir="ltr"><div><div><div>Hi,<br><br></div><p>What version are you using? The matchers isOverride() and isVirtual() I know for certain were not in version 3.2, and can only be found on SVN (in this file: <a href="http://llvm.org/svn/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h" target="_blank">http://llvm.org/svn/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h</a>).</p>


</div><p>Nonetheless, you can implement them all very easily manually, or just indeed copy their implementation from the link above. Also, instead of isDefaultConstructor(), you could use argumentCountIs(0).</p>
</div><p>Gabor</p>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/4/18 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"><div><p>Hi,</p>
<p>I'm newbie using ASTMatchers and I'm trying to learn little by little how to use them.</p>
<p>I was basing on the matcher <span style="color:#333333;font-family:monospace;font-size:12px;line-height:17px;text-align:justify">recordDecl(hasName("Foo"),</span><span style="color:#333333;font-family:monospace;font-size:12px;line-height:17px;text-align:justify;background-color:#e2e2e2"> </span><span style="color:#333333;font-family:monospace;font-size:12px;line-height:17px;text-align:justify">isDerivedFrom("Bar")) </span>shown in <a href="http://clang.llvm.org/docs/LibASTMatchers.html" target="_blank">http://clang.llvm.org/docs/LibASTMatchers.html</a> trying to include new features. For instance, I tried to look for classes which have at least one virtual method:</p>


<p><span style="color:#333333;font-family:monospace;font-size:12px;line-height:17px;text-align:justify">recordDecl(hasName("Foo"),</span><span style="color:#333333;font-family:monospace;font-size:12px;line-height:17px;text-align:justify;background-color:#e2e2e2"> </span><span style="color:#333333;font-family:monospace;font-size:12px;line-height:17px;text-align:justify">isDerivedFrom("Bar"), hasMethod(isVirtual()))</span></p>


<p>Or I tried to match protected overriden methods:</p>
<p><span style="color:#333333;font-family:monospace;font-size:12px;line-height:17px;text-align:justify">methodDecl(allOf(isProtected(), isOverride()</span><span style="color:#333333;font-family:monospace;font-size:12px;line-height:17px;text-align:justify">);</span></p>


<p>But neither of them worked as it couldn't find "isOverride" and "isVirtual" identifiers. I was trying a lot of combinations, but I can't understand this well.</p>
<p>Finally, I tried to look for the the default constructor of a certain class:</p>
<p><span style="color:#333333;font-family:monospace;font-size:12px;line-height:17px;text-align:justify">constructorDecl(hasName("Foo"), isDefaultConstructor())</span></p>
<p>but this is wrong. What I'm doing bad? Please, any information you give me will be fine to me to understand how to use matchers.</p>
<p>Thanks in advance,</p>
<p>Pedro.</p>
<br>
</div><br>
<p>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a></p>
</blockquote></div></div><p><a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a></p>
</blockquote>
</div></div>
</blockquote></div><br></div>