diff options
Diffstat (limited to 'include/clang/Tooling/Tooling.h')
-rw-r--r-- | include/clang/Tooling/Tooling.h | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/include/clang/Tooling/Tooling.h b/include/clang/Tooling/Tooling.h index e06705f..a03bcb1 100644 --- a/include/clang/Tooling/Tooling.h +++ b/include/clang/Tooling/Tooling.h @@ -74,6 +74,14 @@ public: template <typename T> FrontendActionFactory *newFrontendActionFactory(); +/// \brief Called at the end of each source file when used with +/// \c newFrontendActionFactory. +class EndOfSourceFileCallback { +public: + virtual ~EndOfSourceFileCallback() {} + virtual void run() = 0; +}; + /// \brief Returns a new FrontendActionFactory for any type that provides an /// implementation of newASTConsumer(). /// @@ -87,7 +95,7 @@ FrontendActionFactory *newFrontendActionFactory(); /// newFrontendActionFactory(&Factory); template <typename FactoryT> inline FrontendActionFactory *newFrontendActionFactory( - FactoryT *ConsumerFactory); + FactoryT *ConsumerFactory, EndOfSourceFileCallback *EndCallback = NULL); /// \brief Runs (and deletes) the tool on 'Code' with the -fsyntax-only flag. /// @@ -99,6 +107,19 @@ inline FrontendActionFactory *newFrontendActionFactory( bool runToolOnCode(clang::FrontendAction *ToolAction, const Twine &Code, const Twine &FileName = "input.cc"); +/// \brief Runs (and deletes) the tool on 'Code' with the -fsyntax-only flag and +/// with additional other flags. +/// +/// \param ToolAction The action to run over the code. +/// \param Code C++ code. +/// \param Args Additional flags to pass on. +/// \param FileName The file name which 'Code' will be mapped as. +/// +/// \return - True if 'ToolAction' was successfully executed. +bool runToolOnCodeWithArgs(clang::FrontendAction *ToolAction, const Twine &Code, + const std::vector<std::string> &Args, + const Twine &FileName = "input.cc"); + /// \brief Utility to run a FrontendAction in a single clang invocation. class ToolInvocation { public: @@ -204,34 +225,45 @@ FrontendActionFactory *newFrontendActionFactory() { template <typename FactoryT> inline FrontendActionFactory *newFrontendActionFactory( - FactoryT *ConsumerFactory) { + FactoryT *ConsumerFactory, EndOfSourceFileCallback *EndCallback) { class FrontendActionFactoryAdapter : public FrontendActionFactory { public: - explicit FrontendActionFactoryAdapter(FactoryT *ConsumerFactory) - : ConsumerFactory(ConsumerFactory) {} + explicit FrontendActionFactoryAdapter(FactoryT *ConsumerFactory, + EndOfSourceFileCallback *EndCallback) + : ConsumerFactory(ConsumerFactory), EndCallback(EndCallback) {} virtual clang::FrontendAction *create() { - return new ConsumerFactoryAdaptor(ConsumerFactory); + return new ConsumerFactoryAdaptor(ConsumerFactory, EndCallback); } private: class ConsumerFactoryAdaptor : public clang::ASTFrontendAction { public: - ConsumerFactoryAdaptor(FactoryT *ConsumerFactory) - : ConsumerFactory(ConsumerFactory) {} + ConsumerFactoryAdaptor(FactoryT *ConsumerFactory, + EndOfSourceFileCallback *EndCallback) + : ConsumerFactory(ConsumerFactory), EndCallback(EndCallback) {} clang::ASTConsumer *CreateASTConsumer(clang::CompilerInstance &, llvm::StringRef) { return ConsumerFactory->newASTConsumer(); } + protected: + virtual void EndSourceFileAction() { + if (EndCallback != NULL) + EndCallback->run(); + clang::ASTFrontendAction::EndSourceFileAction(); + } + private: FactoryT *ConsumerFactory; + EndOfSourceFileCallback *EndCallback; }; FactoryT *ConsumerFactory; + EndOfSourceFileCallback *EndCallback; }; - return new FrontendActionFactoryAdapter(ConsumerFactory); + return new FrontendActionFactoryAdapter(ConsumerFactory, EndCallback); } /// \brief Returns the absolute path of \c File, by prepending it with |