[cfe-dev] How to add a function to an AST?

Joshua T llvm.mailing at gmail.com
Mon Sep 9 19:25:53 PDT 2013


Hello Eli, Manuel,


thanks for the pointer to clang-modernize.

> 4. rewriting text is easy - in fact, we've written a whole library as 
> part of clang (libTooling) to make it as easy as possible; the tools 
> you find in clang's extra tools repository are written on top of that 
> architecture
Okay, I see that the rewriter must be a really powerful tool.

Based on my second example, deleting a function parameter in a 
FunctionDecl.
Is there any way to get the source location of the comma between two 
parameters?
I'm happy about every evidence :-) I didn't find something like ParmTypeLoc
or getParmLoc()....


Cheers!

Joshua


On 09/09/2013 01:58 PM, Eli Friedman wrote:
> On Mon, Sep 9, 2013 at 1:30 PM, Manuel Klimek <klimek at google.com 
> <mailto:klimek at google.com>> wrote:
>
>     On Mon, Sep 9, 2013 at 6:06 PM, Joshua T <llvm.mailing at gmail.com
>     <mailto:llvm.mailing at gmail.com>> wrote:
>
>         Hello Manuel,
>
>         I’m dealing with the same issue like maxs.
>
>         >> Generally speaking, the easy way is to add it in the code
>         and let clang
>         >> parse the code (seriously, that's what works best, and has
>         a couple of
>         >> other upsides - you can also do that programatically).
>
>         Do you prefer this workflow:
>
>         1.      Add new lines into the buffer
>         2.      Reparse the buffer and generate a complete new tree?
>
>         That seems like a really heavy workload for adding something new.
>         What are the other upsides? Sorry, I’m new to the Clang-API
>         world :(.
>
>
>     It's not actually a "heavy" workflow - clang has some libraries
>     that help making that workflow amazingly little code. You can look
>     at clang-modernize, which uses exactly this procedure to migrate
>     code to c++11 (and beyond ;)
>
>         >> Or to turn it around, the other question would be: why do
>         you want to add
>         >> a function to the AST instead of adding it to the code? :)
>
>         Easy :-) I can add every line of code via the Rewriter class,
>         however, it is
>         challenging to guarantee that my insertion is valid. For
>         instance, I could
>         add this function: void foo(int a, int b int c) without any
>         problem…
>         Besides syntax errors semantic errors can happen. For
>         instance, a function
>         with the same name and same parameter list exists already in
>         the scope…
>
>         On the other hand, inserting directly into the tree means that
>         we can
>         evaluate the expression.
>         After the AST safeguards that everything is fine, we only have
>         to use pretty
>         print function.
>
>         Okay, another example:
>
>         Lets say we would like to change the number of arguments of a
>         FunctionDecl
>         by deleting one argument.
>         We make the assumption that at least one argument is in the
>         parameter list.
>
>         Text editing requires a lot of effort.
>         If the function has one parameter, we can use the start and
>         end location of
>         the parameter. No big deal.
>         If the function has many arguments, it is more complicated. We
>         have to
>         delete the parameter like before and have to figure out the
>         position of the
>         corresponding comma.
>
>         Doing this by editing the AST is much more simpler. Delete the
>         argument in
>         the AST and call pretty print, right? Comma handing is the job
>         of pretty
>         print, right?
>
>
>     Unfortunately this is not true.
>     1. inserting a node in the AST will not automatically "validate"
>     it - afaik clang relies on its C++ analysis in Sema to only run
>     into building correct ASTs; you can still add nodes to the AST, if
>     you're really careful
>     2. the AST has undocumented invariants, so you might run into
>     problems later that you don't even know of now
>     3. clang doesn't come with a pretty-printer that actually outputs
>     "real code" (at least if I'm not completely missing something) -
>     the pretty printers I know are made for debugging or diagnostics
>
> Actually, we do have such a pretty-printer... it just isn't good 
> enough for production use. :)  Try "clang -cc1 -ast-print".
>
> -Eli
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130909/ad455d77/attachment.html>


More information about the cfe-dev mailing list