Port loop-convert into cpp11-migrate
    
Took existing code from loop-convert tool and made it into a cpp11-migrate
transform. Pattern now set for having transform code in subdirectories. Related
changes:
- Makefile and CMakeLists.txt updated to support source files in
  subdirectories.
- At least one transform must be specified. syntax-only tests removed to
  reflect this.
- TODO: port over loop-convert tests.

Reviewers: klimek, silvas
llvm-svn: 171481
diff --git a/clang-tools-extra/cpp11-migrate/Cpp11Migrate.cpp b/clang-tools-extra/cpp11-migrate/Cpp11Migrate.cpp
index 7bd4cbd..08ae3e0d 100644
--- a/clang-tools-extra/cpp11-migrate/Cpp11Migrate.cpp
+++ b/clang-tools-extra/cpp11-migrate/Cpp11Migrate.cpp
@@ -27,21 +27,44 @@
 ///
 //===----------------------------------------------------------------------===//
 
-#include "clang/Basic/FileManager.h"
-#include "clang/Frontend/CompilerInstance.h"
 #include "clang/Frontend/FrontendActions.h"
 #include "clang/Tooling/CommonOptionsParser.h"
-#include "clang/Tooling/Refactoring.h"
 #include "clang/Tooling/Tooling.h"
+#include "Transforms.h"
+#include "Transform.h"
 
 namespace cl = llvm::cl;
 using namespace clang::tooling;
 
+static cl::opt<RiskLevel>
+MaxRiskLevel("risk", cl::desc("Select a maximum risk level:"),
+             cl::values(
+               clEnumValN(RL_Safe, "safe", "Only safe transformations"),
+                 clEnumValN(RL_Reasonable, "reasonable",
+                           "Enable transformations that might change "
+                           "semantics (default)"),
+                 clEnumValN(RL_Risky, "risky",
+                           "Enable transformations that are likely to "
+                           "change semantics"),
+               clEnumValEnd),
+             cl::init(RL_Reasonable));
 
 int main(int argc, const char **argv) {
+  Transforms TransformManager;
+
+  TransformManager.createTransformOpts();
+
+  // This causes options to be parsed.
   CommonOptionsParser OptionsParser(argc, argv);
 
-  // TODO: Create transforms requested by command-line.
+  TransformManager.createSelectedTransforms();
+
+  if (TransformManager.begin() == TransformManager.end()) {
+    llvm::errs() << "No selected transforms\n";
+    return 1;
+  }
+
+  // Initial syntax check.
   ClangTool SyntaxTool(OptionsParser.getCompilations(),
                        OptionsParser.getSourcePathList());
 
@@ -51,7 +74,23 @@
     return 1;
   }
 
-  // TODO: Apply transforms
+  // Apply transforms.
+  for (Transforms::const_iterator I = TransformManager.begin(),
+       E = TransformManager.end(); I != E; ++I) {
+    if ((*I)->apply(MaxRiskLevel, OptionsParser.getCompilations(),
+                    OptionsParser.getSourcePathList()) != 0) {
+      return 1;
+    }
+  }
+
+  // Final Syntax check.
+  ClangTool EndSyntaxTool(OptionsParser.getCompilations(),
+                          OptionsParser.getSourcePathList());
+  if (EndSyntaxTool.run(
+        newFrontendActionFactory<clang::SyntaxOnlyAction>()) != 0) {
+    // FIXME: Revert changes made to files that fail the syntax test.
+    return 1;
+  }
 
   return 0;
 }