lang-如何检索“ Expr”作为字符串?

时间:2018-07-20 16:27:08

标签: clang llvm-clang libtooling

我正在使用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进行字符串化?

1 个答案:

答案 0 :(得分:3)

Clang在抽象语法树(AST)和实际源代码之间严格考虑了关注点。在这两者之间进行转换的组件是Lexer。获取Expr e:

的原始资源
const string text = Lexer::getSourceText(e.getSourceRange(), source_manager, opt);

请注意,ASTContext中提供了SourceManager和LangOptions。如果您要解析的代码具有宏,那么事情就会变得更加复杂,因为您必须注意拼写位置与扩展位置; SourceManager有很多不同的函数可以在这些函数之间进行转换。

祝你好运!