From e6df0ce08fcdf9f906556d98cca96d38ab440bba Mon Sep 17 00:00:00 2001 From: Manuel Klimek Date: Thu, 5 Jul 2012 18:13:01 +0000 Subject: [PATCH] Adapts the FrontendAction convenience functions so that it can be used with classes that generate ASTConsumers; this allows decoupling the ASTConsumer generation from the Frontend library (like, for example, the MatchFinder in the upcoming ASTMatcher patch). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159760 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Tooling/Tooling.h | 36 +++++++++++++++++++++---------- lib/Tooling/Tooling.cpp | 1 - unittests/Tooling/TestVisitor.h | 4 ++-- unittests/Tooling/ToolingTest.cpp | 4 +++- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/include/clang/Tooling/Tooling.h b/include/clang/Tooling/Tooling.h index 8ab2769cce..0e1dd58ac9 100644 --- a/include/clang/Tooling/Tooling.h +++ b/include/clang/Tooling/Tooling.h @@ -35,6 +35,7 @@ #include "clang/Basic/FileManager.h" #include "clang/Basic/LLVM.h" #include "clang/Driver/Util.h" +#include "clang/Frontend/FrontendAction.h" #include "clang/Tooling/ArgumentsAdjusters.h" #include "clang/Tooling/CompilationDatabase.h" #include @@ -74,18 +75,18 @@ template FrontendActionFactory *newFrontendActionFactory(); /// \brief Returns a new FrontendActionFactory for any type that provides an -/// implementation of newFrontendAction(). +/// implementation of newASTConsumer(). /// -/// FactoryT must implement: FrontendAction *newFrontendAction(). +/// FactoryT must implement: ASTConsumer *newASTConsumer(). /// /// Example: -/// struct ProvidesFrontendActions { -/// FrontendAction *newFrontendAction(); +/// struct ProvidesASTConsumers { +/// clang::ASTConsumer *newASTConsumer(); /// } Factory; /// FrontendActionFactory *FactoryAdapter = /// newFrontendActionFactory(&Factory); template -FrontendActionFactory *newFrontendActionFactory(FactoryT *ActionFactory); +FrontendActionFactory *newFrontendActionFactory(FactoryT *ConsumerFactory); /// \brief Runs (and deletes) the tool on 'Code' with the -fsyntax-only flag. /// @@ -201,21 +202,34 @@ FrontendActionFactory *newFrontendActionFactory() { } template -FrontendActionFactory *newFrontendActionFactory(FactoryT *ActionFactory) { +FrontendActionFactory *newFrontendActionFactory(FactoryT *ConsumerFactory) { class FrontendActionFactoryAdapter : public FrontendActionFactory { public: - explicit FrontendActionFactoryAdapter(FactoryT *ActionFactory) - : ActionFactory(ActionFactory) {} + explicit FrontendActionFactoryAdapter(FactoryT *ConsumerFactory) + : ConsumerFactory(ConsumerFactory) {} virtual clang::FrontendAction *create() { - return ActionFactory->newFrontendAction(); + return new ConsumerFactoryAdaptor(ConsumerFactory); } private: - FactoryT *ActionFactory; + class ConsumerFactoryAdaptor : public clang::ASTFrontendAction { + public: + ConsumerFactoryAdaptor(FactoryT *ConsumerFactory) + : ConsumerFactory(ConsumerFactory) {} + + clang::ASTConsumer *CreateASTConsumer(clang::CompilerInstance &, + llvm::StringRef) { + return ConsumerFactory->newASTConsumer(); + } + + private: + FactoryT *ConsumerFactory; + }; + FactoryT *ConsumerFactory; }; - return new FrontendActionFactoryAdapter(ActionFactory); + return new FrontendActionFactoryAdapter(ConsumerFactory); } } // end namespace tooling diff --git a/lib/Tooling/Tooling.cpp b/lib/Tooling/Tooling.cpp index a449e105bf..abac182b21 100644 --- a/lib/Tooling/Tooling.cpp +++ b/lib/Tooling/Tooling.cpp @@ -19,7 +19,6 @@ #include "clang/Driver/Driver.h" #include "clang/Driver/Tool.h" #include "clang/Frontend/CompilerInstance.h" -#include "clang/Frontend/FrontendAction.h" #include "clang/Frontend/FrontendDiagnostic.h" #include "clang/Frontend/TextDiagnosticPrinter.h" #include "llvm/ADT/STLExtras.h" diff --git a/unittests/Tooling/TestVisitor.h b/unittests/Tooling/TestVisitor.h index f73d2e0c2f..d439d81d89 100644 --- a/unittests/Tooling/TestVisitor.h +++ b/unittests/Tooling/TestVisitor.h @@ -56,6 +56,7 @@ protected: FindConsumer(TestVisitor *Visitor) : Visitor(Visitor) {} virtual void HandleTranslationUnit(clang::ASTContext &Context) { + Visitor->Context = &Context; Visitor->TraverseDecl(Context.getTranslationUnitDecl()); } @@ -68,8 +69,7 @@ protected: TestAction(TestVisitor *Visitor) : Visitor(Visitor) {} virtual clang::ASTConsumer* CreateASTConsumer( - CompilerInstance& compiler, llvm::StringRef dummy) { - Visitor->Context = &compiler.getASTContext(); + CompilerInstance&, llvm::StringRef dummy) { /// TestConsumer will be deleted by the framework calling us. return new FindConsumer(Visitor); } diff --git a/unittests/Tooling/ToolingTest.cpp b/unittests/Tooling/ToolingTest.cpp index f6681f8153..fb3af2678c 100644 --- a/unittests/Tooling/ToolingTest.cpp +++ b/unittests/Tooling/ToolingTest.cpp @@ -104,7 +104,9 @@ TEST(newFrontendActionFactory, CreatesFrontendActionFactoryFromType) { } struct IndependentFrontendActionCreator { - FrontendAction *newFrontendAction() { return new SyntaxOnlyAction; } + ASTConsumer *newASTConsumer() { + return new FindTopLevelDeclConsumer(NULL); + } }; TEST(newFrontendActionFactory, CreatesFrontendActionFactoryFromFactoryType) { -- 2.40.0