[cfe-dev] Stmt.getLocEnd() (Antoine Trouve)

Robert Ankeney rrankene at gmail.com
Mon Feb 4 19:59:32 PST 2013


Have a look at Lexer::findLocationAfterToken(stmt->getLocEnd(),
                                                                  tok::semi,

Rewrite.getSourceMgr(),

Rewrite.getLangOpts(),
                                                                  true);

Robert

Message: 6
> Date: Tue, 5 Feb 2013 10:37:07 +0900
> From: Antoine Trouve <trouve at isit.or.jp>
> To: James Dennett <james.dennett at gmail.com>
> Cc: clang-dev Developers <cfe-dev at cs.uiuc.edu>
> Subject: Re: [cfe-dev] Stmt.getLocEnd()
> Message-ID: <B4B7A695-BFF1-40F0-8E75-379D80991DA4 at isit.or.jp>
> Content-Type: text/plain; charset=iso-8859-1
>
> Le H.25/02/04 ? 17:06, James Dennett <james.dennett at gmail.com> a ?crit :
>
> > On Sun, Feb 3, 2013 at 11:35 PM, Antoine Trouve <trouve at isit.or.jp>
> wrote:
> >> Le H.25/02/02 ? 2:28, Jordan Rose <jordan_rose at apple.com> a ?crit :
> >>
> >>>
> >>> On Feb 1, 2013, at 1:02 , Manuel Klimek <klimek at google.com> wrote:
> >>>
> >>>> On Fri, Feb 1, 2013 at 9:25 AM, Antoine Trouve <trouve at isit.or.jp>
> wrote:
> >>>> Hi everybody,
> >>>>
> >>>> I am now using LibTooling with the RefactoringTool to add some
> comments in some C codes.
> >>>>
> >>>> I am now trying to add comments after a given statement (the body of
> a for to say the truth);
> >>>> in order to detect the location of the end of a statement I use
> "Stmt.getLocEnd()", but I seems that its output is often inaccurate.
> >>>>
> >>>> Here are two examples, if I insert "/* HERE */" at the end location:
> >>>>
> >>>>        for(i=0; i<N/2; i++) res +=mand(i,N/4/* HERE */);
> >>>>        for(i=0; i<mand(N,N); i++) res /* HERE */++;
> >>>>
> >>>> I would expect the following output:
> >>>>
> >>>>        for(i=0; i<N/2; i++) res +=mand(i,N/4);/* HERE */
> >>>>        for(i=0; i<mand(N,N); i++) res ++;/* HERE */
> >>>>
> >>>> It looks like a bug. Am I right or did I miss something ?
> >>>>
> >>>> I found a previous recent discussion about this matter (
> http://clang-developers.42468.n3.nabble.com/Statements-that-end-with-td4028311.html),
> but It looks like nothing has been done.
> >>>>
> >>>> Yes, this is a known issue, and as far as I'm aware nothing has been
> done. We're usually working around this by looking for the next ';' token.
> >>>>
> >>>> I guess it's the good old "patches welcome" answer - or wait until it
> becomes important enough for somebody else to solve.
> >>>
> >>> The other issue here is that (by design) getLocEnd() doesn't actually
> return the SourceLocation just past the end of the statement, but the
> SourceLocation of the start of the last token in the statement. If you
> actually want the SourceLocation following the statement, you'll have to
> use Lexer::getLocForEndOfToken.
> >>>
> >>> Jordan
> >>
> >> I tried using "Lexer::getLoxForEndOfToken()", but that still wouldn't
> give the desired behaviour.
> >>
> >> For instance, for
> >>
> >>         for(i=0; i<mand(N,N); i++) res /* HERE */++;
> >>
> >> It would now return the following location:
> >>
> >>         for(i=0; i<mand(N,N); i++) res +/* HERE */+;
> >>
> >> The token is only the first "+", not the whole "++".
> >
> > That sounds wrong; the token is definitely "++", not "+".  What code
> > are you using to find that it's a single "+"?
> >
> > -- James
>
> My bad, I was using the function the wrong way.
>
> But I noticed that I couldn't go through a semicolon using
> "Lexer::getLocForEndOfToken" if there is a space before the semicolon.
>
> For instance, let's consider this code:
>
>         for(i=0; i<mand(N,N); i++) res ++ ;
>
> Initially, the SourceLocation retreieved with "getLocEnd()" is before the
> "++":
>
>         for(i=0; i<mand(N,N); i++) res /*HERE*/++ ;
>
> If I call "Lexer::getLocForEndOfToken", it will point to after "++": nice:
>
>         for(i=0; i<mand(N,N); i++) res ++/*HERE*/ ;
>
> Then if I call again getLocForEndOfToken, the result will point to the
> exact same location (I need to call "getLocWithOffset")
>
>         for(i=0; i<mand(N,N); i++) res ++/*STILL HERE*/ ;
>
> In the case I don't have any space before the semicolon, the return value
> of the second call to getLocForEndOfToken will point to after it:
>
>         for(i=0; i<mand(N,N); i++) res ++;/*HERE*/
>         (no space before the ";")
>
> Is that the expected behaviour ? I find it pretty annoying in my very
> situation because I have no choice but looping with
> "SourceLocation::getLocWithOffset" until I find a ";".
>
> Regards,
>
> - Antoine
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130204/5ef34ec3/attachment.html>


More information about the cfe-dev mailing list