//===-- ARCMT.h - ARC Migration Rewriter ------------------------*- C++ -*-===//
 
//
 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 
// See https://llvm.org/LICENSE.txt for license information.
 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
//
 
//===----------------------------------------------------------------------===//
 
 
 
#ifndef LLVM_CLANG_ARCMIGRATE_ARCMT_H
 
#define LLVM_CLANG_ARCMIGRATE_ARCMT_H
 
 
 
#include "clang/ARCMigrate/FileRemapper.h"
 
#include "clang/Basic/SourceLocation.h"
 
#include "clang/Frontend/CompilerInvocation.h"
 
 
 
namespace clang {
 
  class ASTContext;
 
  class DiagnosticConsumer;
 
  class PCHContainerOperations;
 
 
 
namespace arcmt {
 
  class MigrationPass;
 
 
 
/// Creates an AST with the provided CompilerInvocation but with these
 
/// changes:
 
///   -if a PCH/PTH is set, the original header is used instead
 
///   -Automatic Reference Counting mode is enabled
 
///
 
/// It then checks the AST and produces errors/warning for ARC migration issues
 
/// that the user needs to handle manually.
 
///
 
/// \param emitPremigrationARCErrors if true all ARC errors will get emitted
 
/// even if the migrator can fix them, but the function will still return false
 
/// if all ARC errors can be fixed.
 
///
 
/// \param plistOut if non-empty, it is the file path to store the plist with
 
/// the pre-migration ARC diagnostics.
 
///
 
/// \returns false if no error is produced, true otherwise.
 
bool
 
checkForManualIssues(CompilerInvocation &CI, const FrontendInputFile &Input,
 
                     std::shared_ptr<PCHContainerOperations> PCHContainerOps,
 
                     DiagnosticConsumer *DiagClient,
 
                     bool emitPremigrationARCErrors = false,
 
                     StringRef plistOut = StringRef());
 
 
 
/// Works similar to checkForManualIssues but instead of checking, it
 
/// applies automatic modifications to source files to conform to ARC.
 
///
 
/// \returns false if no error is produced, true otherwise.
 
bool
 
applyTransformations(CompilerInvocation &origCI,
 
                     const FrontendInputFile &Input,
 
                     std::shared_ptr<PCHContainerOperations> PCHContainerOps,
 
                     DiagnosticConsumer *DiagClient);
 
 
 
/// Applies automatic modifications and produces temporary files
 
/// and metadata into the \p outputDir path.
 
///
 
/// \param emitPremigrationARCErrors if true all ARC errors will get emitted
 
/// even if the migrator can fix them, but the function will still return false
 
/// if all ARC errors can be fixed.
 
///
 
/// \param plistOut if non-empty, it is the file path to store the plist with
 
/// the pre-migration ARC diagnostics.
 
///
 
/// \returns false if no error is produced, true otherwise.
 
bool migrateWithTemporaryFiles(
 
    CompilerInvocation &origCI, const FrontendInputFile &Input,
 
    std::shared_ptr<PCHContainerOperations> PCHContainerOps,
 
    DiagnosticConsumer *DiagClient, StringRef outputDir,
 
    bool emitPremigrationARCErrors, StringRef plistOut);
 
 
 
/// Get the set of file remappings from the \p outputDir path that
 
/// migrateWithTemporaryFiles produced.
 
///
 
/// \returns false if no error is produced, true otherwise.
 
bool getFileRemappings(std::vector<std::pair<std::string,std::string> > &remap,
 
                       StringRef outputDir,
 
                       DiagnosticConsumer *DiagClient);
 
 
 
/// Get the set of file remappings from a list of files with remapping
 
/// info.
 
///
 
/// \returns false if no error is produced, true otherwise.
 
bool getFileRemappingsFromFileList(
 
                        std::vector<std::pair<std::string,std::string> > &remap,
 
                        ArrayRef<StringRef> remapFiles,
 
                        DiagnosticConsumer *DiagClient);
 
 
 
typedef void (*TransformFn)(MigrationPass &pass);
 
 
 
std::vector<TransformFn> getAllTransformations(LangOptions::GCMode OrigGCMode,
 
                                               bool NoFinalizeRemoval);
 
 
 
class MigrationProcess {
 
  CompilerInvocation OrigCI;
 
  std::shared_ptr<PCHContainerOperations> PCHContainerOps;
 
  DiagnosticConsumer *DiagClient;
 
  FileRemapper Remapper;
 
 
 
public:
 
  bool HadARCErrors;
 
 
 
  MigrationProcess(const CompilerInvocation &CI,
 
                   std::shared_ptr<PCHContainerOperations> PCHContainerOps,
 
                   DiagnosticConsumer *diagClient,
 
                   StringRef outputDir = StringRef());
 
 
 
  class RewriteListener {
 
  public:
 
    virtual ~RewriteListener();
 
 
 
    virtual void start(ASTContext &Ctx) { }
 
    virtual void finish() { }
 
 
 
    virtual void insert(SourceLocation loc, StringRef text) { }
 
    virtual void remove(CharSourceRange range) { }
 
  };
 
 
 
  bool applyTransform(TransformFn trans, RewriteListener *listener = nullptr);
 
 
 
  FileRemapper &getRemapper() { return Remapper; }
 
};
 
 
 
} // end namespace arcmt
 
 
 
}  // end namespace clang
 
 
 
#endif