跑多个铿锵声

时间:2017-10-13 06:17:45

标签: clang llvm-clang

我一直在使用Tool.run(ToolAction)来运行clang工具。如果我想在同一个输入源上运行多个工具,我是否只需创建不同的ToolAction并逐个调用Tool.run?或者以某种方式将ASTFrontendAction链接在一起?

2 个答案:

答案 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}}和两个分别名为ToolMatchFinder的{​​{1}}(已经添加了适当的匹配器),则转换很简单是:

MatchFinder1

这样,AST节点在不同的匹配器运行之间仍然有效,并且可以正确地相互比较。

请注意,MatchFinder2完全没有用这种方法使用,但是老实说,我不完全确定它实际上是做什么的。