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