ARCMT.h revision 224135
1224135Sdim//===-- ARCMT.h - ARC Migration Rewriter ------------------------*- C++ -*-===// 2224135Sdim// 3224135Sdim// The LLVM Compiler Infrastructure 4224135Sdim// 5224135Sdim// This file is distributed under the University of Illinois Open Source 6224135Sdim// License. See LICENSE.TXT for details. 7224135Sdim// 8224135Sdim//===----------------------------------------------------------------------===// 9224135Sdim 10224135Sdim#ifndef LLVM_CLANG_ARCMIGRATE_ARCMT_H 11224135Sdim#define LLVM_CLANG_ARCMIGRATE_ARCMT_H 12224135Sdim 13224135Sdim#include "clang/ARCMigrate/FileRemapper.h" 14224135Sdim#include "clang/Frontend/CompilerInvocation.h" 15224135Sdim 16224135Sdimnamespace clang { 17224135Sdim class ASTContext; 18224135Sdim class DiagnosticClient; 19224135Sdim 20224135Sdimnamespace arcmt { 21224135Sdim class MigrationPass; 22224135Sdim 23224135Sdim/// \brief Creates an AST with the provided CompilerInvocation but with these 24224135Sdim/// changes: 25224135Sdim/// -if a PCH/PTH is set, the original header is used instead 26224135Sdim/// -Automatic Reference Counting mode is enabled 27224135Sdim/// 28224135Sdim/// It then checks the AST and produces errors/warning for ARC migration issues 29224135Sdim/// that the user needs to handle manually. 30224135Sdim/// 31224135Sdim/// \returns false if no error is produced, true otherwise. 32224135Sdimbool checkForManualIssues(CompilerInvocation &CI, 33224135Sdim llvm::StringRef Filename, InputKind Kind, 34224135Sdim DiagnosticClient *DiagClient); 35224135Sdim 36224135Sdim/// \brief Works similar to checkForManualIssues but instead of checking, it 37224135Sdim/// applies automatic modifications to source files to conform to ARC. 38224135Sdim/// 39224135Sdim/// \returns false if no error is produced, true otherwise. 40224135Sdimbool applyTransformations(CompilerInvocation &origCI, 41224135Sdim llvm::StringRef Filename, InputKind Kind, 42224135Sdim DiagnosticClient *DiagClient); 43224135Sdim 44224135Sdim/// \brief Applies automatic modifications and produces temporary files 45224135Sdim/// and metadata into the \arg outputDir path. 46224135Sdim/// 47224135Sdim/// \returns false if no error is produced, true otherwise. 48224135Sdimbool migrateWithTemporaryFiles(CompilerInvocation &origCI, 49224135Sdim llvm::StringRef Filename, InputKind Kind, 50224135Sdim DiagnosticClient *DiagClient, 51224135Sdim llvm::StringRef outputDir); 52224135Sdim 53224135Sdim/// \brief Get the set of file remappings from the \arg outputDir path that 54224135Sdim/// migrateWithTemporaryFiles produced. 55224135Sdim/// 56224135Sdim/// \returns false if no error is produced, true otherwise. 57224135Sdimbool getFileRemappings(std::vector<std::pair<std::string,std::string> > &remap, 58224135Sdim llvm::StringRef outputDir, 59224135Sdim DiagnosticClient *DiagClient); 60224135Sdim 61224135Sdimtypedef void (*TransformFn)(MigrationPass &pass); 62224135Sdim 63224135Sdimstd::vector<TransformFn> getAllTransformations(); 64224135Sdim 65224135Sdimclass MigrationProcess { 66224135Sdim CompilerInvocation OrigCI; 67224135Sdim DiagnosticClient *DiagClient; 68224135Sdim FileRemapper Remapper; 69224135Sdim 70224135Sdimpublic: 71224135Sdim MigrationProcess(const CompilerInvocation &CI, DiagnosticClient *diagClient, 72224135Sdim llvm::StringRef outputDir = llvm::StringRef()); 73224135Sdim 74224135Sdim class RewriteListener { 75224135Sdim public: 76224135Sdim virtual ~RewriteListener(); 77224135Sdim 78224135Sdim virtual void start(ASTContext &Ctx) { } 79224135Sdim virtual void finish() { } 80224135Sdim 81224135Sdim virtual void insert(SourceLocation loc, llvm::StringRef text) { } 82224135Sdim virtual void remove(CharSourceRange range) { } 83224135Sdim }; 84224135Sdim 85224135Sdim bool applyTransform(TransformFn trans, RewriteListener *listener = 0); 86224135Sdim 87224135Sdim FileRemapper &getRemapper() { return Remapper; } 88224135Sdim}; 89224135Sdim 90224135Sdim} // end namespace arcmt 91224135Sdim 92224135Sdim} // end namespace clang 93224135Sdim 94224135Sdim#endif 95