Getting the source behind clang's AST
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;
}