iter_kv_map: handle identity map for map and flat_map (#16743)

fixes: rust-lang/rust-clippy#16742

properly select post operation for identity map according to map method
kind

changelog: [`iter_kv_map`]: handle identity map for `map` and `flat_map`
This commit is contained in:
dswij
2026-03-24 22:06:09 +00:00
committed by GitHub
4 changed files with 50 additions and 2 deletions
+7 -1
View File
@@ -48,14 +48,20 @@ pub(super) fn check<'tcx>(
if let ExprKind::Path(rustc_hir::QPath::Resolved(_, path)) = body_expr.kind
&& let [local_ident] = path.segments
&& local_ident.ident.name == bound_ident.name
&& [sym::map, sym::flat_map].contains(&method_name)
{
let identity_map_equivalent = match method_name {
sym::map => "",
sym::flat_map => ".flatten()",
_ => unreachable!(),
};
span_lint_and_sugg(
cx,
ITER_KV_MAP,
expr.span,
format!("iterating on a map's {replacement_kind}s"),
"try",
format!("{recv_snippet}.{into_prefix}{replacement_kind}s()"),
format!("{recv_snippet}.{into_prefix}{replacement_kind}s(){identity_map_equivalent}"),
applicability,
);
} else {
+12
View File
@@ -231,3 +231,15 @@ fn issue16515() {
hash_map.into_values().filter_map(|v| (v > 0).then_some(1));
//~^ iter_kv_map
}
fn issue16742() {
let map: HashMap<u32, Vec<u32>> = HashMap::new();
map.values().flat_map(|v| v.iter().map(|i| *i + 1));
//~^ iter_kv_map
map.values().flatten();
//~^ iter_kv_map
let map: HashMap<u32, Vec<u32>> = HashMap::new();
map.into_values().flatten();
//~^ iter_kv_map
}
+12
View File
@@ -235,3 +235,15 @@ fn issue16515() {
hash_map.into_iter().filter_map(|(_, v)| (v > 0).then_some(1));
//~^ iter_kv_map
}
fn issue16742() {
let map: HashMap<u32, Vec<u32>> = HashMap::new();
map.iter().flat_map(|(_, v)| v.iter().map(|i| *i + 1));
//~^ iter_kv_map
map.iter().flat_map(|(_, v)| v);
//~^ iter_kv_map
let map: HashMap<u32, Vec<u32>> = HashMap::new();
map.into_iter().flat_map(|(_, v)| v);
//~^ iter_kv_map
}
+19 -1
View File
@@ -323,5 +323,23 @@ error: iterating on a map's values
LL | hash_map.into_iter().filter_map(|(_, v)| (v > 0).then_some(1));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `hash_map.into_values().filter_map(|v| (v > 0).then_some(1))`
error: aborting due to 48 previous errors
error: iterating on a map's values
--> tests/ui/iter_kv_map.rs:241:5
|
LL | map.iter().flat_map(|(_, v)| v.iter().map(|i| *i + 1));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `map.values().flat_map(|v| v.iter().map(|i| *i + 1))`
error: iterating on a map's values
--> tests/ui/iter_kv_map.rs:243:5
|
LL | map.iter().flat_map(|(_, v)| v);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `map.values().flatten()`
error: iterating on a map's values
--> tests/ui/iter_kv_map.rs:247:5
|
LL | map.into_iter().flat_map(|(_, v)| v);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `map.into_values().flatten()`
error: aborting due to 51 previous errors