[cfe-dev] Wrong SourceRange for IfStmt ?
Roman Popov via cfe-dev
cfe-dev at lists.llvm.org
Sun Oct 22 14:49:30 PDT 2017
Looks like semicolon is not considered a token, so it does not have any
representation in AST.
So for example to find location after semicolon in this IfStmt:
if (a)
a--;
I have to search for semicolon myself:
const char* endCharPtr = sourceManager.getCharacterData(locEnd);
size_t offsetSemicolon = 0;
while (endCharPtr[offsetSemicolon-1]) != ';' )
offsetSemicolon ++;
if there is a CompoundStmt in Then body, like
if (a)
{ a--; }
Location of final curly brace will be detected correctly.
2017-10-22 10:09 GMT-07:00 Roman Popov <ripopov at gmail.com>:
> Thanks you!
> So I've misunderstood the meaning of API.
> Here is also related discussion on stackoverflow :
> https://stackoverflow.com/questions/11083066/getting-
> the-source-behind-clangs-ast
>
>
> On Oct 22, 2017 7:41 AM, "Don Hinton" <hintonda at gmail.com> wrote:
>
> You're assuming that the length of the end token is 1, but you should use
> its actual length instead.
>
> So, instead of getting the end location of the statement, you should get
> the end token, then use its location and length, e.g., tok.getLocation().
> getLocWithOffset(tok.getLength()).
>
> hth...
> don
>
> On Sat, Oct 21, 2017 at 9:28 PM, Roman Popov via cfe-dev <
> cfe-dev at lists.llvm.org> wrote:
>
>> Hello,
>> I want to emit some text after each if statement in source code. When
>> testing a tool I've found that ifStmt->getSourceRange() sometimes returns
>> wrong end location.
>>
>> In RecursiveASTVisitor I have following code to insert "$" before and
>> after each if:
>>
>> bool VisitIfStmt(clang::IfStmt* ifStmt)
>> {
>> clang::tooling::Replacement rep0(compInst.getSourceManager(),
>> ifStmt->getLocStart(), 0, "$");
>> handleAllErrors ( replacements.add(rep0) );
>> clang::tooling::Replacement rep1(compInst.getSourceManager(),
>> ifStmt->getLocEnd().getLocWithOffset(1), 0, "$");
>> handleAllErrors ( replacements.add(rep1) );
>> return true;
>> }
>>
>> Replacements &replacements;
>> ASTContext *Context;
>> clang::CompilerInstance &compInst;
>>
>> When testing on following code:
>>
>> int a;
>> if (a)
>> a--;
>>
>> Result is:
>>
>> $if (a)
>> a-$-;
>>
>>
>> So Clang thinks that if statement ends inside decrement operator. Is it a
>> bug, or I misuse API?
>>
>> Thanks,
>> -Roman
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20171022/e2499e43/attachment.html>
More information about the cfe-dev
mailing list