diff options
Diffstat (limited to 'clang-tools-extra/cpp11-migrate')
10 files changed, 148 insertions, 49 deletions
diff --git a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp index ee6679f28ea..d044002e10d 100644 --- a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp +++ b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp @@ -59,3 +59,17 @@ bool AddOverrideTransform::handleBeginSource(clang::CompilerInstance &CI, Fixer->setPreprocessor(CI.getPreprocessor()); return Transform::handleBeginSource(CI, Filename); } + +struct AddOverrideFactory : TransformFactory { + Transform *createTransform(const TransformOptions &Opts) LLVM_OVERRIDE { + return new AddOverrideTransform(Opts); + } +}; + +// Register the factory using this statically initialized variable. +static TransformFactoryRegistry::Add<AddOverrideFactory> +X("add-override", "Make use of override specifier where possible"); + +// This anchor is used to force the linker to link in the generated object file +// and thus register the factory. +volatile int AddOverrideTransformAnchorSource = 0; diff --git a/clang-tools-extra/cpp11-migrate/Core/Transform.cpp b/clang-tools-extra/cpp11-migrate/Core/Transform.cpp index b6872a7ebf9..ac3375316bb 100644 --- a/clang-tools-extra/cpp11-migrate/Core/Transform.cpp +++ b/clang-tools-extra/cpp11-migrate/Core/Transform.cpp @@ -131,3 +131,5 @@ void Transform::addTiming(llvm::StringRef Label, llvm::TimeRecord Duration) { FrontendActionFactory *Transform::createActionFactory(MatchFinder &Finder) { return new ActionFactory(Finder, /*Owner=*/ *this); } + +TransformFactory::~TransformFactory() {} diff --git a/clang-tools-extra/cpp11-migrate/Core/Transform.h b/clang-tools-extra/cpp11-migrate/Core/Transform.h index 1f4403c26b9..ca610b82b9d 100644 --- a/clang-tools-extra/cpp11-migrate/Core/Transform.h +++ b/clang-tools-extra/cpp11-migrate/Core/Transform.h @@ -20,8 +20,8 @@ #include "clang/Tooling/Refactoring.h" #include "llvm/ADT/OwningPtr.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Registry.h" #include "llvm/Support/Timer.h" - #include <string> #include <vector> @@ -222,4 +222,35 @@ private: unsigned DeferredChanges; }; +/// \brief A factory that can instantiate a specific transform. +/// +/// Each transform should subclass it and implement the \c createTransform() +/// methods. Use \c TransformFactoryRegistry to register the transform globally. +/// +/// Example: +/// \code +/// class MyTransform : public Transform { ... }; +/// +/// struct MyFactory : TransformFactory { +/// Transform *createTransform(const TransformOptions &Opts) LLVM_OVERRIDE { +/// return new MyTransform(Opts); +/// } +/// }; +/// +/// // Register the factory using this statically initialized variable. +/// static TransformFactoryRegistry::Add<MyFactory> +/// X("my-transform", "<Short description of my transform>"); +/// +/// // This anchor is used to force the linker to link in the generated object +/// // file and thus register the factory. +/// volatile int MyTransformAnchorSource = 0; +/// \endcode +class TransformFactory { +public: + virtual ~TransformFactory(); + virtual Transform *createTransform(const TransformOptions &) = 0; +}; + +typedef llvm::Registry<TransformFactory> TransformFactoryRegistry; + #endif // CPP11_MIGRATE_TRANSFORM_H diff --git a/clang-tools-extra/cpp11-migrate/Core/Transforms.cpp b/clang-tools-extra/cpp11-migrate/Core/Transforms.cpp index e42baa4ca1e..d58e4c6af70 100644 --- a/clang-tools-extra/cpp11-migrate/Core/Transforms.cpp +++ b/clang-tools-extra/cpp11-migrate/Core/Transforms.cpp @@ -20,31 +20,34 @@ namespace cl = llvm::cl; static cl::OptionCategory TransformCategory("Transforms"); Transforms::~Transforms() { - for (std::vector<Transform*>::iterator I = ChosenTransforms.begin(), - E = ChosenTransforms.end(); I != E; ++I) { + for (std::vector<Transform *>::iterator I = ChosenTransforms.begin(), + E = ChosenTransforms.end(); + I != E; ++I) delete *I; - } - for (OptionVec::iterator I = Options.begin(), - E = Options.end(); I != E; ++I) { - delete I->first; - } + + for (OptionMap::iterator I = Options.begin(), E = Options.end(); I != E; ++I) + delete I->getValue(); } -void Transforms::registerTransform(llvm::StringRef OptName, - llvm::StringRef Description, - TransformCreator Creator) { - Options.push_back(OptionVec::value_type( - new cl::opt<bool>(OptName.data(), cl::desc(Description.data()), - cl::cat(TransformCategory)), - Creator)); +void Transforms::registerTransforms() { + for (TransformFactoryRegistry::iterator I = TransformFactoryRegistry::begin(), + E = TransformFactoryRegistry::end(); + I != E; ++I) + Options[I->getName()] = new cl::opt<bool>( + I->getName(), cl::desc(I->getDesc()), cl::cat(TransformCategory)); } void Transforms::createSelectedTransforms(const TransformOptions &GlobalOptions) { - for (OptionVec::iterator I = Options.begin(), - E = Options.end(); I != E; ++I) { - if (*I->first) { - ChosenTransforms.push_back(I->second(GlobalOptions)); - } + for (TransformFactoryRegistry::iterator I = TransformFactoryRegistry::begin(), + E = TransformFactoryRegistry::end(); + I != E; ++I) { + bool OptionEnabled = *Options[I->getName()]; + + if (!OptionEnabled) + continue; + + llvm::OwningPtr<TransformFactory> Factory(I->instantiate()); + ChosenTransforms.push_back(Factory->createTransform(GlobalOptions)); } } diff --git a/clang-tools-extra/cpp11-migrate/Core/Transforms.h b/clang-tools-extra/cpp11-migrate/Core/Transforms.h index 53d039632a0..527474d0568 100644 --- a/clang-tools-extra/cpp11-migrate/Core/Transforms.h +++ b/clang-tools-extra/cpp11-migrate/Core/Transforms.h @@ -48,12 +48,11 @@ public: ~Transforms(); - /// \brief Registers a transform causing the transform to be made available - /// on the command line. + /// \brief Registers all available transforms causing them to be made + /// available on the command line. /// /// Be sure to register all transforms *before* parsing command line options. - void registerTransform(llvm::StringRef OptName, llvm::StringRef Description, - TransformCreator Creator); + void registerTransforms(); /// \brief Instantiate all transforms that were selected on the command line. /// @@ -69,12 +68,11 @@ public: const_iterator end() const { return ChosenTransforms.end(); } private: - typedef std::vector<std::pair<llvm::cl::opt<bool>*, TransformCreator> > - OptionVec; + typedef llvm::StringMap<llvm::cl::opt<bool> *> OptionMap; private: TransformVec ChosenTransforms; - OptionVec Options; + OptionMap Options; }; #endif // CPP11_MIGRATE_TRANSFORMS_H diff --git a/clang-tools-extra/cpp11-migrate/LoopConvert/LoopConvert.cpp b/clang-tools-extra/cpp11-migrate/LoopConvert/LoopConvert.cpp index cffc188bce1..965ae4b25d0 100644 --- a/clang-tools-extra/cpp11-migrate/LoopConvert/LoopConvert.cpp +++ b/clang-tools-extra/cpp11-migrate/LoopConvert/LoopConvert.cpp @@ -66,3 +66,17 @@ int LoopConvertTransform::apply(FileOverrides &InputStates, return 0; } + +struct LoopConvertFactory : TransformFactory { + Transform *createTransform(const TransformOptions &Opts) LLVM_OVERRIDE { + return new LoopConvertTransform(Opts); + } +}; + +// Register the factory using this statically initialized variable. +static TransformFactoryRegistry::Add<LoopConvertFactory> +X("loop-convert", "Make use of range-based for loops where possible"); + +// This anchor is used to force the linker to link in the generated object file +// and thus register the factory. +volatile int LoopConvertTransformAnchorSource = 0; diff --git a/clang-tools-extra/cpp11-migrate/ReplaceAutoPtr/ReplaceAutoPtr.cpp b/clang-tools-extra/cpp11-migrate/ReplaceAutoPtr/ReplaceAutoPtr.cpp index b16a071c01e..9d281ecdd67 100644 --- a/clang-tools-extra/cpp11-migrate/ReplaceAutoPtr/ReplaceAutoPtr.cpp +++ b/clang-tools-extra/cpp11-migrate/ReplaceAutoPtr/ReplaceAutoPtr.cpp @@ -48,3 +48,18 @@ ReplaceAutoPtrTransform::apply(FileOverrides &InputStates, return 0; } + +struct ReplaceAutoPtrFactory : TransformFactory { + Transform *createTransform(const TransformOptions &Opts) LLVM_OVERRIDE { + return new ReplaceAutoPtrTransform(Opts); + } +}; + +// Register the factory using this statically initialized variable. +static TransformFactoryRegistry::Add<ReplaceAutoPtrFactory> +X("replace-auto_ptr", "Replace std::auto_ptr (deprecated) by std::unique_ptr" + " (EXPERIMENTAL)"); + +// This anchor is used to force the linker to link in the generated object file +// and thus register the factory. +volatile int ReplaceAutoPtrTransformAnchorSource = 0; diff --git a/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.cpp b/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.cpp index b85f54712a7..47c2cd53215 100644 --- a/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.cpp +++ b/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.cpp @@ -47,3 +47,17 @@ int UseAutoTransform::apply(FileOverrides &InputStates, return 0; } + +struct UseAutoFactory : TransformFactory { + Transform *createTransform(const TransformOptions &Opts) LLVM_OVERRIDE { + return new UseAutoTransform(Opts); + } +}; + +// Register the factory using this statically initialized variable. +static TransformFactoryRegistry::Add<UseAutoFactory> +X("use-auto", "Use of 'auto' type specifier"); + +// This anchor is used to force the linker to link in the generated object file +// and thus register the factory. +volatile int UseAutoTransformAnchorSource = 0; diff --git a/clang-tools-extra/cpp11-migrate/UseNullptr/UseNullptr.cpp b/clang-tools-extra/cpp11-migrate/UseNullptr/UseNullptr.cpp index 3e294b07943..ba433ec77ae 100644 --- a/clang-tools-extra/cpp11-migrate/UseNullptr/UseNullptr.cpp +++ b/clang-tools-extra/cpp11-migrate/UseNullptr/UseNullptr.cpp @@ -48,3 +48,17 @@ int UseNullptrTransform::apply(FileOverrides &InputStates, return 0; } + +struct UseNullptrFactory : TransformFactory { + Transform *createTransform(const TransformOptions &Opts) LLVM_OVERRIDE { + return new UseNullptrTransform(Opts); + } +}; + +// Register the factory using this statically initialized variable. +static TransformFactoryRegistry::Add<UseNullptrFactory> +X("use-nullptr", "Make use of nullptr keyword where possible"); + +// This anchor is used to force the linker to link in the generated object file +// and thus register the factory. +volatile int UseNullptrTransformAnchorSource = 0; diff --git a/clang-tools-extra/cpp11-migrate/tool/Cpp11Migrate.cpp b/clang-tools-extra/cpp11-migrate/tool/Cpp11Migrate.cpp index b5b6a410ab0..2ee4a069ff3 100644 --- a/clang-tools-extra/cpp11-migrate/tool/Cpp11Migrate.cpp +++ b/clang-tools-extra/cpp11-migrate/tool/Cpp11Migrate.cpp @@ -21,11 +21,6 @@ #include "Core/Transform.h" #include "Core/Transforms.h" #include "Core/Reformatting.h" -#include "LoopConvert/LoopConvert.h" -#include "UseNullptr/UseNullptr.h" -#include "UseAuto/UseAuto.h" -#include "AddOverride/AddOverride.h" -#include "ReplaceAutoPtr/ReplaceAutoPtr.h" #include "clang/Frontend/FrontendActions.h" #include "clang/Tooling/CommonOptionsParser.h" #include "clang/Tooling/Tooling.h" @@ -156,23 +151,7 @@ int main(int argc, const char **argv) { llvm::sys::PrintStackTraceOnErrorSignal(); Transforms TransformManager; - TransformManager.registerTransform( - "loop-convert", "Make use of range-based for loops where possible", - &ConstructTransform<LoopConvertTransform>); - TransformManager.registerTransform( - "use-nullptr", "Make use of nullptr keyword where possible", - &ConstructTransform<UseNullptrTransform>); - TransformManager.registerTransform( - "use-auto", "Use of 'auto' type specifier", - &ConstructTransform<UseAutoTransform>); - TransformManager.registerTransform( - "add-override", "Make use of override specifier where possible", - &ConstructTransform<AddOverrideTransform>); - TransformManager.registerTransform( - "replace-auto_ptr", "Replace auto_ptr (deprecated) by unique_ptr" - " (EXPERIMENTAL)", - &ConstructTransform<ReplaceAutoPtrTransform>); - // Add more transform options here. + TransformManager.registerTransforms(); // This causes options to be parsed. CommonOptionsParser OptionsParser(argc, argv); @@ -293,3 +272,18 @@ int main(int argc, const char **argv) { return 0; } + +// These anchors are used to force the linker to link the transforms +extern volatile int AddOverrideTransformAnchorSource; +extern volatile int LoopConvertTransformAnchorSource; +extern volatile int ReplaceAutoPtrTransformAnchorSource; +extern volatile int UseAutoTransformAnchorSource; +extern volatile int UseNullptrTransformAnchorSource; + +static int TransformsAnchorsDestination[] = { + AddOverrideTransformAnchorSource, + LoopConvertTransformAnchorSource, + ReplaceAutoPtrTransformAnchorSource, + UseAutoTransformAnchorSource, + UseNullptrTransformAnchorSource +}; |

