|  | //===-- Internals.h - Implementation Details---------------------*- C++ -*-===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_CLANG_LIB_ARCMIGRATE_INTERNALS_H | 
|  | #define LLVM_CLANG_LIB_ARCMIGRATE_INTERNALS_H | 
|  |  | 
|  | #include "clang/ARCMigrate/ARCMT.h" | 
|  | #include "clang/Basic/Diagnostic.h" | 
|  | #include "llvm/ADT/ArrayRef.h" | 
|  | #include "llvm/ADT/Optional.h" | 
|  | #include <list> | 
|  |  | 
|  | namespace clang { | 
|  | class Sema; | 
|  | class Stmt; | 
|  |  | 
|  | namespace arcmt { | 
|  |  | 
|  | class CapturedDiagList { | 
|  | typedef std::list<StoredDiagnostic> ListTy; | 
|  | ListTy List; | 
|  |  | 
|  | public: | 
|  | void push_back(const StoredDiagnostic &diag) { List.push_back(diag); } | 
|  |  | 
|  | bool clearDiagnostic(ArrayRef<unsigned> IDs, SourceRange range); | 
|  | bool hasDiagnostic(ArrayRef<unsigned> IDs, SourceRange range) const; | 
|  |  | 
|  | void reportDiagnostics(DiagnosticsEngine &diags) const; | 
|  |  | 
|  | bool hasErrors() const; | 
|  |  | 
|  | typedef ListTy::const_iterator iterator; | 
|  | iterator begin() const { return List.begin(); } | 
|  | iterator end()   const { return List.end();   } | 
|  | }; | 
|  |  | 
|  | void writeARCDiagsToPlist(const std::string &outPath, | 
|  | ArrayRef<StoredDiagnostic> diags, | 
|  | SourceManager &SM, const LangOptions &LangOpts); | 
|  |  | 
|  | class TransformActions { | 
|  | DiagnosticsEngine &Diags; | 
|  | CapturedDiagList &CapturedDiags; | 
|  | void *Impl; // TransformActionsImpl. | 
|  |  | 
|  | public: | 
|  | TransformActions(DiagnosticsEngine &diag, CapturedDiagList &capturedDiags, | 
|  | ASTContext &ctx, Preprocessor &PP); | 
|  | ~TransformActions(); | 
|  |  | 
|  | void startTransaction(); | 
|  | bool commitTransaction(); | 
|  | void abortTransaction(); | 
|  |  | 
|  | void insert(SourceLocation loc, StringRef text); | 
|  | void insertAfterToken(SourceLocation loc, StringRef text); | 
|  | void remove(SourceRange range); | 
|  | void removeStmt(Stmt *S); | 
|  | void replace(SourceRange range, StringRef text); | 
|  | void replace(SourceRange range, SourceRange replacementRange); | 
|  | void replaceStmt(Stmt *S, StringRef text); | 
|  | void replaceText(SourceLocation loc, StringRef text, | 
|  | StringRef replacementText); | 
|  | void increaseIndentation(SourceRange range, | 
|  | SourceLocation parentIndent); | 
|  |  | 
|  | bool clearDiagnostic(ArrayRef<unsigned> IDs, SourceRange range); | 
|  | bool clearAllDiagnostics(SourceRange range) { | 
|  | return clearDiagnostic(None, range); | 
|  | } | 
|  | bool clearDiagnostic(unsigned ID1, unsigned ID2, SourceRange range) { | 
|  | unsigned IDs[] = { ID1, ID2 }; | 
|  | return clearDiagnostic(IDs, range); | 
|  | } | 
|  | bool clearDiagnostic(unsigned ID1, unsigned ID2, unsigned ID3, | 
|  | SourceRange range) { | 
|  | unsigned IDs[] = { ID1, ID2, ID3 }; | 
|  | return clearDiagnostic(IDs, range); | 
|  | } | 
|  |  | 
|  | bool hasDiagnostic(unsigned ID, SourceRange range) { | 
|  | return CapturedDiags.hasDiagnostic(ID, range); | 
|  | } | 
|  |  | 
|  | bool hasDiagnostic(unsigned ID1, unsigned ID2, SourceRange range) { | 
|  | unsigned IDs[] = { ID1, ID2 }; | 
|  | return CapturedDiags.hasDiagnostic(IDs, range); | 
|  | } | 
|  |  | 
|  | DiagnosticBuilder report(SourceLocation loc, unsigned diagId, | 
|  | SourceRange range = SourceRange()); | 
|  | void reportError(StringRef error, SourceLocation loc, | 
|  | SourceRange range = SourceRange()); | 
|  | void reportWarning(StringRef warning, SourceLocation loc, | 
|  | SourceRange range = SourceRange()); | 
|  | void reportNote(StringRef note, SourceLocation loc, | 
|  | SourceRange range = SourceRange()); | 
|  |  | 
|  | bool hasReportedErrors() const { | 
|  | return Diags.hasUnrecoverableErrorOccurred(); | 
|  | } | 
|  |  | 
|  | class RewriteReceiver { | 
|  | public: | 
|  | virtual ~RewriteReceiver(); | 
|  |  | 
|  | virtual void insert(SourceLocation loc, StringRef text) = 0; | 
|  | virtual void remove(CharSourceRange range) = 0; | 
|  | virtual void increaseIndentation(CharSourceRange range, | 
|  | SourceLocation parentIndent) = 0; | 
|  | }; | 
|  |  | 
|  | void applyRewrites(RewriteReceiver &receiver); | 
|  | }; | 
|  |  | 
|  | class Transaction { | 
|  | TransformActions &TA; | 
|  | bool Aborted; | 
|  |  | 
|  | public: | 
|  | Transaction(TransformActions &TA) : TA(TA), Aborted(false) { | 
|  | TA.startTransaction(); | 
|  | } | 
|  |  | 
|  | ~Transaction() { | 
|  | if (!isAborted()) | 
|  | TA.commitTransaction(); | 
|  | } | 
|  |  | 
|  | void abort() { | 
|  | TA.abortTransaction(); | 
|  | Aborted = true; | 
|  | } | 
|  |  | 
|  | bool isAborted() const { return Aborted; } | 
|  | }; | 
|  |  | 
|  | class MigrationPass { | 
|  | public: | 
|  | ASTContext &Ctx; | 
|  | LangOptions::GCMode OrigGCMode; | 
|  | MigratorOptions MigOptions; | 
|  | Sema &SemaRef; | 
|  | TransformActions &TA; | 
|  | const CapturedDiagList &CapturedDiags; | 
|  | std::vector<SourceLocation> &ARCMTMacroLocs; | 
|  | Optional<bool> EnableCFBridgeFns; | 
|  |  | 
|  | MigrationPass(ASTContext &Ctx, LangOptions::GCMode OrigGCMode, | 
|  | Sema &sema, TransformActions &TA, | 
|  | const CapturedDiagList &capturedDiags, | 
|  | std::vector<SourceLocation> &ARCMTMacroLocs) | 
|  | : Ctx(Ctx), OrigGCMode(OrigGCMode), MigOptions(), | 
|  | SemaRef(sema), TA(TA), CapturedDiags(capturedDiags), | 
|  | ARCMTMacroLocs(ARCMTMacroLocs) { } | 
|  |  | 
|  | const CapturedDiagList &getDiags() const { return CapturedDiags; } | 
|  |  | 
|  | bool isGCMigration() const { return OrigGCMode != LangOptions::NonGC; } | 
|  | bool noFinalizeRemoval() const { return MigOptions.NoFinalizeRemoval; } | 
|  | void setNoFinalizeRemoval(bool val) {MigOptions.NoFinalizeRemoval = val; } | 
|  |  | 
|  | bool CFBridgingFunctionsDefined(); | 
|  | }; | 
|  |  | 
|  | static inline StringRef getARCMTMacroName() { | 
|  | return "__IMPL_ARCMT_REMOVED_EXPR__"; | 
|  | } | 
|  |  | 
|  | } // end namespace arcmt | 
|  |  | 
|  | } // end namespace clang | 
|  |  | 
|  | #endif |