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