Skip to content

Commit 1d69bd5

Browse files
committed
Migrate most visitors off CRTP BodyTransform
1 parent d437141 commit 1d69bd5

File tree

5 files changed

+55
-23
lines changed

5 files changed

+55
-23
lines changed

clang/lib/ARCMigrate/TransAutoreleasePool.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,18 +65,25 @@ class ReleaseCollector : public DynamicRecursiveASTVisitor {
6565

6666
namespace {
6767

68-
class AutoreleasePoolRewriter : public DynamicRecursiveASTVisitor {
68+
class AutoreleasePoolRewriter : public BodyTransform {
69+
bool TraversingBody = false;
70+
6971
public:
7072
AutoreleasePoolRewriter(MigrationPass &pass)
71-
: Body(nullptr), Pass(pass) {
73+
: BodyTransform(pass), Body(nullptr) {
7274
PoolII = &pass.Ctx.Idents.get("NSAutoreleasePool");
7375
DrainSel = pass.Ctx.Selectors.getNullarySelector(
7476
&pass.Ctx.Idents.get("drain"));
7577
}
7678

77-
void transformBody(Stmt *body, Decl *ParentD) {
79+
bool TraverseStmt(Stmt *body) override {
80+
if (TraversingBody)
81+
return BodyTransform::TraverseStmt(body);
82+
83+
llvm::SaveAndRestore Restore{TraversingBody, true};
7884
Body = body;
79-
TraverseStmt(body);
85+
BodyTransform::TraverseStmt(body);
86+
return true;
8087
}
8188

8289
~AutoreleasePoolRewriter() override {
@@ -410,7 +417,6 @@ class AutoreleasePoolRewriter : public DynamicRecursiveASTVisitor {
410417
}
411418

412419
Stmt *Body;
413-
MigrationPass &Pass;
414420

415421
IdentifierInfo *PoolII;
416422
Selector DrainSel;
@@ -429,6 +435,6 @@ class AutoreleasePoolRewriter : public DynamicRecursiveASTVisitor {
429435
} // anonymous namespace
430436

431437
void trans::rewriteAutoreleasePool(MigrationPass &pass) {
432-
BodyTransform<AutoreleasePoolRewriter> trans(pass);
438+
AutoreleasePoolRewriter trans(pass);
433439
trans.TraverseDecl(pass.Ctx.getTranslationUnitDecl());
434440
}

clang/lib/ARCMigrate/TransRetainReleaseDealloc.cpp

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,29 +32,34 @@ using namespace trans;
3232

3333
namespace {
3434

35-
class RetainReleaseDeallocRemover : public DynamicRecursiveASTVisitor {
35+
class RetainReleaseDeallocRemover : public BodyTransform {
3636
Stmt *Body;
37-
MigrationPass &Pass;
3837

3938
ExprSet Removables;
4039
std::unique_ptr<ParentMap> StmtMap;
40+
bool TraversingBody = false;
4141

4242
Selector DelegateSel, FinalizeSel;
4343

4444
public:
4545
RetainReleaseDeallocRemover(MigrationPass &pass)
46-
: Body(nullptr), Pass(pass) {
46+
: BodyTransform(pass), Body(nullptr) {
4747
DelegateSel =
4848
Pass.Ctx.Selectors.getNullarySelector(&Pass.Ctx.Idents.get("delegate"));
4949
FinalizeSel =
5050
Pass.Ctx.Selectors.getNullarySelector(&Pass.Ctx.Idents.get("finalize"));
5151
}
5252

53-
void transformBody(Stmt *body, Decl *ParentD) {
53+
bool TraverseStmt(Stmt *body) override {
54+
if (TraversingBody)
55+
return BodyTransform::TraverseStmt(body);
56+
57+
llvm::SaveAndRestore Restore{TraversingBody, true};
5458
Body = body;
5559
collectRemovables(body, Removables);
5660
StmtMap.reset(new ParentMap(body));
57-
TraverseStmt(body);
61+
BodyTransform::TraverseStmt(body);
62+
return true;
5863
}
5964

6065
bool VisitObjCMessageExpr(ObjCMessageExpr *E) override {
@@ -453,6 +458,6 @@ class RetainReleaseDeallocRemover : public DynamicRecursiveASTVisitor {
453458
} // anonymous namespace
454459

455460
void trans::removeRetainReleaseDeallocFinalize(MigrationPass &pass) {
456-
BodyTransform<RetainReleaseDeallocRemover> trans(pass);
461+
RetainReleaseDeallocRemover trans(pass);
457462
trans.TraverseDecl(pass.Ctx.getTranslationUnitDecl());
458463
}

clang/lib/ARCMigrate/TransUnbridgedCasts.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,6 @@ class UnbridgedCastRewriter : public DynamicRecursiveASTVisitor {
462462
} // end anonymous namespace
463463

464464
void trans::rewriteUnbridgedCasts(MigrationPass &pass) {
465-
BodyTransform<UnbridgedCastRewriter> trans(pass);
465+
BodyTransform_OLD<UnbridgedCastRewriter> trans(pass);
466466
trans.TraverseDecl(pass.Ctx.getTranslationUnitDecl());
467467
}

clang/lib/ARCMigrate/TransUnusedInitDelegate.cpp

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,24 @@ using namespace trans;
3131

3232
namespace {
3333

34-
class UnusedInitRewriter : public DynamicRecursiveASTVisitor {
34+
class UnusedInitRewriter : public BodyTransform {
3535
Stmt *Body;
36-
MigrationPass &Pass;
37-
3836
ExprSet Removables;
37+
bool TraversingBody = false;
3938

4039
public:
4140
UnusedInitRewriter(MigrationPass &pass)
42-
: Body(nullptr), Pass(pass) { }
41+
: BodyTransform(pass), Body(nullptr) {}
42+
43+
bool TraverseStmt(Stmt *body) override {
44+
if (TraversingBody)
45+
return BodyTransform::TraverseStmt(body);
4346

44-
void transformBody(Stmt *body, Decl *ParentD) {
47+
llvm::SaveAndRestore Restore{TraversingBody, true};
4548
Body = body;
4649
collectRemovables(body, Removables);
47-
TraverseStmt(body);
50+
BodyTransform::TraverseStmt(body);
51+
return true;
4852
}
4953

5054
bool VisitObjCMessageExpr(ObjCMessageExpr *ME) override {
@@ -73,6 +77,6 @@ class UnusedInitRewriter : public DynamicRecursiveASTVisitor {
7377
} // anonymous namespace
7478

7579
void trans::rewriteUnusedInitDelegate(MigrationPass &pass) {
76-
BodyTransform<UnusedInitRewriter> trans(pass);
80+
UnusedInitRewriter trans(pass);
7781
trans.TraverseDecl(pass.Ctx.getTranslationUnitDecl());
7882
}

clang/lib/ARCMigrate/Transforms.h

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#ifndef LLVM_CLANG_LIB_ARCMIGRATE_TRANSFORMS_H
1010
#define LLVM_CLANG_LIB_ARCMIGRATE_TRANSFORMS_H
1111

12+
#include "clang/AST/DynamicRecursiveASTVisitor.h"
1213
#include "clang/AST/ParentMap.h"
1314
#include "clang/AST/RecursiveASTVisitor.h"
1415
#include "llvm/ADT/DenseSet.h"
@@ -182,13 +183,15 @@ bool isGlobalVar(Expr *E);
182183
StringRef getNilString(MigrationPass &Pass);
183184

184185
template <typename BODY_TRANS>
185-
class BodyTransform : public RecursiveASTVisitor<BodyTransform<BODY_TRANS> > {
186+
class BodyTransform_OLD
187+
: public RecursiveASTVisitor<BodyTransform_OLD<BODY_TRANS>> {
186188
MigrationPass &Pass;
187189
Decl *ParentD;
188190

189-
typedef RecursiveASTVisitor<BodyTransform<BODY_TRANS> > base;
191+
typedef RecursiveASTVisitor<BodyTransform_OLD<BODY_TRANS>> base;
192+
190193
public:
191-
BodyTransform(MigrationPass &pass) : Pass(pass), ParentD(nullptr) { }
194+
BodyTransform_OLD(MigrationPass &pass) : Pass(pass), ParentD(nullptr) {}
192195

193196
bool TraverseStmt(Stmt *rootS) {
194197
if (rootS)
@@ -202,6 +205,20 @@ class BodyTransform : public RecursiveASTVisitor<BodyTransform<BODY_TRANS> > {
202205
}
203206
};
204207

208+
class BodyTransform : public DynamicRecursiveASTVisitor {
209+
protected:
210+
MigrationPass &Pass;
211+
Decl *ParentD;
212+
213+
public:
214+
BodyTransform(MigrationPass &pass) : Pass(pass), ParentD(nullptr) {}
215+
216+
bool TraverseObjCMethodDecl(ObjCMethodDecl *D) override {
217+
SaveAndRestore<Decl *> SetParent(ParentD, D);
218+
return DynamicRecursiveASTVisitor::TraverseObjCMethodDecl(D);
219+
}
220+
};
221+
205222
typedef llvm::DenseSet<Expr *> ExprSet;
206223

207224
void clearRefsIn(Stmt *S, ExprSet &refs);

0 commit comments

Comments
 (0)