r182864 - Tooling: Call back for both begin and end of sources

Manuel Klimek klimek at google.com
Mon Jun 3 05:59:29 PDT 2013


Hmm... My main concern is whether this is really common enough that we
don't want to just write FrontendActions for where we need it (it's not
hard to write your own FrontendAction - the methods in tooling are mainly
there to make the very common use cases less code to write).


On Wed, May 29, 2013 at 6:01 PM, Edwin Vane <edwin.vane at intel.com> wrote:

> Author: revane
> Date: Wed May 29 11:01:10 2013
> New Revision: 182864
>
> URL: http://llvm.org/viewvc/llvm-project?rev=182864&view=rev
> Log:
> Tooling: Call back for both begin and end of sources
>
> newFrontendActionFactory() took a pointer to a callback to call when a
> source
> file was done being processed by an action. This revision updates the
> callback
> to include an ante-processing callback as well.
>
> Callback-providing class renamed and callback functions themselves renamed.
> Functions are no longer pure-virtual so users aren't forced to implement
> both
> callbacks if one isn't needed.
>
>
> Modified:
>     cfe/trunk/include/clang/Tooling/Tooling.h
>     cfe/trunk/unittests/Tooling/ToolingTest.cpp
>
> Modified: cfe/trunk/include/clang/Tooling/Tooling.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Tooling/Tooling.h?rev=182864&r1=182863&r2=182864&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Tooling/Tooling.h (original)
> +++ cfe/trunk/include/clang/Tooling/Tooling.h Wed May 29 11:01:10 2013
> @@ -74,12 +74,22 @@ public:
>  template <typename T>
>  FrontendActionFactory *newFrontendActionFactory();
>
> -/// \brief Called at the end of each source file when used with
> -/// \c newFrontendActionFactory.
> -class EndOfSourceFileCallback {
> +/// \brief Callbacks called before and after each source file processed
> by a
> +/// FrontendAction created by the FrontedActionFactory returned by \c
> +/// newFrontendActionFactory.
> +class SourceFileCallbacks {
>  public:
> -  virtual ~EndOfSourceFileCallback() {}
> -  virtual void run() = 0;
> +  virtual ~SourceFileCallbacks() {}
> +
> +  /// \brief Called before a source file is processed by a FrontEndAction.
>

FrontendAction.


> +  /// \see clang::FrontendAction::BeginSourceFileAction
> +  virtual bool BeginSource(CompilerInstance &CI, StringRef Filename) {
> +    return true;
> +  }
> +
> +  /// \brief Called after a source file is processed by a FrontendAction.
> +  /// \see clang::FrontendAction::EndSourceFileAction
> +  virtual void EndSource() {}
>  };
>
>  /// \brief Returns a new FrontendActionFactory for any type that provides
> an
> @@ -95,7 +105,7 @@ public:
>  ///   newFrontendActionFactory(&Factory);
>  template <typename FactoryT>
>  inline FrontendActionFactory *newFrontendActionFactory(
> -    FactoryT *ConsumerFactory, EndOfSourceFileCallback *EndCallback =
> NULL);
> +    FactoryT *ConsumerFactory, SourceFileCallbacks *Callbacks = NULL);
>
>  /// \brief Runs (and deletes) the tool on 'Code' with the -fsyntax-only
> flag.
>  ///
> @@ -226,23 +236,23 @@ FrontendActionFactory *newFrontendAction
>
>  template <typename FactoryT>
>  inline FrontendActionFactory *newFrontendActionFactory(
> -    FactoryT *ConsumerFactory, EndOfSourceFileCallback *EndCallback) {
> +    FactoryT *ConsumerFactory, SourceFileCallbacks *Callbacks) {
>    class FrontendActionFactoryAdapter : public FrontendActionFactory {
>    public:
>      explicit FrontendActionFactoryAdapter(FactoryT *ConsumerFactory,
> -                                          EndOfSourceFileCallback
> *EndCallback)
> -      : ConsumerFactory(ConsumerFactory), EndCallback(EndCallback) {}
> +                                          SourceFileCallbacks *Callbacks)
> +      : ConsumerFactory(ConsumerFactory), Callbacks(Callbacks) {}
>
>      virtual clang::FrontendAction *create() {
> -      return new ConsumerFactoryAdaptor(ConsumerFactory, EndCallback);
> +      return new ConsumerFactoryAdaptor(ConsumerFactory, Callbacks);
>      }
>
>    private:
>      class ConsumerFactoryAdaptor : public clang::ASTFrontendAction {
>      public:
>        ConsumerFactoryAdaptor(FactoryT *ConsumerFactory,
> -                             EndOfSourceFileCallback *EndCallback)
> -        : ConsumerFactory(ConsumerFactory), EndCallback(EndCallback) {}
> +                             SourceFileCallbacks *Callbacks)
> +        : ConsumerFactory(ConsumerFactory), Callbacks(Callbacks) {}
>
>        clang::ASTConsumer *CreateASTConsumer(clang::CompilerInstance &,
>                                              StringRef) {
> @@ -250,21 +260,29 @@ inline FrontendActionFactory *newFronten
>        }
>
>      protected:
> -      virtual void EndSourceFileAction() {
> -        if (EndCallback != NULL)
> -          EndCallback->run();
> +      virtual bool BeginSourceFileAction(CompilerInstance &CI,
> +                                         StringRef Filename)
> LLVM_OVERRIDE {
> +        if (!clang::ASTFrontendAction::BeginSourceFileAction(CI,
> Filename))
> +          return false;
> +        if (Callbacks != NULL)
> +          return Callbacks->BeginSource(CI, Filename);
> +        return true;
> +      }
> +      virtual void EndSourceFileAction() LLVM_OVERRIDE {
> +        if (Callbacks != NULL)
> +          Callbacks->EndSource();
>          clang::ASTFrontendAction::EndSourceFileAction();
>        }
>
>      private:
>        FactoryT *ConsumerFactory;
> -      EndOfSourceFileCallback *EndCallback;
> +      SourceFileCallbacks *Callbacks;
>      };
>      FactoryT *ConsumerFactory;
> -    EndOfSourceFileCallback *EndCallback;
> +    SourceFileCallbacks *Callbacks;
>    };
>
> -  return new FrontendActionFactoryAdapter(ConsumerFactory, EndCallback);
> +  return new FrontendActionFactoryAdapter(ConsumerFactory, Callbacks);
>  }
>
>  /// \brief Returns the absolute path of \c File, by prepending it with
>
> Modified: cfe/trunk/unittests/Tooling/ToolingTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Tooling/ToolingTest.cpp?rev=182864&r1=182863&r2=182864&view=diff
>
> ==============================================================================
> --- cfe/trunk/unittests/Tooling/ToolingTest.cpp (original)
> +++ cfe/trunk/unittests/Tooling/ToolingTest.cpp Wed May 29 11:01:10 2013
> @@ -131,20 +131,26 @@ TEST(ToolInvocation, TestMapVirtualFile)
>    EXPECT_TRUE(Invocation.run());
>  }
>
> -struct VerifyEndCallback : public EndOfSourceFileCallback {
> -  VerifyEndCallback() : Called(0), Matched(false) {}
> -  virtual void run() {
> -    ++Called;
> +struct VerifyEndCallback : public SourceFileCallbacks {
> +  VerifyEndCallback() : BeginCalled(0), EndCalled(0), Matched(false) {}
> +  virtual bool BeginSource(CompilerInstance &CI,
> +                           StringRef Filename) LLVM_OVERRIDE {
> +    ++BeginCalled;
> +    return true;
> +  }
> +  virtual void EndSource() {
> +    ++EndCalled;
>    }
>    ASTConsumer *newASTConsumer() {
>      return new FindTopLevelDeclConsumer(&Matched);
>    }
> -  unsigned Called;
> +  unsigned BeginCalled;
> +  unsigned EndCalled;
>    bool Matched;
>  };
>
>  #if !defined(_WIN32)
> -TEST(newFrontendActionFactory, InjectsEndOfSourceFileCallback) {
> +TEST(newFrontendActionFactory, InjectsSourceFileCallbacks) {
>    VerifyEndCallback EndCallback;
>
>    FixedCompilationDatabase Compilations("/", std::vector<std::string>());
> @@ -159,7 +165,8 @@ TEST(newFrontendActionFactory, InjectsEn
>    Tool.run(newFrontendActionFactory(&EndCallback, &EndCallback));
>
>    EXPECT_TRUE(EndCallback.Matched);
> -  EXPECT_EQ(2u, EndCallback.Called);
> +  EXPECT_EQ(2u, EndCallback.BeginCalled);
> +  EXPECT_EQ(2u, EndCallback.EndCalled);
>  }
>  #endif
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130603/9a58175a/attachment.html>


More information about the cfe-commits mailing list