<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Jun 23, 2015 at 1:05 PM, Alastair Donaldson <span dir="ltr"><<a href="mailto:alastair.donaldson@imperial.ac.uk" target="_blank">alastair.donaldson@imperial.ac.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Dear all<br>
<br>
I am trying to use the Rewriter class to do something conceptually pretty straightforward to a source file.  What I actually want to do is pretty specific, but if I could work out how to do the following it would be obvious how to solve my problem:<br>
<br>
- for every Stmt node in the AST, replace the source code associated with the Stmt with:<br>
<br>
    open(x) original_source_code_for_Stmt close(x)<br>
<br>
where x is a number chosen uniquely for the Stmt node.<br>
<br>
For instance, if the Stmt is the expression:<br>
<br>
x + y<br>
<br>
then I would like to end up with something like:<br>
<br>
open(2) open(0) x close(0) + open(1) y close(1) close(2)<br>
<br>
I hope my objective makes sense.<br>
<br>
What I've tried to do is write a class that extends RecursiveASTVisitor, equipped with a Rewriter field, "TheRewriter", and an int field, "counter".  The Rewriter should allow me to rewrite the source code.  The counter is used to give each open and close a unique x.  I'm assuming for now that all my code is in one source file.<br>
<br>
I've tried two things:<br>
<br>
  bool TraverseStmt(Stmt *s) {<br>
    bool result = RecursiveASTVisitor::TraverseStmt(s);<br>
    std::stringstream ss_start;<br>
    ss_start << "open(" << counter << ")";<br>
    TheRewriter.InsertTextAfter(s->getLocStart(), ss_start.str());<br>
    std::stringstream ss_end;<br>
    ss_end << "close(" << counter << ")";<br>
    TheRewriter.InsertTextAfterToken(s->getLocEnd(), ss_end.str());<br></blockquote><div><br></div><div>InsertTextAfter and InsertTextAfterToken return a bool indicating whether the insertion was possible (false on success, true on failure). You could use that to isolate which particular call is failing.</div><div><br></div><div>That said, the only cases where the above calls would currently fail are if they're given a location for which TheRewriter.isRewritable returns false. That only happens if the location provided is within a macro expansion. Could that be the case in your failing examples?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
    counter++;<br>
    return result;<br>
  }<br>
<br>
(This is what seemed natural to me from the clang APIs)<br>
<br>
and also:<br>
<br>
  bool TraverseStmt(Stmt *s) {<br>
    bool result = RecursiveASTVisitor::TraverseStmt(s);<br>
    std::stringstream ss_start;<br>
    ss_start << "open(" << counter << ")";<br>
    TheRewriter.InsertTextAfter(s->getLocStart(), ss_start.str());<br>
    int offset = Lexer::MeasureTokenLength(s->getLocEnd(), TheRewriter.getSourceMgr(), TheRewriter.getLangOpts()) + 1;<br>
    auto END1 = s->getLocEnd().getLocWithOffset(offset);<br>
    std::stringstream ss_end;<br>
    ss_end << "close(" << counter << ")";<br>
    TheRewriter.InsertTextBefore(END1, ss_end.str());<br>
    counter++;<br>
    return result;<br>
  }<br>
<br>
(I came up with this after reading this source code from Robert Ankeney: <a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_loarabia_Clang-2Dtutorial_blob_master_CIrewriter.cpp&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=CnzuN65ENJ1H9py9XLiRvC_UQz6u3oG6GUNn7_wosSM&m=_NeR_v5wCYJO0OiYvBTech1D1HLx_-W0tujmhw8XXJo&s=PgMa0nmQGfgm8CeCgmLopMDeAuDGiymO7k8u2zQaIls&e=" rel="noreferrer" target="_blank">https://github.com/loarabia/Clang-tutorial/blob/master/CIrewriter.cpp</a>)<br>
<br>
However, neither work - my parentheses end up being unbalanced.<br>
<br>
I think the problem may be that in an expression such as:<br>
<br>
x + y<br>
<br>
the sub-expressions "y" and "x + y" have the same end source location.  But I cannot figure out how to get around this.<br>
<br>
I'd be really grateful if anyone can give me a pointer here.<br>
<br>
Best wishes<br>
<br>
Ally Donaldson<br>
<br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
</blockquote></div><br></div></div>