@@ -19,18 +19,21 @@ namespace misc {
19
19
void UniqueptrResetReleaseCheck::registerMatchers (MatchFinder *Finder) {
20
20
Finder->addMatcher (
21
21
cxxMemberCallExpr (
22
- on (expr ().bind (" left" )), callee (memberExpr ().bind (" reset_member" )),
23
- callee (
24
- cxxMethodDecl (hasName (" reset" ),
25
- ofClass (cxxRecordDecl (hasName (" ::std::unique_ptr" ),
26
- decl ().bind (" left_class" ))))),
27
- has (ignoringParenImpCasts (cxxMemberCallExpr (
28
- on (expr ().bind (" right" )),
29
- callee (memberExpr ().bind (" release_member" )),
30
- callee (cxxMethodDecl (
31
- hasName (" release" ),
32
- ofClass (cxxRecordDecl (hasName (" ::std::unique_ptr" ),
33
- decl ().bind (" right_class" )))))))))
22
+ callee (memberExpr (
23
+ member (cxxMethodDecl (
24
+ hasName (" reset" ),
25
+ ofClass (cxxRecordDecl (hasName (" ::std::unique_ptr" ),
26
+ decl ().bind (" left_class" ))))))
27
+ .bind (" reset_member" )),
28
+ hasArgument (
29
+ 0 , ignoringParenImpCasts (cxxMemberCallExpr (
30
+ on (expr ().bind (" right" )),
31
+ callee (memberExpr (member (cxxMethodDecl (
32
+ hasName (" release" ),
33
+ ofClass (cxxRecordDecl (
34
+ hasName (" ::std::unique_ptr" ),
35
+ decl ().bind (" right_class" ))))))
36
+ .bind (" release_member" ))))))
34
37
.bind (" reset_call" ),
35
38
this );
36
39
}
@@ -95,37 +98,31 @@ void UniqueptrResetReleaseCheck::check(const MatchFinder::MatchResult &Result) {
95
98
const auto *ReleaseMember =
96
99
Result.Nodes .getNodeAs <MemberExpr>(" release_member" );
97
100
const auto *Right = Result.Nodes .getNodeAs <Expr>(" right" );
98
- const auto *Left = Result.Nodes .getNodeAs <Expr>(" left" );
99
101
const auto *ResetCall =
100
102
Result.Nodes .getNodeAs <CXXMemberCallExpr>(" reset_call" );
101
103
102
- std::string LeftText = std::string (clang::Lexer::getSourceText (
103
- CharSourceRange::getTokenRange (Left->getSourceRange ()),
104
- *Result.SourceManager , getLangOpts ()));
105
- std::string RightText = std::string (clang::Lexer::getSourceText (
106
- CharSourceRange::getTokenRange (Right->getSourceRange ()),
107
- *Result.SourceManager , getLangOpts ()));
108
-
109
- if (ResetMember->isArrow ())
110
- LeftText = " *" + LeftText;
111
- if (ReleaseMember->isArrow ())
112
- RightText = " *" + RightText;
113
- bool IsMove = false ;
114
- // Even if x was rvalue, *x is not rvalue anymore.
115
- if (!Right->isRValue () || ReleaseMember->isArrow ()) {
116
- RightText = " std::move(" + RightText + " )" ;
117
- IsMove = true ;
104
+ StringRef AssignmentText = " = " ;
105
+ StringRef TrailingText = " " ;
106
+ if (ReleaseMember->isArrow ()) {
107
+ AssignmentText = " = std::move(*" ;
108
+ TrailingText = " )" ;
109
+ } else if (!Right->isRValue ()) {
110
+ AssignmentText = " = std::move(" ;
111
+ TrailingText = " )" ;
118
112
}
119
113
120
- std::string NewText = LeftText + " = " + RightText;
121
-
122
- diag (ResetMember->getExprLoc (),
123
- " prefer ptr = %select{std::move(ptr2)|ReturnUnique()}0 over "
124
- " ptr.reset(%select{ptr2|ReturnUnique()}0.release())" )
125
- << !IsMove
126
- << FixItHint::CreateReplacement (
127
- CharSourceRange::getTokenRange (ResetCall->getSourceRange ()),
128
- NewText);
114
+ auto D = diag (ResetMember->getExprLoc (),
115
+ " prefer 'unique_ptr<>' assignment over 'release' and 'reset'" );
116
+ if (ResetMember->isArrow ())
117
+ D << FixItHint::CreateInsertion (ResetMember->getBeginLoc (), " *" );
118
+ D << FixItHint::CreateReplacement (
119
+ CharSourceRange::getCharRange (ResetMember->getOperatorLoc (),
120
+ Right->getBeginLoc ()),
121
+ AssignmentText)
122
+ << FixItHint::CreateReplacement (
123
+ CharSourceRange::getTokenRange (ReleaseMember->getOperatorLoc (),
124
+ ResetCall->getEndLoc ()),
125
+ TrailingText);
129
126
}
130
127
131
128
} // namespace misc
0 commit comments