[cfe-dev] ASTMatchers: isVirtual and isOverride

Manuel Klimek klimek at google.com
Fri Apr 19 04:50:05 PDT 2013


On Fri, Apr 19, 2013 at 12:18 PM, Pedro Delgado Perez <
pedro.delgadoperez at mail.uca.es> wrote:

>  Hi again,
>
> 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:
>
> class Foo {
> public:
> *Foo(){}*
> Foo(int a){... ...}
> }
>
> 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:
>
> *AST_MATCHER(CXXConstructorDecl, isDefaultConstructor){*
> *return Node.isDefaultConstructor();*
> *}*
>
> 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
> http://clang.llvm.org/docs/RAVFrontendAction.html ? This way, I can
> directly use the methods in the classes. For instance:
>
>  bool VisitCXXConstructorDecl(CXXConstructorDecl *Declaration) {    if (Declaration->isDefaultConstructor()) {
>
> I have to visit a lot of kind of nodes with different features, not only
> this.
>

All of the ways you cite make sense. What you want really depends on what
kind of control you want. Note that you can always easily start with AST
matchers to find higher level things you're interested in, and then drill
down through the AST nodes by calling the methods or even by using a
RecursiveASTVisitor on a node...

Cheers,
/Manuel


> Please, I need a path to get down to work.
>
> Thanks in advance,
>
> Pedro.
>
> *El dia 19 abr 2013 01:58, Gábor Kozár <kozargabor at gmail.com> escribió:*
>
> Hi,
>
> 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:
> http://llvm.org/svn/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h
> ).
>
> 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).
>
> Gabor
>
>
> 2013/4/18 Pedro Delgado Perez <pedro.delgadoperez at mail.uca.es>
>
>> Hi,
>>
>> I'm newbie using ASTMatchers and I'm trying to learn little by little how
>> to use them.
>>
>> I was basing on the matcher recordDecl(hasName("Foo"), isDerivedFrom("Bar"))
>> shown in http://clang.llvm.org/docs/LibASTMatchers.html trying to
>> include new features. For instance, I tried to look for classes which have
>> at least one virtual method:
>>
>> recordDecl(hasName("Foo"), isDerivedFrom("Bar"), hasMethod(isVirtual()))
>>
>> Or I tried to match protected overriden methods:
>>
>> methodDecl(allOf(isProtected(), isOverride());
>>
>> 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.
>>
>> Finally, I tried to look for the the default constructor of a certain
>> class:
>>
>> constructorDecl(hasName("Foo"), isDefaultConstructor())
>>
>> 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.
>>
>> Thanks in advance,
>>
>> Pedro.
>>
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at cs.uiuc.edu
>>
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130419/871f1195/attachment.html>


More information about the cfe-dev mailing list