Clang 叮当声-如何检索;Expr";作为字符串?

Clang 叮当声-如何检索;Expr";作为字符串?,clang,llvm-clang,libtooling,Clang,Llvm Clang,Libtooling,我正在使用Clang/libtooling(ASTComsumer和Matcher)访问所有return语句(ReturnStmt)。我需要以字符串形式提取关键字return后面的表达式,这样我就可以将它放在替换return语句的宏中 例如,我想替换以下行: return somefunc() + 1; 与 完成一些日志记录后,宏将从函数返回 我正在使用ReturnStmt::getRetValue(),它返回一个Expr,并试图以字符串形式获取它(以便可以将它传递给宏),但我还没有找到方法。

我正在使用Clang/libtooling(
ASTComsumer
和Matcher)访问所有
return
语句(
ReturnStmt
)。我需要以字符串形式提取关键字
return
后面的表达式,这样我就可以将它放在替换
return
语句的宏中

例如,我想替换以下行:

return somefunc() + 1;

完成一些日志记录后,宏将从函数返回


我正在使用
ReturnStmt::getRetValue()
,它返回一个
Expr
,并试图以字符串形式获取它(以便可以将它传递给宏),但我还没有找到方法。有没有一种方法可以将
Expr
字符串化?

Clang在抽象语法树(AST)和实际源代码之间有一个严格的关注点分离。在这两者之间转换的组件是。获取
表达式的原始源代码:

const string text = Lexer::getSourceText(e.getSourceRange(), source_manager, opt);
请注意,SourceManager和LangOptions可从中获得。如果你正在解析的代码有宏,那么事情就会变得更复杂,因为你必须关注拼写位置而不是扩展位置;有一系列不同的函数在这些函数之间进行转换


祝你好运

请注意,我相信我们需要在源代码范围上执行
CharSourceRange::getCharRange()
,才能为
getSourceText
工作,并且StringRef和string之间没有隐式转换。否则我也是这样做的:)我不知道
getCharRange
getokenrange
之间的区别,但在我的情况下,后者对我有效。如果使用
getCharRange
,则缺少某些标识符。
const string text = Lexer::getSourceText(e.getSourceRange(), source_manager, opt);