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