summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/cpp11-migrate
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/cpp11-migrate')
-rw-r--r--clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp14
-rw-r--r--clang-tools-extra/cpp11-migrate/Core/Transform.cpp2
-rw-r--r--clang-tools-extra/cpp11-migrate/Core/Transform.h33
-rw-r--r--clang-tools-extra/cpp11-migrate/Core/Transforms.cpp41
-rw-r--r--clang-tools-extra/cpp11-migrate/Core/Transforms.h12
-rw-r--r--clang-tools-extra/cpp11-migrate/LoopConvert/LoopConvert.cpp14
-rw-r--r--clang-tools-extra/cpp11-migrate/ReplaceAutoPtr/ReplaceAutoPtr.cpp15
-rw-r--r--clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.cpp14
-rw-r--r--clang-tools-extra/cpp11-migrate/UseNullptr/UseNullptr.cpp14
-rw-r--r--clang-tools-extra/cpp11-migrate/tool/Cpp11Migrate.cpp38
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
+};
OpenPOWER on IntegriCloud