[cfe-dev] Adding balanced parentheses to statements
Alastair Donaldson
alastair.donaldson at imperial.ac.uk
Tue Jun 23 14:09:06 PDT 2015
Dear Richard
On 23/06/2015 21:55, Richard Smith wrote:
> On Tue, Jun 23, 2015 at 1:05 PM, Alastair Donaldson
> <alastair.donaldson at imperial.ac.uk
> <mailto:alastair.donaldson at imperial.ac.uk>> wrote:
>
> Dear all
>
> 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:
>
> - for every Stmt node in the AST, replace the source code
> associated with the Stmt with:
>
> open(x) original_source_code_for_Stmt close(x)
>
> where x is a number chosen uniquely for the Stmt node.
>
> For instance, if the Stmt is the expression:
>
> x + y
>
> then I would like to end up with something like:
>
> open(2) open(0) x close(0) + open(1) y close(1) close(2)
>
> I hope my objective makes sense.
>
> 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.
>
> I've tried two things:
>
> bool TraverseStmt(Stmt *s) {
> bool result = RecursiveASTVisitor::TraverseStmt(s);
> std::stringstream ss_start;
> ss_start << "open(" << counter << ")";
> TheRewriter.InsertTextAfter(s->getLocStart(), ss_start.str());
> std::stringstream ss_end;
> ss_end << "close(" << counter << ")";
> TheRewriter.InsertTextAfterToken(s->getLocEnd(), ss_end.str());
>
>
> 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.
Thanks for this suggestion. However, the calls do not fail: all the
"open" and "close" strings are emitted. They are just not balanced.
For example, I see this:
open(8)(open(0)open(1)open(7)d close(1)close(0)+
open(6)(open(2)open(3)open(5)d close(3)close(2)/
open(4)2)close(5)close(4))close(7)close(6);close(8)
for the expression:
(d + (d / 2))
So you can see that all the opens have matching closes. It's just that
they are not balanced.
Does this bring anything else to mind?
Many thanks
Ally
>
> 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?
>
> counter++;
> return result;
> }
>
> (This is what seemed natural to me from the clang APIs)
>
> and also:
>
> bool TraverseStmt(Stmt *s) {
> bool result = RecursiveASTVisitor::TraverseStmt(s);
> std::stringstream ss_start;
> ss_start << "open(" << counter << ")";
> TheRewriter.InsertTextAfter(s->getLocStart(), ss_start.str());
> int offset = Lexer::MeasureTokenLength(s->getLocEnd(),
> TheRewriter.getSourceMgr(), TheRewriter.getLangOpts()) + 1;
> auto END1 = s->getLocEnd().getLocWithOffset(offset);
> std::stringstream ss_end;
> ss_end << "close(" << counter << ")";
> TheRewriter.InsertTextBefore(END1, ss_end.str());
> counter++;
> return result;
> }
>
> (I came up with this after reading this source code from Robert
> Ankeney:
> https://github.com/loarabia/Clang-tutorial/blob/master/CIrewriter.cpp)
>
> However, neither work - my parentheses end up being unbalanced.
>
> I think the problem may be that in an expression such as:
>
> x + y
>
> the sub-expressions "y" and "x + y" have the same end source
> location. But I cannot figure out how to get around this.
>
> I'd be really grateful if anyone can give me a pointer here.
>
> Best wishes
>
> Ally Donaldson
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu <mailto: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/20150623/907ac434/attachment.html>
More information about the cfe-dev
mailing list