我正在使用Clang / libtooling(ASTComsumer
和Matcher)访问所有return
语句(ReturnStmt
)。我需要以字符串形式提取关键字return
之后的表达式,以便将其放在要替换return
语句的宏中。
例如,我要替换以下行:
return somefunc() + 1;
使用
FUNCTION_EXIT(somefunc() + 1); // FUNCTION_EXIT is a C macro
在进行一些记录后,宏将从函数中return
。
我正在使用ReturnStmt::getRetValue()
返回一个Expr
并试图以字符串形式获取它(以便可以将其传递给宏),但是我还没有找到一种方法。有没有办法对Expr
进行字符串化?
答案 0 :(得分:3)
Clang在抽象语法树(AST)和实际源代码之间严格考虑了关注点。在这两者之间进行转换的组件是Lexer。获取Expr e:
const string text = Lexer::getSourceText(e.getSourceRange(), source_manager, opt);
请注意,ASTContext中提供了SourceManager和LangOptions。如果您要解析的代码具有宏,那么事情就会变得更加复杂,因为您必须注意拼写位置与扩展位置; SourceManager有很多不同的函数可以在这些函数之间进行转换。
祝你好运!