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

Manuel Klimek klimek at google.com
Tue Sep 10 07:17:55 PDT 2013


On Tue, Sep 10, 2013 at 9:39 AM, Guillaume Papin <guillaume.papin at epitech.eu
> wrote:

> 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.
>

Usually we just use the lexer towards the "," from the end of the
parameter... (you know how many there are, so you know whether there is
going to be a comma or not)


>
> 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
>
>
> _______________________________________________
> 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/20130910/37b3d2f0/attachment.html>


More information about the cfe-dev mailing list