aboutsummaryrefslogtreecommitdiff
path: root/lib/ARCMigrate/Transforms.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ARCMigrate/Transforms.h')
-rw-r--r--lib/ARCMigrate/Transforms.h51
1 files changed, 51 insertions, 0 deletions
diff --git a/lib/ARCMigrate/Transforms.h b/lib/ARCMigrate/Transforms.h
index 5e4db56dc8..0eabb21196 100644
--- a/lib/ARCMigrate/Transforms.h
+++ b/lib/ARCMigrate/Transforms.h
@@ -11,6 +11,7 @@
#define LLVM_CLANG_LIB_ARCMIGRATE_TRANSFORMS_H
#include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/AST/ParentMap.h"
#include "llvm/ADT/DenseSet.h"
namespace clang {
@@ -25,6 +26,8 @@ namespace arcmt {
namespace trans {
+ class MigrationContext;
+
//===----------------------------------------------------------------------===//
// Transformations.
//===----------------------------------------------------------------------===//
@@ -41,6 +44,54 @@ void checkAPIUses(MigrationPass &pass);
void removeEmptyStatementsAndDealloc(MigrationPass &pass);
+class BodyContext {
+ MigrationContext &MigrateCtx;
+ ParentMap PMap;
+ Stmt *TopStmt;
+
+public:
+ BodyContext(MigrationContext &MigrateCtx, Stmt *S)
+ : MigrateCtx(MigrateCtx), PMap(S), TopStmt(S) {}
+
+ MigrationContext &getMigrationContext() { return MigrateCtx; }
+ ParentMap &getParentMap() { return PMap; }
+ Stmt *getTopStmt() { return TopStmt; }
+};
+
+class ASTTraverser {
+public:
+ virtual ~ASTTraverser();
+ virtual void traverseBody(BodyContext &BodyCtx) { }
+};
+
+class MigrationContext {
+ MigrationPass &Pass;
+ std::vector<ASTTraverser *> Traversers;
+
+public:
+ explicit MigrationContext(MigrationPass &pass) : Pass(pass) {}
+ ~MigrationContext();
+
+ MigrationPass &getPass() { return Pass; }
+
+ typedef std::vector<ASTTraverser *>::iterator traverser_iterator;
+ traverser_iterator traversers_begin() { return Traversers.begin(); }
+ traverser_iterator traversers_end() { return Traversers.end(); }
+
+ void addTraverser(ASTTraverser *traverser) {
+ Traversers.push_back(traverser);
+ }
+
+ void traverse(TranslationUnitDecl *TU);
+};
+
+// GC transformations
+
+class GCCollectableCallsTraverser : public ASTTraverser {
+public:
+ virtual void traverseBody(BodyContext &BodyCtx);
+};
+
//===----------------------------------------------------------------------===//
// Helpers.
//===----------------------------------------------------------------------===//