[cfe-dev] source code rewriting for invalid ast nodes

Marc Greim marc.greim at mytum.de
Tue Oct 7 07:19:59 PDT 2014


Hello,

I'm using clang to rewrite (generated) source code. Usually that can be
done by running matchers on the ast in combination with a rewriter
instance.

Unfortunately this fails in the case of operator[] where the index argument
cannot be converted to a valid type (e.g. class X{} x; int * array; int i =
array[x]; ). The corresponding ast nodes are missing since the "array[x]"
statement has no valid representation.

How can I detect and rewrite the code in cases like above example?
"array[x]" -> "someFunc(array,x)"

ExternalSemaSource::CorrectTypo dosen't get called in this case (maybe
because all tokens are valid?) so that attempt failed.

Using ExternalSemaSource::LookupUnqualified also failed so far, because i
haven't found a method to get a valid SourceRange for that code part. It
would also require manual parsing of that code part which seem like a
"dirty" solution to me.

The only idea that I have left is to declare builtin operators for any type
with Sema::AddBuiltinCandidate, but that may result in many operator
definitions. Also I have no idea how to iterate over all types and how to
declare these functions. However this may be the best solution, because
then matchers can be used to find and rewrite those code parts.

I would appreciate any help to find a solution.

Regards,
Marc


P.S. I am aware that adding operator int() to class X of above example
would allow those statements but that is not an option, since X cannot be
represented as int in my case and additional operations need to be
performed; such an operator may also mess up other parts of the code.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20141007/abf47ffa/attachment.html>


More information about the cfe-dev mailing list