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(),
1987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                  CI.getPCHContainerOperations(),
20f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth                                  CI.getDiagnostics().getClient()))
21e665d6929e11796620ff799bc0186ebd747bfc76Argyrios Kyrtzidis    return false; // errors, stop the action.
22f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth
23f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  // We only want to see warnings reported from arcmt::checkForManualIssues.
24f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth  CI.getDiagnostics().setIgnoreAllWarnings(true);
25e665d6929e11796620ff799bc0186ebd747bfc76Argyrios Kyrtzidis  return true;
26f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth}
27f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth
284967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarCheckAction::CheckAction(std::unique_ptr<FrontendAction> WrappedAction)
294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  : WrapperFrontendAction(std::move(WrappedAction)) {}
30f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth
3169325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidisbool ModifyAction::BeginInvocation(CompilerInstance &CI) {
321f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor  return !arcmt::applyTransformations(CI.getInvocation(), getCurrentInput(),
3387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                      CI.getPCHContainerOperations(),
3469325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis                                      CI.getDiagnostics().getClient());
35f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth}
36f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth
374967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarModifyAction::ModifyAction(std::unique_ptr<FrontendAction> WrappedAction)
384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  : WrapperFrontendAction(std::move(WrappedAction)) {}
3969325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidis
4069325d5b7cfecf1b3128745efc33612aedf1b8b4Argyrios Kyrtzidisbool MigrateAction::BeginInvocation(CompilerInstance &CI) {
4187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (arcmt::migrateWithTemporaryFiles(
4287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar          CI.getInvocation(), getCurrentInput(), CI.getPCHContainerOperations(),
4387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar          CI.getDiagnostics().getClient(), MigrateDir, EmitPremigrationARCErros,
4487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar          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
524967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarMigrateAction::MigrateAction(std::unique_ptr<FrontendAction> WrappedAction,
535f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                             StringRef migrateDir,
545f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                             StringRef plistOut,
557ee2049278b98d42709380054eb83f4952af1200Argyrios Kyrtzidis                             bool emitPremigrationARCErrors)
564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  : WrapperFrontendAction(std::move(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