1 //===-- Internals.h - Implementation Details---------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef LLVM_CLANG_LIB_ARCMIGRATE_INTERNALS_H 11 #define LLVM_CLANG_LIB_ARCMIGRATE_INTERNALS_H 12 13 #include "clang/ARCMigrate/ARCMT.h" 14 #include "clang/Basic/Diagnostic.h" 15 #include "llvm/ADT/ArrayRef.h" 16 #include "llvm/ADT/Optional.h" 17 #include <list> 18 19 namespace clang { 20 class Sema; 21 class Stmt; 22 23 namespace arcmt { 24 25 class CapturedDiagList { 26 typedef std::list<StoredDiagnostic> ListTy; 27 ListTy List; 28 29 public: 30 void push_back(const StoredDiagnostic &diag) { List.push_back(diag); } 31 32 bool clearDiagnostic(ArrayRef<unsigned> IDs, SourceRange range); 33 bool hasDiagnostic(ArrayRef<unsigned> IDs, SourceRange range) const; 34 35 void reportDiagnostics(DiagnosticsEngine &diags) const; 36 37 bool hasErrors() const; 38 39 typedef ListTy::const_iterator iterator; 40 iterator begin() const { return List.begin(); } 41 iterator end() const { return List.end(); } 42 }; 43 44 void writeARCDiagsToPlist(const std::string &outPath, 45 ArrayRef<StoredDiagnostic> diags, 46 SourceManager &SM, const LangOptions &LangOpts); 47 48 class TransformActions { 49 DiagnosticsEngine &Diags; 50 CapturedDiagList &CapturedDiags; 51 bool ReportedErrors; 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(ArrayRef<unsigned>(), 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 void reportError(StringRef error, SourceLocation loc, 99 SourceRange range = SourceRange()); 100 void reportWarning(StringRef warning, SourceLocation loc, 101 SourceRange range = SourceRange()); 102 void reportNote(StringRef note, SourceLocation loc, 103 SourceRange range = SourceRange()); 104 105 bool hasReportedErrors() const { return ReportedErrors; } 106 107 class RewriteReceiver { 108 public: 109 virtual ~RewriteReceiver(); 110 111 virtual void insert(SourceLocation loc, StringRef text) = 0; 112 virtual void remove(CharSourceRange range) = 0; 113 virtual void increaseIndentation(CharSourceRange range, 114 SourceLocation parentIndent) = 0; 115 }; 116 117 void applyRewrites(RewriteReceiver &receiver); 118 }; 119 120 class Transaction { 121 TransformActions &TA; 122 bool Aborted; 123 124 public: 125 Transaction(TransformActions &TA) : TA(TA), Aborted(false) { 126 TA.startTransaction(); 127 } 128 129 ~Transaction() { 130 if (!isAborted()) 131 TA.commitTransaction(); 132 } 133 134 void abort() { 135 TA.abortTransaction(); 136 Aborted = true; 137 } 138 139 bool isAborted() const { return Aborted; } 140 }; 141 142 class MigrationPass { 143 public: 144 ASTContext &Ctx; 145 LangOptions::GCMode OrigGCMode; 146 MigratorOptions MigOptions; 147 Sema &SemaRef; 148 TransformActions &TA; 149 const CapturedDiagList &CapturedDiags; 150 std::vector<SourceLocation> &ARCMTMacroLocs; 151 Optional<bool> EnableCFBridgeFns; 152 153 MigrationPass(ASTContext &Ctx, LangOptions::GCMode OrigGCMode, 154 Sema &sema, TransformActions &TA, 155 const CapturedDiagList &capturedDiags, 156 std::vector<SourceLocation> &ARCMTMacroLocs) 157 : Ctx(Ctx), OrigGCMode(OrigGCMode), MigOptions(), 158 SemaRef(sema), TA(TA), CapturedDiags(capturedDiags), 159 ARCMTMacroLocs(ARCMTMacroLocs) { } 160 161 const CapturedDiagList &getDiags() const { return CapturedDiags; } 162 163 bool isGCMigration() const { return OrigGCMode != LangOptions::NonGC; } 164 bool noNSAllocReallocError() const { return MigOptions.NoNSAllocReallocError; } 165 void setNSAllocReallocError(bool val) { MigOptions.NoNSAllocReallocError = val; } 166 bool noFinalizeRemoval() const { return MigOptions.NoFinalizeRemoval; } 167 void setNoFinalizeRemoval(bool val) {MigOptions.NoFinalizeRemoval = val; } 168 169 bool CFBridgingFunctionsDefined(); 170 }; 171 172 static inline StringRef getARCMTMacroName() { 173 return "__IMPL_ARCMT_REMOVED_EXPR__"; 174 } 175 176 } // end namespace arcmt 177 178 } // end namespace clang 179 180 #endif 181