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