1 | //===-- ARCMT.h - ARC Migration Rewriter ------------------------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef LLVM_CLANG_ARCMIGRATE_ARCMT_H |
10 | #define LLVM_CLANG_ARCMIGRATE_ARCMT_H |
11 | |
12 | #include "clang/ARCMigrate/FileRemapper.h" |
13 | #include "clang/Basic/SourceLocation.h" |
14 | #include "clang/Frontend/CompilerInvocation.h" |
15 | |
16 | namespace clang { |
17 | class ASTContext; |
18 | class DiagnosticConsumer; |
19 | class PCHContainerOperations; |
20 | |
21 | namespace arcmt { |
22 | class MigrationPass; |
23 | |
24 | /// Creates an AST with the provided CompilerInvocation but with these |
25 | /// changes: |
26 | /// -if a PCH/PTH is set, the original header is used instead |
27 | /// -Automatic Reference Counting mode is enabled |
28 | /// |
29 | /// It then checks the AST and produces errors/warning for ARC migration issues |
30 | /// that the user needs to handle manually. |
31 | /// |
32 | /// \param emitPremigrationARCErrors if true all ARC errors will get emitted |
33 | /// even if the migrator can fix them, but the function will still return false |
34 | /// if all ARC errors can be fixed. |
35 | /// |
36 | /// \param plistOut if non-empty, it is the file path to store the plist with |
37 | /// the pre-migration ARC diagnostics. |
38 | /// |
39 | /// \returns false if no error is produced, true otherwise. |
40 | bool |
41 | checkForManualIssues(CompilerInvocation &CI, const FrontendInputFile &Input, |
42 | std::shared_ptr<PCHContainerOperations> PCHContainerOps, |
43 | DiagnosticConsumer *DiagClient, |
44 | bool emitPremigrationARCErrors = false, |
45 | StringRef plistOut = StringRef()); |
46 | |
47 | /// Works similar to checkForManualIssues but instead of checking, it |
48 | /// applies automatic modifications to source files to conform to ARC. |
49 | /// |
50 | /// \returns false if no error is produced, true otherwise. |
51 | bool |
52 | applyTransformations(CompilerInvocation &origCI, |
53 | const FrontendInputFile &Input, |
54 | std::shared_ptr<PCHContainerOperations> PCHContainerOps, |
55 | DiagnosticConsumer *DiagClient); |
56 | |
57 | /// Applies automatic modifications and produces temporary files |
58 | /// and metadata into the \p outputDir path. |
59 | /// |
60 | /// \param emitPremigrationARCErrors if true all ARC errors will get emitted |
61 | /// even if the migrator can fix them, but the function will still return false |
62 | /// if all ARC errors can be fixed. |
63 | /// |
64 | /// \param plistOut if non-empty, it is the file path to store the plist with |
65 | /// the pre-migration ARC diagnostics. |
66 | /// |
67 | /// \returns false if no error is produced, true otherwise. |
68 | bool migrateWithTemporaryFiles( |
69 | CompilerInvocation &origCI, const FrontendInputFile &Input, |
70 | std::shared_ptr<PCHContainerOperations> PCHContainerOps, |
71 | DiagnosticConsumer *DiagClient, StringRef outputDir, |
72 | bool emitPremigrationARCErrors, StringRef plistOut); |
73 | |
74 | /// Get the set of file remappings from the \p outputDir path that |
75 | /// migrateWithTemporaryFiles produced. |
76 | /// |
77 | /// \returns false if no error is produced, true otherwise. |
78 | bool getFileRemappings(std::vector<std::pair<std::string,std::string> > &remap, |
79 | StringRef outputDir, |
80 | DiagnosticConsumer *DiagClient); |
81 | |
82 | /// Get the set of file remappings from a list of files with remapping |
83 | /// info. |
84 | /// |
85 | /// \returns false if no error is produced, true otherwise. |
86 | bool getFileRemappingsFromFileList( |
87 | std::vector<std::pair<std::string,std::string> > &remap, |
88 | ArrayRef<StringRef> remapFiles, |
89 | DiagnosticConsumer *DiagClient); |
90 | |
91 | typedef void (*TransformFn)(MigrationPass &pass); |
92 | |
93 | std::vector<TransformFn> getAllTransformations(LangOptions::GCMode OrigGCMode, |
94 | bool NoFinalizeRemoval); |
95 | |
96 | class MigrationProcess { |
97 | CompilerInvocation OrigCI; |
98 | std::shared_ptr<PCHContainerOperations> PCHContainerOps; |
99 | DiagnosticConsumer *DiagClient; |
100 | FileRemapper Remapper; |
101 | |
102 | public: |
103 | bool HadARCErrors; |
104 | |
105 | MigrationProcess(CompilerInvocation &CI, |
106 | std::shared_ptr<PCHContainerOperations> PCHContainerOps, |
107 | DiagnosticConsumer *diagClient, |
108 | StringRef outputDir = StringRef()); |
109 | |
110 | class RewriteListener { |
111 | public: |
112 | virtual ~RewriteListener(); |
113 | |
114 | virtual void start(ASTContext &Ctx) { } |
115 | virtual void finish() { } |
116 | |
117 | virtual void insert(SourceLocation loc, StringRef text) { } |
118 | virtual void remove(CharSourceRange range) { } |
119 | }; |
120 | |
121 | bool applyTransform(TransformFn trans, RewriteListener *listener = nullptr); |
122 | |
123 | FileRemapper &getRemapper() { return Remapper; } |
124 | }; |
125 | |
126 | } // end namespace arcmt |
127 | |
128 | } // end namespace clang |
129 | |
130 | #endif |
131 | |