[cfe-dev] Stmt.getLocEnd()

James Dennett james.dennett at gmail.com
Mon Feb 4 00:06:20 PST 2013


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




More information about the cfe-dev mailing list