Transforms.h revision 224135
1224135Sdim//===-- Transforms.h - Tranformations to ARC mode ---------------*- C++ -*-===// 2224135Sdim// 3224135Sdim// The LLVM Compiler Infrastructure 4224135Sdim// 5224135Sdim// This file is distributed under the University of Illinois Open Source 6224135Sdim// License. See LICENSE.TXT for details. 7224135Sdim// 8224135Sdim//===----------------------------------------------------------------------===// 9224135Sdim 10224135Sdim#ifndef LLVM_CLANG_LIB_ARCMIGRATE_TRANSFORMS_H 11224135Sdim#define LLVM_CLANG_LIB_ARCMIGRATE_TRANSFORMS_H 12224135Sdim 13224135Sdim#include "clang/AST/RecursiveASTVisitor.h" 14224135Sdim#include "llvm/ADT/DenseSet.h" 15224135Sdim 16224135Sdimnamespace clang { 17224135Sdim class Decl; 18224135Sdim class Stmt; 19224135Sdim class BlockDecl; 20224135Sdim class ObjCMethodDecl; 21224135Sdim class FunctionDecl; 22224135Sdim 23224135Sdimnamespace arcmt { 24224135Sdim class MigrationPass; 25224135Sdim 26224135Sdimnamespace trans { 27224135Sdim 28224135Sdim//===----------------------------------------------------------------------===// 29224135Sdim// Transformations. 30224135Sdim//===----------------------------------------------------------------------===// 31224135Sdim 32224135Sdimvoid rewriteAutoreleasePool(MigrationPass &pass); 33224135Sdimvoid rewriteUnbridgedCasts(MigrationPass &pass); 34224135Sdimvoid makeAssignARCSafe(MigrationPass &pass); 35224135Sdimvoid removeRetainReleaseDealloc(MigrationPass &pass); 36224135Sdimvoid removeZeroOutPropsInDealloc(MigrationPass &pass); 37224135Sdimvoid rewriteProperties(MigrationPass &pass); 38224135Sdimvoid rewriteBlockObjCVariable(MigrationPass &pass); 39224135Sdimvoid rewriteUnusedInitDelegate(MigrationPass &pass); 40224135Sdim 41224135Sdimvoid removeEmptyStatementsAndDealloc(MigrationPass &pass); 42224135Sdim 43224135Sdim//===----------------------------------------------------------------------===// 44224135Sdim// Helpers. 45224135Sdim//===----------------------------------------------------------------------===// 46224135Sdim 47224135Sdim/// \brief Determine whether we can add weak to the given type. 48224135Sdimbool canApplyWeak(ASTContext &Ctx, QualType type); 49224135Sdim 50224135Sdim/// \brief 'Loc' is the end of a statement range. This returns the location 51224135Sdim/// immediately after the semicolon following the statement. 52224135Sdim/// If no semicolon is found or the location is inside a macro, the returned 53224135Sdim/// source location will be invalid. 54224135SdimSourceLocation findLocationAfterSemi(SourceLocation loc, ASTContext &Ctx); 55224135Sdim 56224135Sdimbool hasSideEffects(Expr *E, ASTContext &Ctx); 57224135Sdimbool isGlobalVar(Expr *E); 58224135Sdim 59224135Sdim 60224135Sdimtemplate <typename BODY_TRANS> 61224135Sdimclass BodyTransform : public RecursiveASTVisitor<BodyTransform<BODY_TRANS> > { 62224135Sdim MigrationPass &Pass; 63224135Sdim 64224135Sdimpublic: 65224135Sdim BodyTransform(MigrationPass &pass) : Pass(pass) { } 66224135Sdim 67224135Sdim bool TraverseStmt(Stmt *rootS) { 68224135Sdim BODY_TRANS(Pass).transformBody(rootS); 69224135Sdim return true; 70224135Sdim } 71224135Sdim}; 72224135Sdim 73224135Sdimtypedef llvm::DenseSet<Expr *> ExprSet; 74224135Sdim 75224135Sdimvoid clearRefsIn(Stmt *S, ExprSet &refs); 76224135Sdimtemplate <typename iterator> 77224135Sdimvoid clearRefsIn(iterator begin, iterator end, ExprSet &refs) { 78224135Sdim for (; begin != end; ++begin) 79224135Sdim clearRefsIn(*begin, refs); 80224135Sdim} 81224135Sdim 82224135Sdimvoid collectRefs(ValueDecl *D, Stmt *S, ExprSet &refs); 83224135Sdim 84224135Sdimvoid collectRemovables(Stmt *S, ExprSet &exprs); 85224135Sdim 86224135Sdim} // end namespace trans 87224135Sdim 88224135Sdim} // end namespace arcmt 89224135Sdim 90224135Sdim} // end namespace clang 91224135Sdim 92224135Sdim#endif 93