How to retrieve entire argument name with operators


I am writing a replacement to move arguments from one function to another.

For instance,

foo(arg1) → foo().bar(arg1)

foo(*arg2) → foo().bar(*arg2)

foo(…) → foo().bar(…)

where arg1, arg2, … are resolved to the same type.

I am able to handle the first case doing something like this:

matcher = callExpr(callee(functionDecl(hasName(“foo”)))).bind(call)




Which is able to change “foo(arg1)” to foo().bar(arg1). However, for cases with UnaryOperators inbetween, the outcome is:

“foo(*arg2)” → “foo(arg2).bar(*arg2). It only considers the unary operator and does not remove the “arg2” portion of the argument.

I cannot figure out a clean way to do this. What is the suggested way to get that argument regardless of what operators that could be in front of it?

Note: I am trying to remove that argument completely.


David Lai

Hi David,

Typically, when you get a SourceLocation from a AST object, it points at the start of token. Since you are using the same SourceLocation for the start and end, the replacement only removes the * token. Also, the function getExprLoc() returns the best location for a diagnostic, and may not be useful elsewhere.

To get the start and end SourceLocation’s, use the functions getLocStart() and getLocEnd(). These are from the class Stmt, which is the parent of Expr.

Hope that helps.