Home | History | Annotate | Download | only in ARCMigrate
      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(ArrayRef<unsigned> IDs, SourceRange range);
     30   bool hasDiagnostic(ArrayRef<unsigned> IDs, SourceRange range) const;
     31 
     32   void reportDiagnostics(DiagnosticsEngine &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                           ArrayRef<StoredDiagnostic> diags,
     43                           SourceManager &SM, const LangOptions &LangOpts);
     44 
     45 class TransformActions {
     46   DiagnosticsEngine &Diags;
     47   CapturedDiagList &CapturedDiags;
     48   bool ReportedErrors;
     49   void *Impl; // TransformActionsImpl.
     50 
     51 public:
     52   TransformActions(DiagnosticsEngine &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, StringRef text);
     61   void insertAfterToken(SourceLocation loc, StringRef text);
     62   void remove(SourceRange range);
     63   void removeStmt(Stmt *S);
     64   void replace(SourceRange range, StringRef text);
     65   void replace(SourceRange range, SourceRange replacementRange);
     66   void replaceStmt(Stmt *S, StringRef text);
     67   void replaceText(SourceLocation loc, StringRef text,
     68                    StringRef replacementText);
     69   void increaseIndentation(SourceRange range,
     70                            SourceLocation parentIndent);
     71 
     72   bool clearDiagnostic(ArrayRef<unsigned> IDs, SourceRange range);
     73   bool clearAllDiagnostics(SourceRange range) {
     74     return clearDiagnostic(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(StringRef error, SourceLocation loc,
     96                    SourceRange range = SourceRange());
     97   void reportWarning(StringRef warning, SourceLocation loc,
     98                    SourceRange range = SourceRange());
     99   void reportNote(StringRef note, SourceLocation loc,
    100                   SourceRange range = SourceRange());
    101 
    102   bool hasReportedErrors() const { return ReportedErrors; }
    103 
    104   class RewriteReceiver {
    105   public:
    106     virtual ~RewriteReceiver();
    107 
    108     virtual void insert(SourceLocation loc, StringRef text) = 0;
    109     virtual void remove(CharSourceRange range) = 0;
    110     virtual void increaseIndentation(CharSourceRange range,
    111                                      SourceLocation parentIndent) = 0;
    112   };
    113 
    114   void applyRewrites(RewriteReceiver &receiver);
    115 };
    116 
    117 class Transaction {
    118   TransformActions &TA;
    119   bool Aborted;
    120 
    121 public:
    122   Transaction(TransformActions &TA) : TA(TA), Aborted(false) {
    123     TA.startTransaction();
    124   }
    125 
    126   ~Transaction() {
    127     if (!isAborted())
    128       TA.commitTransaction();
    129   }
    130 
    131   void abort() {
    132     TA.abortTransaction();
    133     Aborted = true;
    134   }
    135 
    136   bool isAborted() const { return Aborted; }
    137 };
    138 
    139 class MigrationPass {
    140 public:
    141   ASTContext &Ctx;
    142   LangOptions::GCMode OrigGCMode;
    143   MigratorOptions MigOptions;
    144   Sema &SemaRef;
    145   TransformActions &TA;
    146   std::vector<SourceLocation> &ARCMTMacroLocs;
    147 
    148   MigrationPass(ASTContext &Ctx, LangOptions::GCMode OrigGCMode,
    149                 Sema &sema, TransformActions &TA,
    150                 std::vector<SourceLocation> &ARCMTMacroLocs)
    151     : Ctx(Ctx), OrigGCMode(OrigGCMode), MigOptions(),
    152       SemaRef(sema), TA(TA),
    153       ARCMTMacroLocs(ARCMTMacroLocs) { }
    154 
    155   bool isGCMigration() const { return OrigGCMode != LangOptions::NonGC; }
    156   bool noNSAllocReallocError() const { return MigOptions.NoNSAllocReallocError; }
    157   void setNSAllocReallocError(bool val) { MigOptions.NoNSAllocReallocError = val; }
    158   bool noFinalizeRemoval() const { return MigOptions.NoFinalizeRemoval; }
    159   void setNoFinalizeRemoval(bool val) {MigOptions.NoFinalizeRemoval = val; }
    160 };
    161 
    162 static inline StringRef getARCMTMacroName() {
    163   return "__IMPL_ARCMT_REMOVED_EXPR__";
    164 }
    165 
    166 } // end namespace arcmt
    167 
    168 } // end namespace clang
    169 
    170 #endif
    171