有没有办法通过使用Clang API扩展宏来获取源代码

时间:2016-09-16 10:41:19

标签: c++ clang clang++ llvm-clang

例如,我得到了以下代码。

#define ADD(x, y) (x) + (y) 

int func(int i, int j) 
{ 
   return ADD(i, j); 
} 

clang SourceManager可用于获取函数func的源代码。我得到的是{ return ADD(i, j)。有什么方法可以将源代码作为{ return (i) + (j); }

来自keyboardsmoke的答案:已经过测试

在这个答案中可以简单地使用Decl :: print()方法或keyboardsmoke的代码,实际上,Decl :: print()调用DeclPrinter的方法。

Stmt有一个名为printPretty()的不同方法,可以打印扩展宏的语句的源代码。

1 个答案:

答案 0 :(得分:1)

一种简单的方法是使用Decl内部的'print'功能,漂亮的打印机将扩展所有宏。

您还可以打印语句,因此如果您想要返回的特定语句,您应该可以执行类似的操作。

Decl :: print也引用“DeclPrinter”,它允许你打印任何decl类型(输出到raw_ostream)

std::string s;
llvm::raw_string_ostream sos(s);
PrintingPolicy pp(compiler->getLangOpts());
pp.adjustForCPlusPlus();
DeclPrinter DP(sos, pp, 0 /* indent */, true /* PrintInstantiation */);
DP.Visit(functionDecl);

将“functionDecl”的文本放入“std :: string s”