我一直在使用Tool.run(ToolAction)
来运行clang工具。如果我想在同一个输入源上运行多个工具,我是否只需创建不同的ToolAction
并逐个调用Tool.run
?或者以某种方式将ASTFrontendAction
链接在一起?
答案 0 :(得分:2)
这取决于你想要达到的目标。
如果你想解析一次,然后用AST做多件事,你应该更好地实现多个ASTConsumers。
然后你可以创建聚合ASTConsumer:
class AggregateASTConsumer : public clang::ASTConsumer {
public:
void HandleTranslationUnit(clang::ASTContext& Ctx) override {
for (auto consumer: consumers)
consumer.HandleTranslationUnit(Ctx);
}
std::vector<ASTConsumer*> consumers;
}
但是如果你想用一些不同的选项重新解析输入源代码,那么你应该多次运行工具。
答案 1 :(得分:1)
假设您有一个名为ClangTool
的{{1}}和两个分别名为Tool
和MatchFinder
的{{1}}(已经添加了适当的匹配器),则转换很简单是:
MatchFinder1
这样,AST节点在不同的匹配器运行之间仍然有效,并且可以正确地相互比较。
请注意,MatchFinder2
完全没有用这种方法使用,但是老实说,我不完全确定它实际上是做什么的。