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

Manuel Klimek klimek at google.com
Mon Sep 9 13:30:12 PDT 2013


On Mon, Sep 9, 2013 at 6:06 PM, Joshua T <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
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

Cheers,
/Manuel


> I’m looking for your answer. It seems that you an AST pro.
>
> Cheers!
>
> Joshua :)
>
>
>
>
> --
> View this message in context:
> http://clang-developers.42468.n3.nabble.com/How-to-add-a-function-to-an-AST-tp4034314p4034342.html
> Sent from the Clang Developers mailing list archive at Nabble.com.
>
> _______________________________________________
> 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/20130909/2b629469/attachment.html>


More information about the cfe-dev mailing list