1 //===--- TransUnusedInitDelegate.cpp - Transformations to ARC mode --------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 //===----------------------------------------------------------------------===//
11 // rewriteUnusedInitDelegate:
13 // Rewrites an unused result of calling a delegate initialization, to assigning
14 // the result to self.
18 // self = [self init];
20 //===----------------------------------------------------------------------===//
22 #include "Transforms.h"
23 #include "Internals.h"
24 #include "clang/AST/ASTContext.h"
25 #include "clang/Sema/SemaDiagnostic.h"
27 using namespace clang
;
28 using namespace arcmt
;
29 using namespace trans
;
33 class UnusedInitRewriter
: public RecursiveASTVisitor
<UnusedInitRewriter
> {
40 UnusedInitRewriter(MigrationPass
&pass
)
41 : Body(nullptr), Pass(pass
) { }
43 void transformBody(Stmt
*body
, Decl
*ParentD
) {
45 collectRemovables(body
, Removables
);
49 bool VisitObjCMessageExpr(ObjCMessageExpr
*ME
) {
50 if (ME
->isDelegateInitCall() &&
52 Pass
.TA
.hasDiagnostic(diag::err_arc_unused_init_message
,
54 Transaction
Trans(Pass
.TA
);
55 Pass
.TA
.clearDiagnostic(diag::err_arc_unused_init_message
,
57 SourceRange ExprRange
= ME
->getSourceRange();
58 Pass
.TA
.insert(ExprRange
.getBegin(), "if (!(self = ");
59 std::string retStr
= ")) return ";
60 retStr
+= getNilString(Pass
);
61 Pass
.TA
.insertAfterToken(ExprRange
.getEnd(), retStr
);
67 bool isRemovable(Expr
*E
) const {
68 return Removables
.count(E
);
72 } // anonymous namespace
74 void trans::rewriteUnusedInitDelegate(MigrationPass
&pass
) {
75 BodyTransform
<UnusedInitRewriter
> trans(pass
);
76 trans
.TraverseDecl(pass
.Ctx
.getTranslationUnitDecl());