如何将参数传递给 ASTFrontendAction

How to pass arguments to ASTFrontendAction

有没有办法在基于 libtooling 的程序中将构造函数参数传递给继承自 clang::ASTFrontendAction 的 类?我在网上找到的所有例子都是这样的:

int main() {
    ClangTool Tool(...);

    return Tool.run(newFrontendActionFactory<SomeFrontendAction>().get());
}

但是如果 SomeFrontendAction 需要注意,即工具用户传入的选项怎么办?我如何将它们传递给 SomeFrontendAction 的构造函数?

我在寻找这个问题的答案时找到了 this answer。您应该创建自己的 newFrontEndActionFactory 版本。 newFrontEndActionFactory 的原始代码是:

template <typename T>
std::unique_ptr<FrontendActionFactory> newFrontendActionFactory() {
  class SimpleFrontendActionFactory : public FrontendActionFactory {
   public:
    std::unique_ptr<FrontendAction> create() override {
      return std::make_unique<T>();
    }
  };
 
  return std::unique_ptr<FrontendActionFactory>(
      new SimpleFrontendActionFactory);
}

我用 SomeFrontendAction 替换了 T,向 class SimpleFrontendActionFactory 添加了一个构造函数,然后将选项传递给 SomeFrontendAction。结果函数看起来像这样:

std::unique_ptr<FrontendActionFactory> myNewFrontendActionFactory(string options) {
  class SimpleFrontendActionFactory : public FrontendActionFactory {
   public:
    SimpleFrontendActionFactory(string options) : mOptions(options) {}

    std::unique_ptr<FrontendAction> create() override {
      return std::make_unique<SomeFrontendAction>(options);
    }

   private:
    string mOptions;
  };
 
  return std::unique_ptr<FrontendActionFactory>(
      new SimpleFrontendActionFactory(options));
}

int main() {
  ClangTool Tool(...);

  return Tool.run(myNewFrontendActionFactory(options).get());
}