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