<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">Hello Eli, Manuel,<br>
      <br>
      <br>
      thanks for the pointer to clang-modernize.<br>
      <br>
      <blockquote type="cite">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</blockquote>
      Okay, I see that the rewriter must be a really powerful tool.<br>
      <br>
      Based on my second example, deleting a function parameter in a
      FunctionDecl. <br>
      Is there any way to get the source location of the comma between
      two parameters?<br>
      I'm happy about every evidence :-) I didn't find something like
      ParmTypeLoc <br>
      or getParmLoc()....<br>
      <br>
      <br>
      Cheers!<br>
      <br>
      Joshua<br>
      <br>
      <br>
      On 09/09/2013 01:58 PM, Eli Friedman wrote:<br>
    </div>
    <blockquote
cite="mid:CAJdarcHv1uiTiaR7JcwuKzTeNqBENF2OrRS6VmkDTqVmwM2xsA@mail.gmail.com"
      type="cite">
      <div dir="ltr">On Mon, Sep 9, 2013 at 1:30 PM, Manuel Klimek <span
          dir="ltr"><<a moz-do-not-send="true"
            href="mailto:klimek@google.com" target="_blank">klimek@google.com</a>></span>
        wrote:<br>
        <div class="gmail_extra">
          <div class="gmail_quote">
            <blockquote class="gmail_quote" style="margin:0 0 0
              .8ex;border-left:1px #ccc solid;padding-left:1ex">
              <div dir="ltr">
                <div class="im">On Mon, Sep 9, 2013 at 6:06 PM, Joshua T
                  <span dir="ltr"><<a moz-do-not-send="true"
                      href="mailto:llvm.mailing@gmail.com"
                      target="_blank">llvm.mailing@gmail.com</a>></span>
                  wrote:<br>
                </div>
                <div class="gmail_extra">
                  <div class="gmail_quote">
                    <div class="im">
                      <blockquote class="gmail_quote" style="margin:0 0
                        0 .8ex;border-left:1px #ccc
                        solid;padding-left:1ex">Hello Manuel,<br>
                        <br>
                        I’m dealing with the same issue like maxs.<br>
                        <div><br>
                          >> Generally speaking, the easy way is
                          to add it in the code and let clang<br>
                          >> parse the code (seriously, that's
                          what works best, and has a couple of<br>
                          >> other upsides - you can also do that
                          programatically).<br>
                          <br>
                        </div>
                        Do you prefer this workflow:<br>
                        <br>
                        1.      Add new lines into the buffer<br>
                        2.      Reparse the buffer and generate a
                        complete new tree?<br>
                        <br>
                        That seems like a really heavy workload for
                        adding something new.<br>
                        What are the other upsides? Sorry, I’m new to
                        the Clang-API world :(.<br>
                      </blockquote>
                      <div><br>
                      </div>
                    </div>
                    <div>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 ;)</div>
                    <div class="im">
                      <div> </div>
                      <blockquote class="gmail_quote" style="margin:0 0
                        0 .8ex;border-left:1px #ccc
                        solid;padding-left:1ex">
                        <div>
                          >> Or to turn it around, the other
                          question would be: why do you want to add<br>
                          >> a function to the AST instead of
                          adding it to the code? :)<br>
                          <br>
                        </div>
                        Easy :-) I can add every line of code via the
                        Rewriter class, however, it is<br>
                        challenging to guarantee that my insertion is
                        valid. For instance, I could<br>
                        add this function: void foo(int a, int b int c)
                        without any problem…<br>
                        Besides syntax errors semantic errors can
                        happen. For instance, a function<br>
                        with the same name and same parameter list
                        exists already in the scope…<br>
                        <br>
                        On the other hand, inserting directly into the
                        tree means that we can<br>
                        evaluate the expression.<br>
                        After the AST safeguards that everything is
                        fine, we only have to use pretty<br>
                        print function.<br>
                        <br>
                        Okay, another example:<br>
                        <br>
                        Lets say we would like to change the number of
                        arguments of a FunctionDecl<br>
                        by deleting one argument.<br>
                        We make the assumption that at least one
                        argument is in the parameter list.<br>
                        <br>
                        Text editing requires a lot of effort.<br>
                        If the function has one parameter, we can use
                        the start and end location of<br>
                        the parameter. No big deal.<br>
                        If the function has many arguments, it is more
                        complicated. We have to<br>
                        delete the parameter like before and have to
                        figure out the position of the<br>
                        corresponding comma.<br>
                        <br>
                        Doing this by editing the AST is much more
                        simpler. Delete the argument in<br>
                        the AST and call pretty print, right? Comma
                        handing is the job of pretty<br>
                        print, right?<br>
                      </blockquote>
                      <div><br>
                      </div>
                    </div>
                    <div>Unfortunately this is not true.</div>
                    <div>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</div>
                    <div>2. the AST has undocumented invariants, so you
                      might run into problems later that you don't even
                      know of now</div>
                    <div>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 </div>
                    <div><br>
                    </div>
                  </div>
                </div>
              </div>
            </blockquote>
            <div>Actually, we do have such a pretty-printer... it just
              isn't good enough for production use. :)  Try "clang -cc1
              -ast-print".</div>
            <div><br>
            </div>
            <div>-Eli</div>
          </div>
          <br>
        </div>
      </div>
    </blockquote>
    <br>
  </body>
</html>