[cfe-dev] Where to put upcoming refcatoring tools
Manuel Klimek
klimek at google.com
Wed Apr 25 10:13:51 PDT 2012
On Wed, Apr 25, 2012 at 6:56 PM, Stephen Kelly <steveire at gmail.com> wrote:
> Stephen Kelly wrote:
>
>> Manuel Klimek wrote:
>>>
>>> Does
>>> Expresssion(AllOf(
>>> HasType(...),
>>> Not(ImplicitCast())
>>> work?
>>>
>>
>> Unfortunately not. The Not(ImplicitCast()) also makes no difference.
>>
>> I tried adding a ConstructorCall() in there too, guessing that would match
>> the implicit ctor calls, but that just excluded all matches from the
>> result.
>>
>> I put a call to Arg->dump() in my MatchCallback implementation. It doesn't
>> help me, but maybe you can see how I need to define my match with that? My
>> input is this now:
>>
>> Qt::escape("foo");
>> QString foo("bar");
>> Qt::escape(foo);
>> QObject o;
>> Qt::escape(o.objectName());
>> Qt::escape(o.property("foo").toByteArray());
>
> I found that I could use this to not match the Qt::escape(foo); case.
>
> Finder.addMatcher(
> Id("call",
> Call(
> Callee(Function(HasName("::Qt::escape"))),
> HasArgument(
> 0,
> Id("arg", BindTemporaryExpression())
> )
> )
> ),
> &Callback);
>
> I eventually figured out how to limit it to only the case without
> temporaries:
>
> Finder.addMatcher(
> Id("call",
> Call(
> Callee(Function(HasName("::Qt::escape"))),
> Not(HasArgument(
> 0,
> Id("arg", BindTemporaryExpression())
> )),
> HasArgument(
> 0,
> Id("arg", Expression())
> )
> )
> ),
> &Callback);
>
> I tried many other variations using Not, which I can try to list if you're
> interested in considering the self-documenting nature of the API.
>
> To match the string literal, I used:
>
> Finder.addMatcher(
> Id("call",
> Call(
> Callee(Function(HasName("::Qt::escape"))),
> HasArgument(
> 0,
> Id("arg", BindTemporaryExpression())
> ),
> Not(hasDescendant(MemberExpression()))
> )
> ),
> &Callback);
>
> I could not use this as it gives no results:
>
> Finder.addMatcher(
> Id("call",
> Call(
> Callee(Function(HasName("::Qt::escape"))),
> HasArgument(
> 0,
> Id("arg", BindTemporaryExpression())
> ),
> ast_matchers::StringLiteral()
> )
> ),
> &Callback);
>
>
> And this one does not build:
>
> Finder.addMatcher(
> Id("call",
> Call(
> Callee(Function(HasName("::Qt::escape"))),
> HasArgument(
> 0,
> Id("arg", BindTemporaryExpression())
> ),
> Not(hasDescendant(ast_matchers::StringLiteral()))
> )
> ),
> &Callback);
>
>
> Finally this matches the member calls:
>
> Finder.addMatcher(
> Id("call",
> Call(
> Callee(Function(HasName("::Qt::escape"))),
> HasArgument(
> 0,
> BindTemporaryExpression()
> ),
> hasDescendant(Id("arg", MemberExpression()))
> )
> ),
> &Callback);
>
> But I do not get the parentheses or the arguments inside them in the result
> (if any). I aslo presume this would not match a call of a free function, so
> I would need more matchers for those cases? It's already getting quite
> exhaustive and less scalable.
>
> It seems either I'm missing something or the tooling is not ready to handle
> the cases I'm trying to achieve?
Ok, I'm confused by your last example. The way I usually approach this
is that I write a small cpp file with the stuff I want to match and
then run clang -ast-dump-xml over it, and look at the resulting AST.
Then you basically take the matchers that drill through the
corresponding AST nodes and put them together. I can take a look at
your specific example tomorrow (I just reread your first explanation
of what you're trying to do) and come up with an example how I would
approach this. That might also make up some good documentation :)
Cheers,
/Manuel
>
> Thanks,
>
> Steve.
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
More information about the cfe-dev
mailing list