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

Guillaume Papin guillaume.papin at epitech.eu
Tue Sep 10 00:39:20 PDT 2013


You are probably interested by a ParmVarDecl.

If you need the type you can use:

    ParmVarDecl->getTypeSourceInfo()->getTypeLoc()

A fairly recent transform in clang-modernize rewrites the type of some
parameters, you can take a look. The interesting stuff for you is
located in clang-modernize/PassByValue/PassByValueActions.cpp I think.

I don't know if you can get the comma directly but I'm sure you can find
a way to delete a parameter anyway.

Joshua T <llvm.mailing at gmail.com> writes:

> 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> wrote:
>     
>     
>         
>         
>         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 
>         
>         
>     Actually, we do have such a pretty-printer... it just isn't good enough for
>     production use. :)  Try "clang -cc1 -ast-print".
>     
>     
>     -Eli
>
>     
>

-- 
Guillaume Papin





More information about the cfe-dev mailing list