Skip to content

Commit 2a4dadd

Browse files
committed
fix type suggestion for manual_is_ascii_check (#13913)
1 parent 7a834b5 commit 2a4dadd

File tree

4 files changed

+38
-9
lines changed

4 files changed

+38
-9
lines changed

clippy_lints/src/manual_is_ascii_check.rs

+5-8
Original file line numberDiff line numberDiff line change
@@ -123,18 +123,15 @@ impl<'tcx> LateLintPass<'tcx> for ManualIsAsciiCheck {
123123
extract_msrv_attr!(LateContext);
124124
}
125125

126-
fn get_ty_sugg(cx: &LateContext<'_>, arg: &Expr<'_>, bound_expr: &Expr<'_>) -> Option<(Span, &'static str)> {
127-
if let ExprKind::Lit(lit) = bound_expr.kind
126+
fn get_ty_sugg(cx: &LateContext<'_>, arg: &Expr<'_>, bound_expr: &Expr<'_>) -> Option<(Span, String)> {
127+
if let ExprKind::Lit(_) = bound_expr.kind
128128
&& let local_hid = path_to_local(arg)?
129129
&& let Node::Param(Param { ty_span, span, .. }) = cx.tcx.parent_hir_node(local_hid)
130130
// `ty_span` and `span` are the same for inferred type, thus a type suggestion must be given
131131
&& ty_span == span
132132
{
133-
let ty_str = match lit.node {
134-
Char(_) => "char",
135-
Byte(_) => "u8",
136-
_ => return None,
137-
};
133+
let arg_type = cx.typeck_results().expr_ty(arg);
134+
let ty_str = arg_type.to_string();
138135
return Some((*ty_span, ty_str));
139136
}
140137
None
@@ -145,7 +142,7 @@ fn check_is_ascii(
145142
span: Span,
146143
recv: &Expr<'_>,
147144
range: &CharRange,
148-
ty_sugg: Option<(Span, &'_ str)>,
145+
ty_sugg: Option<(Span, String)>,
149146
) {
150147
let sugg = match range {
151148
CharRange::UpperChar => "is_ascii_uppercase",

tests/ui/manual_is_ascii_check.fixed

+5
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,8 @@ fn generics() {
8282
take_while(|c: u8| c.is_ascii_uppercase());
8383
take_while(|c: char| c.is_ascii_uppercase());
8484
}
85+
86+
fn adds_type_reference() {
87+
let digits: Vec<&char> = ['1', 'A'].iter().take_while(|c: &&char| c.is_ascii_digit()).collect();
88+
let digits: Vec<&mut char> = ['1', 'A'].iter_mut().take_while(|c: &&mut char| c.is_ascii_digit()).collect();
89+
}

tests/ui/manual_is_ascii_check.rs

+5
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,8 @@ fn generics() {
8282
take_while(|c| (b'A'..=b'Z').contains(&c));
8383
take_while(|c: char| ('A'..='Z').contains(&c));
8484
}
85+
86+
fn adds_type_reference() {
87+
let digits: Vec<&char> = ['1', 'A'].iter().take_while(|c| ('0'..='9').contains(c)).collect();
88+
let digits: Vec<&mut char> = ['1', 'A'].iter_mut().take_while(|c| ('0'..='9').contains(c)).collect();
89+
}

tests/ui/manual_is_ascii_check.stderr

+23-1
Original file line numberDiff line numberDiff line change
@@ -173,5 +173,27 @@ error: manual check for common ascii range
173173
LL | take_while(|c: char| ('A'..='Z').contains(&c));
174174
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `c.is_ascii_uppercase()`
175175

176-
error: aborting due to 27 previous errors
176+
error: manual check for common ascii range
177+
--> tests/ui/manual_is_ascii_check.rs:87:63
178+
|
179+
LL | let digits: Vec<&char> = ['1', 'A'].iter().take_while(|c| ('0'..='9').contains(c)).collect();
180+
| ^^^^^^^^^^^^^^^^^^^^^^^
181+
|
182+
help: try
183+
|
184+
LL | let digits: Vec<&char> = ['1', 'A'].iter().take_while(|c: &&char| c.is_ascii_digit()).collect();
185+
| ~~~~~~~~~ ~~~~~~~~~~~~~~~~~~
186+
187+
error: manual check for common ascii range
188+
--> tests/ui/manual_is_ascii_check.rs:88:71
189+
|
190+
LL | let digits: Vec<&mut char> = ['1', 'A'].iter_mut().take_while(|c| ('0'..='9').contains(c)).collect();
191+
| ^^^^^^^^^^^^^^^^^^^^^^^
192+
|
193+
help: try
194+
|
195+
LL | let digits: Vec<&mut char> = ['1', 'A'].iter_mut().take_while(|c: &&mut char| c.is_ascii_digit()).collect();
196+
| ~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~
197+
198+
error: aborting due to 29 previous errors
177199

0 commit comments

Comments
 (0)