[cfe-dev] Stmt.getLocEnd()

Antoine Trouve trouve at isit.or.jp
Sun Feb 3 23:35:09 PST 2013


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 "++".

I used the quick-and-dirty trick of Manuel, searching for the next ";", and that works. Still I feel insecure about this solution.

Any idea to follow Jordan's proposal ? (so that I would get the location after the "++" and not only the first "+")

Regards,

- Antoine



More information about the cfe-dev mailing list