1224135Sdim//===-- ARCMT.h - ARC Migration Rewriter ------------------------*- C++ -*-===// 2224135Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6224135Sdim// 7224135Sdim//===----------------------------------------------------------------------===// 8224135Sdim 9224135Sdim#ifndef LLVM_CLANG_ARCMIGRATE_ARCMT_H 10224135Sdim#define LLVM_CLANG_ARCMIGRATE_ARCMT_H 11224135Sdim 12224135Sdim#include "clang/ARCMigrate/FileRemapper.h" 13249423Sdim#include "clang/Basic/SourceLocation.h" 14224135Sdim#include "clang/Frontend/CompilerInvocation.h" 15224135Sdim 16224135Sdimnamespace clang { 17224135Sdim class ASTContext; 18226633Sdim class DiagnosticConsumer; 19288943Sdim class PCHContainerOperations; 20224135Sdim 21224135Sdimnamespace arcmt { 22224135Sdim class MigrationPass; 23224135Sdim 24341825Sdim/// Creates an AST with the provided CompilerInvocation but with these 25224135Sdim/// changes: 26224135Sdim/// -if a PCH/PTH is set, the original header is used instead 27224135Sdim/// -Automatic Reference Counting mode is enabled 28224135Sdim/// 29224135Sdim/// It then checks the AST and produces errors/warning for ARC migration issues 30224135Sdim/// that the user needs to handle manually. 31224135Sdim/// 32226633Sdim/// \param emitPremigrationARCErrors if true all ARC errors will get emitted 33226633Sdim/// even if the migrator can fix them, but the function will still return false 34226633Sdim/// if all ARC errors can be fixed. 35226633Sdim/// 36226633Sdim/// \param plistOut if non-empty, it is the file path to store the plist with 37226633Sdim/// the pre-migration ARC diagnostics. 38226633Sdim/// 39224135Sdim/// \returns false if no error is produced, true otherwise. 40288943Sdimbool 41288943SdimcheckForManualIssues(CompilerInvocation &CI, const FrontendInputFile &Input, 42288943Sdim std::shared_ptr<PCHContainerOperations> PCHContainerOps, 43288943Sdim DiagnosticConsumer *DiagClient, 44288943Sdim bool emitPremigrationARCErrors = false, 45288943Sdim StringRef plistOut = StringRef()); 46224135Sdim 47341825Sdim/// Works similar to checkForManualIssues but instead of checking, it 48224135Sdim/// applies automatic modifications to source files to conform to ARC. 49224135Sdim/// 50224135Sdim/// \returns false if no error is produced, true otherwise. 51288943Sdimbool 52288943SdimapplyTransformations(CompilerInvocation &origCI, 53288943Sdim const FrontendInputFile &Input, 54288943Sdim std::shared_ptr<PCHContainerOperations> PCHContainerOps, 55288943Sdim DiagnosticConsumer *DiagClient); 56224135Sdim 57341825Sdim/// Applies automatic modifications and produces temporary files 58243830Sdim/// and metadata into the \p outputDir path. 59224135Sdim/// 60226633Sdim/// \param emitPremigrationARCErrors if true all ARC errors will get emitted 61226633Sdim/// even if the migrator can fix them, but the function will still return false 62226633Sdim/// if all ARC errors can be fixed. 63226633Sdim/// 64226633Sdim/// \param plistOut if non-empty, it is the file path to store the plist with 65226633Sdim/// the pre-migration ARC diagnostics. 66226633Sdim/// 67224135Sdim/// \returns false if no error is produced, true otherwise. 68288943Sdimbool migrateWithTemporaryFiles( 69288943Sdim CompilerInvocation &origCI, const FrontendInputFile &Input, 70288943Sdim std::shared_ptr<PCHContainerOperations> PCHContainerOps, 71288943Sdim DiagnosticConsumer *DiagClient, StringRef outputDir, 72288943Sdim bool emitPremigrationARCErrors, StringRef plistOut); 73224135Sdim 74341825Sdim/// Get the set of file remappings from the \p outputDir path that 75224135Sdim/// migrateWithTemporaryFiles produced. 76224135Sdim/// 77224135Sdim/// \returns false if no error is produced, true otherwise. 78224135Sdimbool getFileRemappings(std::vector<std::pair<std::string,std::string> > &remap, 79226633Sdim StringRef outputDir, 80226633Sdim DiagnosticConsumer *DiagClient); 81224135Sdim 82341825Sdim/// Get the set of file remappings from a list of files with remapping 83234353Sdim/// info. 84234353Sdim/// 85234353Sdim/// \returns false if no error is produced, true otherwise. 86234353Sdimbool getFileRemappingsFromFileList( 87234353Sdim std::vector<std::pair<std::string,std::string> > &remap, 88234353Sdim ArrayRef<StringRef> remapFiles, 89234353Sdim DiagnosticConsumer *DiagClient); 90234353Sdim 91224135Sdimtypedef void (*TransformFn)(MigrationPass &pass); 92224135Sdim 93234353Sdimstd::vector<TransformFn> getAllTransformations(LangOptions::GCMode OrigGCMode, 94234353Sdim bool NoFinalizeRemoval); 95224135Sdim 96224135Sdimclass MigrationProcess { 97224135Sdim CompilerInvocation OrigCI; 98288943Sdim std::shared_ptr<PCHContainerOperations> PCHContainerOps; 99226633Sdim DiagnosticConsumer *DiagClient; 100224135Sdim FileRemapper Remapper; 101224135Sdim 102224135Sdimpublic: 103261991Sdim bool HadARCErrors; 104261991Sdim 105288943Sdim MigrationProcess(const CompilerInvocation &CI, 106288943Sdim std::shared_ptr<PCHContainerOperations> PCHContainerOps, 107288943Sdim DiagnosticConsumer *diagClient, 108226633Sdim StringRef outputDir = StringRef()); 109224135Sdim 110224135Sdim class RewriteListener { 111224135Sdim public: 112224135Sdim virtual ~RewriteListener(); 113224135Sdim 114224135Sdim virtual void start(ASTContext &Ctx) { } 115224135Sdim virtual void finish() { } 116224135Sdim 117226633Sdim virtual void insert(SourceLocation loc, StringRef text) { } 118224135Sdim virtual void remove(CharSourceRange range) { } 119224135Sdim }; 120224135Sdim 121276479Sdim bool applyTransform(TransformFn trans, RewriteListener *listener = nullptr); 122224135Sdim 123224135Sdim FileRemapper &getRemapper() { return Remapper; } 124224135Sdim}; 125224135Sdim 126224135Sdim} // end namespace arcmt 127224135Sdim 128224135Sdim} // end namespace clang 129224135Sdim 130224135Sdim#endif 131