5

我正在使用 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

4

1 回答 1

8

Clang 在抽象语法树 (AST) 和实际源代码之间有严格的关注点分离。在这些之间转换的组件是Lexer。获取原始来源Expr e:

const string text = Lexer::getSourceText(e.getSourceRange(), source_manager, opt);

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

祝你好运!

于 2018-07-29T13:06:22.590 回答