我有一个使用libtooling的现有工作源代码修改工具。现在我想将这个工具集成到clang中,这样用户就可以编译修改后的源代码,而无需在某处实际保存它。
修改部分没有问题,Matchers + Rewriters与clang的工作方式相同,我的问题是如何告诉编译器在我的更改后重新解析源代码。
到目前为止我的进展:
我希望基于前两个最终我找到一个可行的解决方案,但也许有人已经知道了答案,并且可以帮我一个例子,或至少更具体的说明如何实现它? / p>
答案 0 :(得分:0)
您可以使用WrapperFrontendAction包装生成目标文件的EmitObjAction。在包装器操作中,您可以覆盖函数BeginInvocation()。在此函数中,您可以创建自己的ASTFrontendAction,遍历AST并使用Rewriter类执行文本更改。
当您的操作完成后,您可以访问Rewriter类中的缓冲区。您可以复制这些缓冲区,并使用addRemappedFile()将它们添加到PreprocessorOptions中。由于PreprocessorOptions附加到CompilerInstance,因此它们也被您包装的以下EmitObjAction使用。
这意味着EmitObjAction实际上会读取已更改的源文件。
您可以从Clang中FixItRecompile类的使用方式中获得灵感。