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