r182864 - Tooling: Call back for both begin and end of sources
Vane, Edwin
edwin.vane at intel.com
Mon Jun 3 08:06:41 PDT 2013
This was the sort of question I had originally: is a begin callback useful enough to be put in Tooling code? Then I thought: if an end callback is available it only makes sense to have a begin callback for symmetry. Otherwise, one day someone will come along and, like me, say: "Here's an end callback but no begin callback but it's the begin callback I really want. Why is it missing?"
If the callback is a problem I'll remove it and add a custom FrontendAction where it's needed in the migrator.
> -----Original Message-----
> From: Manuel Klimek [mailto:klimek at google.com]
> Sent: Monday, June 03, 2013 8:59 AM
> To: Vane, Edwin
> Cc: cfe-commits at cs.uiuc.edu
> Subject: Re: r182864 - Tooling: Call back for both begin and end of sources
>
> 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&r
> 2=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
>
>
More information about the cfe-commits
mailing list