1f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth//===--- ARCMTActions.cpp - ARC Migrate Tool Frontend Actions ---*- C++ -*-===//
2f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth//
3f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth//                     The LLVM Compiler Infrastructure
4f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth//
5f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth// This file is distributed under the University of Illinois Open Source
6f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth// License. See LICENSE.TXT for details.
7f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth//
8f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth//===----------------------------------------------------------------------===//
9f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth
10f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth#include "clang/ARCMigrate/ARCMTActions.h"
11f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth#include "clang/ARCMigrate/ARCMT.h"
12f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth#include "clang/Frontend/CompilerInstance.h"
13f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth
14f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruthusing namespace clang;
15f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruthusing namespace arcmt;
16f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth
17e665d6929e11796620ff799bc0186ebd747bfc76Argyrios Kyrtzidisbool CheckAction::BeginInvocation(CompilerInstance &CI) {
181f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  if (arcmt::checkForManualIssues(CI.getInvocation(), getCurrentInput(),
19f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth                                  CI.getDiagnostics().getClient()))
20e665d6929e11796620ff799bc0186ebd747bfc76Argyrios Kyrtzidis    return false; // errors, stop the action.
21f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth
22f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  // We only want to see warnings reported from arcmt::checkForManualIssues.
23f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  CI.getDiagnostics().setIgnoreAllWarnings(true);
24e665d6929e11796620ff799bc0186ebd747bfc76Argyrios Kyrtzidis  return true;
25f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth}
26f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth
27f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler CarruthCheckAction::CheckAction(FrontendAction *WrappedAction)
28f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  : WrapperFrontendAction(WrappedAction) {}
29f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth
3069325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidisbool ModifyAction::BeginInvocation(CompilerInstance &CI) {
311f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  return !arcmt::applyTransformations(CI.getInvocation(), getCurrentInput(),
3269325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis                                      CI.getDiagnostics().getClient());
33f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth}
34f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth
3569325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios KyrtzidisModifyAction::ModifyAction(FrontendAction *WrappedAction)
36f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  : WrapperFrontendAction(WrappedAction) {}
3769325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis
3869325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidisbool MigrateAction::BeginInvocation(CompilerInstance &CI) {
397ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis  if (arcmt::migrateWithTemporaryFiles(CI.getInvocation(),
401f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor                                       getCurrentInput(),
411f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor                                       CI.getDiagnostics().getClient(),
421f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor                                       MigrateDir,
431f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor                                       EmitPremigrationARCErros,
441f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor                                       PlistOut))
457ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis    return false; // errors, stop the action.
467ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis
477ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis  // We only want to see diagnostics emitted by migrateWithTemporaryFiles.
487ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis  CI.getDiagnostics().setIgnoreAllWarnings(true);
497ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis  return true;
5069325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis}
5169325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis
5269325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios KyrtzidisMigrateAction::MigrateAction(FrontendAction *WrappedAction,
535f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                             StringRef migrateDir,
545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                             StringRef plistOut,
557ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis                             bool emitPremigrationARCErrors)
567ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis  : WrapperFrontendAction(WrappedAction), MigrateDir(migrateDir),
577ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis    PlistOut(plistOut), EmitPremigrationARCErros(emitPremigrationARCErrors) {
5869325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis  if (MigrateDir.empty())
5969325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis    MigrateDir = "."; // user current directory if none is given.
6069325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis}
61