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