如何将参数传递给 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());
}
有没有办法在基于 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());
}