[cfe-dev] How to get the string from the CFGStmt

Manuel Klimek klimek at google.com
Mon Feb 13 01:25:26 PST 2012


On Mon, Feb 13, 2012 at 5:48 AM, redder_0210 <redder_0210 at yeah.net> wrote:
> Dear all,
> I am interested in that how to translate from a statemnt to the
> corresponding string.
> For example,
> in the CFG, there is a CFGStmt "int i = 0;",
> now I want to get the string "int i = 0;",namely modify the type CFGStmt to
> the type string.

CFGStmt has a getStmt() which gets you a Stmt, which has a function
getSourceRange which gives you the SourceRange.
When you have a SourceRange you can get a CharSourceRange by calling
CharSourceRange::getTokenRange(...).
Then you get the start location by calling
SM.getSpellingLoc(Range.getBegin()) (where Range is the
CharSourceRange).
You can calculate the length of the text by calling getDecomposedLoc
on the getBegin() and getEnd() of the spelling locations. You'll also
need to add Lexer::MeasureTokenLength(EndLocation, ...) to the size,
as the last element of a token range points to the begin of the last
token.
Finally you can call SM.getCharacterData with the begin and you'll
have your text.

Unfortunately this is a little harder than it could be, mostly due to
the different types of locations. (Note that if there are for example
macros involved, it matters whether you use getSpellingLocation or
not).

Cheers,
/Manuel



More information about the cfe-dev mailing list