[arcmt] Fix the ARC migrator. -arcmt-modify requires running before the initialization of SourceManager
because it is going to modify the input file.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@133323 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/ARCMigrate/ARCMT.cpp b/lib/ARCMigrate/ARCMT.cpp
index a93f1c6..9998034 100644
--- a/lib/ARCMigrate/ARCMT.cpp
+++ b/lib/ARCMigrate/ARCMT.cpp
@@ -79,6 +79,14 @@
     Diags.Report(*I);
 }
 
+bool CapturedDiagList::hasErrors() const {
+  for (ListTy::const_iterator I = List.begin(), E = List.end(); I != E; ++I)
+    if (I->getLevel() >= Diagnostic::Error)
+      return true;
+
+  return false;
+}
+
 namespace {
 
 class CaptureDiagnosticClient : public DiagnosticClient {
@@ -236,7 +244,7 @@
 
   DiagClient->EndSourceFile();
 
-  return Diags->getClient()->getNumErrors() > 0;
+  return capturedDiags.hasErrors();
 }
 
 //===----------------------------------------------------------------------===//
diff --git a/lib/ARCMigrate/ARCMTActions.cpp b/lib/ARCMigrate/ARCMTActions.cpp
index 4da928a..7de62d2 100644
--- a/lib/ARCMigrate/ARCMTActions.cpp
+++ b/lib/ARCMigrate/ARCMTActions.cpp
@@ -14,29 +14,24 @@
 using namespace clang;
 using namespace arcmt;
 
-void CheckAction::ExecuteAction() {
-  CompilerInstance &CI = getCompilerInstance();
+bool CheckAction::BeginInvocation(CompilerInstance &CI) {
   if (arcmt::checkForManualIssues(CI.getInvocation(), getCurrentFile(),
                                   getCurrentFileKind(),
                                   CI.getDiagnostics().getClient()))
-    return;
+    return false; // errors, stop the action.
 
   // We only want to see warnings reported from arcmt::checkForManualIssues.
   CI.getDiagnostics().setIgnoreAllWarnings(true);
-  WrapperFrontendAction::ExecuteAction();
+  return true;
 }
 
 CheckAction::CheckAction(FrontendAction *WrappedAction)
   : WrapperFrontendAction(WrappedAction) {}
 
-void TransformationAction::ExecuteAction() {
-  CompilerInstance &CI = getCompilerInstance();
-  if (arcmt::applyTransformations(CI.getInvocation(), getCurrentFile(),
+bool TransformationAction::BeginInvocation(CompilerInstance &CI) {
+  return !arcmt::applyTransformations(CI.getInvocation(), getCurrentFile(),
                                   getCurrentFileKind(),
-                                  CI.getDiagnostics().getClient()))
-    return;
-
-  WrapperFrontendAction::ExecuteAction();
+                                  CI.getDiagnostics().getClient());
 }
 
 TransformationAction::TransformationAction(FrontendAction *WrappedAction)
diff --git a/lib/ARCMigrate/Internals.h b/lib/ARCMigrate/Internals.h
index d0d545e..4f9b138 100644
--- a/lib/ARCMigrate/Internals.h
+++ b/lib/ARCMigrate/Internals.h
@@ -30,6 +30,8 @@
   bool hasDiagnostic(llvm::ArrayRef<unsigned> IDs, SourceRange range) const;
 
   void reportDiagnostics(Diagnostic &diags) const;
+
+  bool hasErrors() const;
 };
 
 class TransformActions {
diff --git a/lib/Frontend/FrontendAction.cpp b/lib/Frontend/FrontendAction.cpp
index 0024818..0128d6e 100644
--- a/lib/Frontend/FrontendAction.cpp
+++ b/lib/Frontend/FrontendAction.cpp
@@ -130,6 +130,9 @@
   setCurrentFile(Filename, InputKind);
   setCompilerInstance(&CI);
 
+  if (!BeginInvocation(CI))
+    goto failure;
+
   // AST files follow a very different path, since they share objects via the
   // AST unit.
   if (InputKind == IK_AST) {
@@ -386,8 +389,13 @@
                                                       llvm::StringRef InFile) {
   return WrappedAction->CreateASTConsumer(CI, InFile);
 }
+bool WrapperFrontendAction::BeginInvocation(CompilerInstance &CI) {
+  return WrappedAction->BeginInvocation(CI);
+}
 bool WrapperFrontendAction::BeginSourceFileAction(CompilerInstance &CI,
                                                   llvm::StringRef Filename) {
+  WrappedAction->setCurrentFile(getCurrentFile(), getCurrentFileKind());
+  WrappedAction->setCompilerInstance(&CI);
   return WrappedAction->BeginSourceFileAction(CI, Filename);
 }
 void WrapperFrontendAction::ExecuteAction() {