xref: /aosp_15_r20/external/clang/lib/ARCMigrate/Internals.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===-- Internals.h - Implementation Details---------------------*- C++ -*-===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li 
10*67e74705SXin Li #ifndef LLVM_CLANG_LIB_ARCMIGRATE_INTERNALS_H
11*67e74705SXin Li #define LLVM_CLANG_LIB_ARCMIGRATE_INTERNALS_H
12*67e74705SXin Li 
13*67e74705SXin Li #include "clang/ARCMigrate/ARCMT.h"
14*67e74705SXin Li #include "clang/Basic/Diagnostic.h"
15*67e74705SXin Li #include "llvm/ADT/ArrayRef.h"
16*67e74705SXin Li #include "llvm/ADT/Optional.h"
17*67e74705SXin Li #include <list>
18*67e74705SXin Li 
19*67e74705SXin Li namespace clang {
20*67e74705SXin Li   class Sema;
21*67e74705SXin Li   class Stmt;
22*67e74705SXin Li 
23*67e74705SXin Li namespace arcmt {
24*67e74705SXin Li 
25*67e74705SXin Li class CapturedDiagList {
26*67e74705SXin Li   typedef std::list<StoredDiagnostic> ListTy;
27*67e74705SXin Li   ListTy List;
28*67e74705SXin Li 
29*67e74705SXin Li public:
push_back(const StoredDiagnostic & diag)30*67e74705SXin Li   void push_back(const StoredDiagnostic &diag) { List.push_back(diag); }
31*67e74705SXin Li 
32*67e74705SXin Li   bool clearDiagnostic(ArrayRef<unsigned> IDs, SourceRange range);
33*67e74705SXin Li   bool hasDiagnostic(ArrayRef<unsigned> IDs, SourceRange range) const;
34*67e74705SXin Li 
35*67e74705SXin Li   void reportDiagnostics(DiagnosticsEngine &diags) const;
36*67e74705SXin Li 
37*67e74705SXin Li   bool hasErrors() const;
38*67e74705SXin Li 
39*67e74705SXin Li   typedef ListTy::const_iterator iterator;
begin()40*67e74705SXin Li   iterator begin() const { return List.begin(); }
end()41*67e74705SXin Li   iterator end()   const { return List.end();   }
42*67e74705SXin Li };
43*67e74705SXin Li 
44*67e74705SXin Li void writeARCDiagsToPlist(const std::string &outPath,
45*67e74705SXin Li                           ArrayRef<StoredDiagnostic> diags,
46*67e74705SXin Li                           SourceManager &SM, const LangOptions &LangOpts);
47*67e74705SXin Li 
48*67e74705SXin Li class TransformActions {
49*67e74705SXin Li   DiagnosticsEngine &Diags;
50*67e74705SXin Li   CapturedDiagList &CapturedDiags;
51*67e74705SXin Li   void *Impl; // TransformActionsImpl.
52*67e74705SXin Li 
53*67e74705SXin Li public:
54*67e74705SXin Li   TransformActions(DiagnosticsEngine &diag, CapturedDiagList &capturedDiags,
55*67e74705SXin Li                    ASTContext &ctx, Preprocessor &PP);
56*67e74705SXin Li   ~TransformActions();
57*67e74705SXin Li 
58*67e74705SXin Li   void startTransaction();
59*67e74705SXin Li   bool commitTransaction();
60*67e74705SXin Li   void abortTransaction();
61*67e74705SXin Li 
62*67e74705SXin Li   void insert(SourceLocation loc, StringRef text);
63*67e74705SXin Li   void insertAfterToken(SourceLocation loc, StringRef text);
64*67e74705SXin Li   void remove(SourceRange range);
65*67e74705SXin Li   void removeStmt(Stmt *S);
66*67e74705SXin Li   void replace(SourceRange range, StringRef text);
67*67e74705SXin Li   void replace(SourceRange range, SourceRange replacementRange);
68*67e74705SXin Li   void replaceStmt(Stmt *S, StringRef text);
69*67e74705SXin Li   void replaceText(SourceLocation loc, StringRef text,
70*67e74705SXin Li                    StringRef replacementText);
71*67e74705SXin Li   void increaseIndentation(SourceRange range,
72*67e74705SXin Li                            SourceLocation parentIndent);
73*67e74705SXin Li 
74*67e74705SXin Li   bool clearDiagnostic(ArrayRef<unsigned> IDs, SourceRange range);
clearAllDiagnostics(SourceRange range)75*67e74705SXin Li   bool clearAllDiagnostics(SourceRange range) {
76*67e74705SXin Li     return clearDiagnostic(None, range);
77*67e74705SXin Li   }
clearDiagnostic(unsigned ID1,unsigned ID2,SourceRange range)78*67e74705SXin Li   bool clearDiagnostic(unsigned ID1, unsigned ID2, SourceRange range) {
79*67e74705SXin Li     unsigned IDs[] = { ID1, ID2 };
80*67e74705SXin Li     return clearDiagnostic(IDs, range);
81*67e74705SXin Li   }
clearDiagnostic(unsigned ID1,unsigned ID2,unsigned ID3,SourceRange range)82*67e74705SXin Li   bool clearDiagnostic(unsigned ID1, unsigned ID2, unsigned ID3,
83*67e74705SXin Li                        SourceRange range) {
84*67e74705SXin Li     unsigned IDs[] = { ID1, ID2, ID3 };
85*67e74705SXin Li     return clearDiagnostic(IDs, range);
86*67e74705SXin Li   }
87*67e74705SXin Li 
hasDiagnostic(unsigned ID,SourceRange range)88*67e74705SXin Li   bool hasDiagnostic(unsigned ID, SourceRange range) {
89*67e74705SXin Li     return CapturedDiags.hasDiagnostic(ID, range);
90*67e74705SXin Li   }
91*67e74705SXin Li 
hasDiagnostic(unsigned ID1,unsigned ID2,SourceRange range)92*67e74705SXin Li   bool hasDiagnostic(unsigned ID1, unsigned ID2, SourceRange range) {
93*67e74705SXin Li     unsigned IDs[] = { ID1, ID2 };
94*67e74705SXin Li     return CapturedDiags.hasDiagnostic(IDs, range);
95*67e74705SXin Li   }
96*67e74705SXin Li 
97*67e74705SXin Li   DiagnosticBuilder report(SourceLocation loc, unsigned diagId,
98*67e74705SXin Li                            SourceRange range = SourceRange());
99*67e74705SXin Li   void reportError(StringRef error, SourceLocation loc,
100*67e74705SXin Li                    SourceRange range = SourceRange());
101*67e74705SXin Li   void reportWarning(StringRef warning, SourceLocation loc,
102*67e74705SXin Li                    SourceRange range = SourceRange());
103*67e74705SXin Li   void reportNote(StringRef note, SourceLocation loc,
104*67e74705SXin Li                   SourceRange range = SourceRange());
105*67e74705SXin Li 
hasReportedErrors()106*67e74705SXin Li   bool hasReportedErrors() const {
107*67e74705SXin Li     return Diags.hasUnrecoverableErrorOccurred();
108*67e74705SXin Li   }
109*67e74705SXin Li 
110*67e74705SXin Li   class RewriteReceiver {
111*67e74705SXin Li   public:
112*67e74705SXin Li     virtual ~RewriteReceiver();
113*67e74705SXin Li 
114*67e74705SXin Li     virtual void insert(SourceLocation loc, StringRef text) = 0;
115*67e74705SXin Li     virtual void remove(CharSourceRange range) = 0;
116*67e74705SXin Li     virtual void increaseIndentation(CharSourceRange range,
117*67e74705SXin Li                                      SourceLocation parentIndent) = 0;
118*67e74705SXin Li   };
119*67e74705SXin Li 
120*67e74705SXin Li   void applyRewrites(RewriteReceiver &receiver);
121*67e74705SXin Li };
122*67e74705SXin Li 
123*67e74705SXin Li class Transaction {
124*67e74705SXin Li   TransformActions &TA;
125*67e74705SXin Li   bool Aborted;
126*67e74705SXin Li 
127*67e74705SXin Li public:
Transaction(TransformActions & TA)128*67e74705SXin Li   Transaction(TransformActions &TA) : TA(TA), Aborted(false) {
129*67e74705SXin Li     TA.startTransaction();
130*67e74705SXin Li   }
131*67e74705SXin Li 
~Transaction()132*67e74705SXin Li   ~Transaction() {
133*67e74705SXin Li     if (!isAborted())
134*67e74705SXin Li       TA.commitTransaction();
135*67e74705SXin Li   }
136*67e74705SXin Li 
abort()137*67e74705SXin Li   void abort() {
138*67e74705SXin Li     TA.abortTransaction();
139*67e74705SXin Li     Aborted = true;
140*67e74705SXin Li   }
141*67e74705SXin Li 
isAborted()142*67e74705SXin Li   bool isAborted() const { return Aborted; }
143*67e74705SXin Li };
144*67e74705SXin Li 
145*67e74705SXin Li class MigrationPass {
146*67e74705SXin Li public:
147*67e74705SXin Li   ASTContext &Ctx;
148*67e74705SXin Li   LangOptions::GCMode OrigGCMode;
149*67e74705SXin Li   MigratorOptions MigOptions;
150*67e74705SXin Li   Sema &SemaRef;
151*67e74705SXin Li   TransformActions &TA;
152*67e74705SXin Li   const CapturedDiagList &CapturedDiags;
153*67e74705SXin Li   std::vector<SourceLocation> &ARCMTMacroLocs;
154*67e74705SXin Li   Optional<bool> EnableCFBridgeFns;
155*67e74705SXin Li 
MigrationPass(ASTContext & Ctx,LangOptions::GCMode OrigGCMode,Sema & sema,TransformActions & TA,const CapturedDiagList & capturedDiags,std::vector<SourceLocation> & ARCMTMacroLocs)156*67e74705SXin Li   MigrationPass(ASTContext &Ctx, LangOptions::GCMode OrigGCMode,
157*67e74705SXin Li                 Sema &sema, TransformActions &TA,
158*67e74705SXin Li                 const CapturedDiagList &capturedDiags,
159*67e74705SXin Li                 std::vector<SourceLocation> &ARCMTMacroLocs)
160*67e74705SXin Li     : Ctx(Ctx), OrigGCMode(OrigGCMode), MigOptions(),
161*67e74705SXin Li       SemaRef(sema), TA(TA), CapturedDiags(capturedDiags),
162*67e74705SXin Li       ARCMTMacroLocs(ARCMTMacroLocs) { }
163*67e74705SXin Li 
getDiags()164*67e74705SXin Li   const CapturedDiagList &getDiags() const { return CapturedDiags; }
165*67e74705SXin Li 
isGCMigration()166*67e74705SXin Li   bool isGCMigration() const { return OrigGCMode != LangOptions::NonGC; }
noFinalizeRemoval()167*67e74705SXin Li   bool noFinalizeRemoval() const { return MigOptions.NoFinalizeRemoval; }
setNoFinalizeRemoval(bool val)168*67e74705SXin Li   void setNoFinalizeRemoval(bool val) {MigOptions.NoFinalizeRemoval = val; }
169*67e74705SXin Li 
170*67e74705SXin Li   bool CFBridgingFunctionsDefined();
171*67e74705SXin Li };
172*67e74705SXin Li 
getARCMTMacroName()173*67e74705SXin Li static inline StringRef getARCMTMacroName() {
174*67e74705SXin Li   return "__IMPL_ARCMT_REMOVED_EXPR__";
175*67e74705SXin Li }
176*67e74705SXin Li 
177*67e74705SXin Li } // end namespace arcmt
178*67e74705SXin Li 
179*67e74705SXin Li } // end namespace clang
180*67e74705SXin Li 
181*67e74705SXin Li #endif
182