//===--- ARCMTActions.cpp - ARC Migrate Tool Frontend Actions ---*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "clang/ARCMigrate/ARCMTActions.h"
#include "clang/ARCMigrate/ARCMT.h"
#include "clang/Frontend/CompilerInstance.h"

using namespace clang;
using namespace arcmt;

bool CheckAction::BeginInvocation(CompilerInstance &CI) {
  if (arcmt::checkForManualIssues(CI.getInvocation(), getCurrentInput(),
                                  CI.getDiagnostics().getClient()))
    return false; // errors, stop the action.

  // We only want to see warnings reported from arcmt::checkForManualIssues.
  CI.getDiagnostics().setIgnoreAllWarnings(true);
  return true;
}

CheckAction::CheckAction(FrontendAction *WrappedAction)
  : WrapperFrontendAction(WrappedAction) {}

bool ModifyAction::BeginInvocation(CompilerInstance &CI) {
  return !arcmt::applyTransformations(CI.getInvocation(), getCurrentInput(),
                                      CI.getDiagnostics().getClient());
}

ModifyAction::ModifyAction(FrontendAction *WrappedAction)
  : WrapperFrontendAction(WrappedAction) {}

bool MigrateAction::BeginInvocation(CompilerInstance &CI) {
  if (arcmt::migrateWithTemporaryFiles(CI.getInvocation(),
                                       getCurrentInput(),
                                       CI.getDiagnostics().getClient(),
                                       MigrateDir,
                                       EmitPremigrationARCErros,
                                       PlistOut))
    return false; // errors, stop the action.

  // We only want to see diagnostics emitted by migrateWithTemporaryFiles.
  CI.getDiagnostics().setIgnoreAllWarnings(true);
  return true;
}

MigrateAction::MigrateAction(FrontendAction *WrappedAction,
                             StringRef migrateDir,
                             StringRef plistOut,
                             bool emitPremigrationARCErrors)
  : WrapperFrontendAction(WrappedAction), MigrateDir(migrateDir),
    PlistOut(plistOut), EmitPremigrationARCErros(emitPremigrationARCErrors) {
  if (MigrateDir.empty())
    MigrateDir = "."; // user current directory if none is given.
}
