annotate clang/lib/ARCMigrate/TransUnusedInitDelegate.cpp @ 176:de4ac79aef9d

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 17:13:11 +0900
parents 1d019706d866
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===--- TransUnusedInitDelegate.cpp - Transformations to ARC mode --------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 // Transformations:
anatofuz
parents:
diff changeset
9 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
10 //
anatofuz
parents:
diff changeset
11 // rewriteUnusedInitDelegate:
anatofuz
parents:
diff changeset
12 //
anatofuz
parents:
diff changeset
13 // Rewrites an unused result of calling a delegate initialization, to assigning
anatofuz
parents:
diff changeset
14 // the result to self.
anatofuz
parents:
diff changeset
15 // e.g
anatofuz
parents:
diff changeset
16 // [self init];
anatofuz
parents:
diff changeset
17 // ---->
anatofuz
parents:
diff changeset
18 // self = [self init];
anatofuz
parents:
diff changeset
19 //
anatofuz
parents:
diff changeset
20 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
21
anatofuz
parents:
diff changeset
22 #include "Transforms.h"
anatofuz
parents:
diff changeset
23 #include "Internals.h"
anatofuz
parents:
diff changeset
24 #include "clang/AST/ASTContext.h"
anatofuz
parents:
diff changeset
25 #include "clang/Sema/SemaDiagnostic.h"
anatofuz
parents:
diff changeset
26
anatofuz
parents:
diff changeset
27 using namespace clang;
anatofuz
parents:
diff changeset
28 using namespace arcmt;
anatofuz
parents:
diff changeset
29 using namespace trans;
anatofuz
parents:
diff changeset
30
anatofuz
parents:
diff changeset
31 namespace {
anatofuz
parents:
diff changeset
32
anatofuz
parents:
diff changeset
33 class UnusedInitRewriter : public RecursiveASTVisitor<UnusedInitRewriter> {
anatofuz
parents:
diff changeset
34 Stmt *Body;
anatofuz
parents:
diff changeset
35 MigrationPass &Pass;
anatofuz
parents:
diff changeset
36
anatofuz
parents:
diff changeset
37 ExprSet Removables;
anatofuz
parents:
diff changeset
38
anatofuz
parents:
diff changeset
39 public:
anatofuz
parents:
diff changeset
40 UnusedInitRewriter(MigrationPass &pass)
anatofuz
parents:
diff changeset
41 : Body(nullptr), Pass(pass) { }
anatofuz
parents:
diff changeset
42
anatofuz
parents:
diff changeset
43 void transformBody(Stmt *body, Decl *ParentD) {
anatofuz
parents:
diff changeset
44 Body = body;
anatofuz
parents:
diff changeset
45 collectRemovables(body, Removables);
anatofuz
parents:
diff changeset
46 TraverseStmt(body);
anatofuz
parents:
diff changeset
47 }
anatofuz
parents:
diff changeset
48
anatofuz
parents:
diff changeset
49 bool VisitObjCMessageExpr(ObjCMessageExpr *ME) {
anatofuz
parents:
diff changeset
50 if (ME->isDelegateInitCall() &&
anatofuz
parents:
diff changeset
51 isRemovable(ME) &&
anatofuz
parents:
diff changeset
52 Pass.TA.hasDiagnostic(diag::err_arc_unused_init_message,
anatofuz
parents:
diff changeset
53 ME->getExprLoc())) {
anatofuz
parents:
diff changeset
54 Transaction Trans(Pass.TA);
anatofuz
parents:
diff changeset
55 Pass.TA.clearDiagnostic(diag::err_arc_unused_init_message,
anatofuz
parents:
diff changeset
56 ME->getExprLoc());
anatofuz
parents:
diff changeset
57 SourceRange ExprRange = ME->getSourceRange();
anatofuz
parents:
diff changeset
58 Pass.TA.insert(ExprRange.getBegin(), "if (!(self = ");
anatofuz
parents:
diff changeset
59 std::string retStr = ")) return ";
anatofuz
parents:
diff changeset
60 retStr += getNilString(Pass);
anatofuz
parents:
diff changeset
61 Pass.TA.insertAfterToken(ExprRange.getEnd(), retStr);
anatofuz
parents:
diff changeset
62 }
anatofuz
parents:
diff changeset
63 return true;
anatofuz
parents:
diff changeset
64 }
anatofuz
parents:
diff changeset
65
anatofuz
parents:
diff changeset
66 private:
anatofuz
parents:
diff changeset
67 bool isRemovable(Expr *E) const {
anatofuz
parents:
diff changeset
68 return Removables.count(E);
anatofuz
parents:
diff changeset
69 }
anatofuz
parents:
diff changeset
70 };
anatofuz
parents:
diff changeset
71
anatofuz
parents:
diff changeset
72 } // anonymous namespace
anatofuz
parents:
diff changeset
73
anatofuz
parents:
diff changeset
74 void trans::rewriteUnusedInitDelegate(MigrationPass &pass) {
anatofuz
parents:
diff changeset
75 BodyTransform<UnusedInitRewriter> trans(pass);
anatofuz
parents:
diff changeset
76 trans.TraverseDecl(pass.Ctx.getTranslationUnitDecl());
anatofuz
parents:
diff changeset
77 }