1 //===-- Transforms.h - Tranformations to ARC mode ---------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_CLANG_LIB_ARCMIGRATE_TRANSFORMS_H
11 #define LLVM_CLANG_LIB_ARCMIGRATE_TRANSFORMS_H
13 #include "clang/AST/RecursiveASTVisitor.h"
14 #include "llvm/ADT/DenseSet.h"
28 //===----------------------------------------------------------------------===//
30 //===----------------------------------------------------------------------===//
32 void rewriteAutoreleasePool(MigrationPass &pass);
33 void rewriteUnbridgedCasts(MigrationPass &pass);
34 void makeAssignARCSafe(MigrationPass &pass);
35 void removeRetainReleaseDealloc(MigrationPass &pass);
36 void removeZeroOutPropsInDealloc(MigrationPass &pass);
37 void rewriteProperties(MigrationPass &pass);
38 void rewriteBlockObjCVariable(MigrationPass &pass);
39 void rewriteUnusedInitDelegate(MigrationPass &pass);
41 void removeEmptyStatementsAndDealloc(MigrationPass &pass);
43 //===----------------------------------------------------------------------===//
45 //===----------------------------------------------------------------------===//
47 /// \brief Determine whether we can add weak to the given type.
48 bool canApplyWeak(ASTContext &Ctx, QualType type);
50 /// \brief 'Loc' is the end of a statement range. This returns the location
51 /// immediately after the semicolon following the statement.
52 /// If no semicolon is found or the location is inside a macro, the returned
53 /// source location will be invalid.
54 SourceLocation findLocationAfterSemi(SourceLocation loc, ASTContext &Ctx);
56 bool hasSideEffects(Expr *E, ASTContext &Ctx);
57 bool isGlobalVar(Expr *E);
60 template <typename BODY_TRANS>
61 class BodyTransform : public RecursiveASTVisitor<BodyTransform<BODY_TRANS> > {
65 BodyTransform(MigrationPass &pass) : Pass(pass) { }
67 bool TraverseStmt(Stmt *rootS) {
68 BODY_TRANS(Pass).transformBody(rootS);
73 typedef llvm::DenseSet<Expr *> ExprSet;
75 void clearRefsIn(Stmt *S, ExprSet &refs);
76 template <typename iterator>
77 void clearRefsIn(iterator begin, iterator end, ExprSet &refs) {
78 for (; begin != end; ++begin)
79 clearRefsIn(*begin, refs);
82 void collectRefs(ValueDecl *D, Stmt *S, ExprSet &refs);
84 void collectRemovables(Stmt *S, ExprSet &exprs);
86 } // end namespace trans
88 } // end namespace arcmt
90 } // end namespace clang