Given an AST object in clang, how can I get the code behind it? I tried editing the code in the tutorial, and added:
clang::SourceLocation _b = d->getLocStart(), _e = d->getLocEnd();
char *b = sourceManager->getCharacterData(_b),
e = sourceManager->getCharacterData(_E);
llvm:errs() << std::string(b, e-b) << "\n";
but alas, it didn't print the whole typedef declaration, only about half of it! The same phenomena happened when printing Expr
.
How can I print and see the whole original string constituting the declaration?
Use the Lexer
module:
clang::SourceManager *sm;
clang::LangOptions lopt;
std::string decl2str(clang::Decl *d) {
clang::SourceLocation b(d->getLocStart()), _e(d->getLocEnd());
clang::SourceLocation e(clang::Lexer::getLocForEndOfToken(_e, 0, *sm, lopt));
return std::string(sm->getCharacterData(b),
sm->getCharacterData(e)-sm->getCharacterData(b));
}
The following code works for me.
std::string decl2str(clang::Decl *d, SourceManager &sm) {
// (T, U) => "T,,"
string text = Lexer::getSourceText(CharSourceRange::getTokenRange(d->getSourceRange()), sm, LangOptions(), 0);
if (text.size() > 0 && (text.at(text.size()-1) == ',')) //the text can be ""
return Lexer::getSourceText(CharSourceRange::getCharRange(d->getSourceRange()), sm, LangOptions(), 0);
return text;
}
Elazar's method worked for me except when a macro was involved. The following correction resolved it:
std::string decl2str(clang::Decl *d) {
clang::SourceLocation b(d->getLocStart()), _e(d->getLocEnd());
if (b.isMacroID())
b = sm->getSpellingLoc(b);
if (e.isMacroID())
e = sm->getSpellingLoc(e);
clang::SourceLocation e(clang::Lexer::getLocForEndOfToken(_e, 0, *sm, lopt));
return std::string(sm->getCharacterData(b),
sm->getCharacterData(e)-sm->getCharacterData(b));
}