Transforms.h revision 7196d06c2fb020a91a26e727be1871110b4a0dc9
1//===-- Transforms.h - Tranformations to ARC mode ---------------*- 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_TRANSFORMS_H 11#define LLVM_CLANG_LIB_ARCMIGRATE_TRANSFORMS_H 12 13#include "clang/AST/RecursiveASTVisitor.h" 14#include "llvm/ADT/DenseSet.h" 15 16namespace clang { 17 class Decl; 18 class Stmt; 19 class BlockDecl; 20 class ObjCMethodDecl; 21 class FunctionDecl; 22 23namespace arcmt { 24 class MigrationPass; 25 26namespace trans { 27 28//===----------------------------------------------------------------------===// 29// Transformations. 30//===----------------------------------------------------------------------===// 31 32void rewriteAutoreleasePool(MigrationPass &pass); 33void rewriteUnbridgedCasts(MigrationPass &pass); 34void rewriteAllocCopyWithZone(MigrationPass &pass); 35void makeAssignARCSafe(MigrationPass &pass); 36void removeRetainReleaseDealloc(MigrationPass &pass); 37void removeEmptyStatements(MigrationPass &pass); 38void removeZeroOutPropsInDealloc(MigrationPass &pass); 39void changeIvarsOfAssignProperties(MigrationPass &pass); 40void rewriteBlockObjCVariable(MigrationPass &pass); 41void removeDeallocMethod(MigrationPass &pass); 42void rewriteUnusedInitDelegate(MigrationPass &pass); 43 44//===----------------------------------------------------------------------===// 45// Helpers. 46//===----------------------------------------------------------------------===// 47 48/// \brief 'Loc' is the end of a statement range. This returns the location 49/// immediately after the semicolon following the statement. 50/// If no semicolon is found or the location is inside a macro, the returned 51/// source location will be invalid. 52SourceLocation findLocationAfterSemi(SourceLocation loc, ASTContext &Ctx); 53 54bool hasSideEffects(Expr *E, ASTContext &Ctx); 55 56template <typename BODY_TRANS> 57class BodyTransform : public RecursiveASTVisitor<BodyTransform<BODY_TRANS> > { 58 MigrationPass &Pass; 59 60public: 61 BodyTransform(MigrationPass &pass) : Pass(pass) { } 62 63 void handleBody(Decl *D) { 64 Stmt *body = D->getBody(); 65 if (body) { 66 BODY_TRANS(D, Pass).transformBody(body); 67 } 68 } 69 70 bool TraverseBlockDecl(BlockDecl *D) { 71 handleBody(D); 72 return true; 73 } 74 bool TraverseObjCMethodDecl(ObjCMethodDecl *D) { 75 if (D->isThisDeclarationADefinition()) 76 handleBody(D); 77 return true; 78 } 79 bool TraverseFunctionDecl(FunctionDecl *D) { 80 if (D->isThisDeclarationADefinition()) 81 handleBody(D); 82 return true; 83 } 84}; 85 86typedef llvm::DenseSet<Expr *> ExprSet; 87 88void clearRefsIn(Stmt *S, ExprSet &refs); 89template <typename iterator> 90void clearRefsIn(iterator begin, iterator end, ExprSet &refs) { 91 for (; begin != end; ++begin) 92 clearRefsIn(*begin, refs); 93} 94 95void collectRefs(ValueDecl *D, Stmt *S, ExprSet &refs); 96 97void collectRemovables(Stmt *S, ExprSet &exprs); 98 99} // end namespace trans 100 101} // end namespace arcmt 102 103} // end namespace clang 104 105#endif 106