aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-06-18 00:53:41 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-06-18 00:53:41 +0000
commite665d6929e11796620ff799bc0186ebd747bfc76 (patch)
tree674045cb6c17c790f19a161135db2d3c77e12a51 /lib
parent60a5e3f90031191f18128eab8326eea70b266b27 (diff)
[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
Diffstat (limited to 'lib')
-rw-r--r--lib/ARCMigrate/ARCMT.cpp10
-rw-r--r--lib/ARCMigrate/ARCMTActions.cpp17
-rw-r--r--lib/ARCMigrate/Internals.h2
-rw-r--r--lib/Frontend/FrontendAction.cpp8
4 files changed, 25 insertions, 12 deletions
diff --git a/lib/ARCMigrate/ARCMT.cpp b/lib/ARCMigrate/ARCMT.cpp
index a93f1c62c0..99980345c4 100644
--- a/lib/ARCMigrate/ARCMT.cpp
+++ b/lib/ARCMigrate/ARCMT.cpp
@@ -79,6 +79,14 @@ void CapturedDiagList::reportDiagnostics(Diagnostic &Diags) const {
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 @@ bool arcmt::checkForManualIssues(CompilerInvocation &origCI,
DiagClient->EndSourceFile();
- return Diags->getClient()->getNumErrors() > 0;
+ return capturedDiags.hasErrors();
}
//===----------------------------------------------------------------------===//
diff --git a/lib/ARCMigrate/ARCMTActions.cpp b/lib/ARCMigrate/ARCMTActions.cpp
index 4da928a0eb..7de62d289c 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 d0d545ec51..4f9b138a06 100644
--- a/lib/ARCMigrate/Internals.h
+++ b/lib/ARCMigrate/Internals.h
@@ -30,6 +30,8 @@ public:
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 0024818ad8..0128d6ee05 100644
--- a/lib/Frontend/FrontendAction.cpp
+++ b/lib/Frontend/FrontendAction.cpp
@@ -130,6 +130,9 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
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 @@ ASTConsumer *WrapperFrontendAction::CreateASTConsumer(CompilerInstance &CI,
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() {