我已经能够实现ASTFrontendAction
来创建ASTConsumer
,它使用RescursiveASTVisitor
遍历翻译单元decl,从而访问AST的所有节点对于给定的源文件。我是通过实现传递给ToolAction
的{{1}}来实现的。此工具会覆盖ClangTool::run(ToolAction *action)
成员函数,以便在每次调用ToolAction::runInvocation
之间进行一些处理。到目前为止一切顺利,一切都按预期工作,我的自定义clang工具正在帮助我更好地探索一个超过15年的代码库。
但是,每次我想运行我的工具时,我都需要对AST进行全面的解析。正如我所提到的,这是一个相当大的代码库,所以一次运行需要一段时间。通过查看代码,我收集了可以从保存的文件创建和遍历AST,而不是执行解析。谷歌搜索确认可以保存AST,通过查看ASTFrontendAction
和ClangTool
API,它似乎很容易做到。
虽然保存 AST似乎很简单,但在运行我的自定义clang工具时,我不知道如何使用保存的AST。查看运行工具的代码路径,我发现有一个点可以通过解析源文件或从文件中读取来创建AST。我想要做的是将所有AST都放在一个文件中,这样我的工具的每次运行都会从一个文件创建AST,而不需要执行完整的解析(我认为这会很多)快)。
有人可以帮忙吗?提前谢谢!
答案 0 :(得分:0)
这对我有用:
clang::CompilerInstance CI;
CI.createDiagnostics();
std::shared_ptr<clang::TargetOptions> TO = std::make_shared<clang::TargetOptions>();
TO->Triple = "x86_64-pc-win32"; // see clang -v
CI.setTarget(clang::TargetInfo::CreateTargetInfo(CI.getDiagnostics(), TO));
std::unique_ptr<ASTUnit> ast = ASTUnit::LoadFromASTFile("TheAstFile.ast",
CI.getPCHContainerReader(),
ASTUnit::LoadEverything,
&CI.getDiagnostics(),
CI.getFileSystemOpts());
MyAstConsumer consumer(ast->getASTContext());
consumer.HandleTranslationUnit(ast->getASTContext());