diff --git a/clippy_lints/src/methods/iter_kv_map.rs b/clippy_lints/src/methods/iter_kv_map.rs index 79034fa23300..283b9b5fc5b4 100644 --- a/clippy_lints/src/methods/iter_kv_map.rs +++ b/clippy_lints/src/methods/iter_kv_map.rs @@ -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 { diff --git a/tests/ui/iter_kv_map.fixed b/tests/ui/iter_kv_map.fixed index e3ab5fd1e9ef..e99ea43efc8e 100644 --- a/tests/ui/iter_kv_map.fixed +++ b/tests/ui/iter_kv_map.fixed @@ -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> = 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> = HashMap::new(); + map.into_values().flatten(); + //~^ iter_kv_map +} diff --git a/tests/ui/iter_kv_map.rs b/tests/ui/iter_kv_map.rs index 903813b1bf62..7eca0faf6329 100644 --- a/tests/ui/iter_kv_map.rs +++ b/tests/ui/iter_kv_map.rs @@ -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> = 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> = HashMap::new(); + map.into_iter().flat_map(|(_, v)| v); + //~^ iter_kv_map +} diff --git a/tests/ui/iter_kv_map.stderr b/tests/ui/iter_kv_map.stderr index cdfd05fdd09e..25c4ad283be1 100644 --- a/tests/ui/iter_kv_map.stderr +++ b/tests/ui/iter_kv_map.stderr @@ -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