Transforms.h revision 86625b5650cdddc38c0b4cc1eb7fb460478c9d11
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 makeAssignARCSafe(MigrationPass &pass);
35void removeRetainReleaseDealloc(MigrationPass &pass);
36void removeZeroOutPropsInDealloc(MigrationPass &pass);
37void changeIvarsOfAssignProperties(MigrationPass &pass);
38void rewriteBlockObjCVariable(MigrationPass &pass);
39void rewriteUnusedInitDelegate(MigrationPass &pass);
40
41void removeEmptyStatementsAndDealloc(MigrationPass &pass);
42
43//===----------------------------------------------------------------------===//
44// Helpers.
45//===----------------------------------------------------------------------===//
46
47/// \brief Determine whether we can add weak to the given type.
48bool canApplyWeak(ASTContext &Ctx, QualType type);
49
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.
54SourceLocation findLocationAfterSemi(SourceLocation loc, ASTContext &Ctx);
55
56bool hasSideEffects(Expr *E, ASTContext &Ctx);
57
58template <typename BODY_TRANS>
59class BodyTransform : public RecursiveASTVisitor<BodyTransform<BODY_TRANS> > {
60  MigrationPass &Pass;
61
62public:
63  BodyTransform(MigrationPass &pass) : Pass(pass) { }
64
65  bool TraverseStmt(Stmt *rootS) {
66    BODY_TRANS(Pass).transformBody(rootS);
67    return true;
68  }
69};
70
71typedef llvm::DenseSet<Expr *> ExprSet;
72
73void clearRefsIn(Stmt *S, ExprSet &refs);
74template <typename iterator>
75void clearRefsIn(iterator begin, iterator end, ExprSet &refs) {
76  for (; begin != end; ++begin)
77    clearRefsIn(*begin, refs);
78}
79
80void collectRefs(ValueDecl *D, Stmt *S, ExprSet &refs);
81
82void collectRemovables(Stmt *S, ExprSet &exprs);
83
84} // end namespace trans
85
86} // end namespace arcmt
87
88} // end namespace clang
89
90#endif
91