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