Avoid `let def_id.clone()` to translate `&LocalDefId` into `LocalDefId`.
Before this CL, extracting toposort dependencies looked like this:
```
let deps = bindings.iter().flat_map(|(def_id, snippet)| {
let def_id = def_id.clone();
snippet.cc.prereqs.defs.iter().copied().map(move |predecessor| {
toposort::Dependency { predecessor, successor: def_id }
})
});
```
Above the `let def_id = def_id.clone` changes the type of `def_id`
from `&LocalDefId` to `LocalDefId`, but in a rather roundabout way.
After this CL, we get `LocalDefId` by value in a more direct way
(note the extra `&` before the lambda's parameter):
```
let deps = bindings.iter().flat_map(|(&successor, snippet)| {
snippet.cc.prereqs.defs.iter().copied().map(move |predecessor| {
toposort::Dependency { predecessor, successor }
})
});
```
(The CL also makes some other minor changes, including making the code
layout more compact while still keeping `rustfmt` happy.)
PiperOrigin-RevId: 495595924
diff --git a/cc_bindings_from_rs/bindings.rs b/cc_bindings_from_rs/bindings.rs
index 14c9a62..12fc663 100644
--- a/cc_bindings_from_rs/bindings.rs
+++ b/cc_bindings_from_rs/bindings.rs
@@ -973,20 +973,16 @@
// Find the order of `bindings` that 1) meets the requirements of
// `CcPrerequisites::defs` and 2) makes a best effort attempt to keep the
// `bindings` in the same order as the source order of the Rust APIs.
- let toposort::TopoSortResult { ordered, failed } =
- {
- let nodes = bindings.keys().copied();
- let deps =
- bindings.iter().flat_map(|(def_id, snippet)| {
- let def_id = def_id.clone();
- snippet.cc.prereqs.defs.iter().copied().map(move |predecessor| {
- toposort::Dependency { predecessor, successor: def_id }
- })
- });
- let preferred_order =
- |id1: &LocalDefId, id2: &LocalDefId| tcx.def_span(*id1).cmp(&tcx.def_span(*id2));
- toposort::toposort(nodes, deps, preferred_order)
- };
+ let toposort::TopoSortResult { ordered, failed } = {
+ let nodes = bindings.keys().copied();
+ let deps = bindings.iter().flat_map(|(&successor, snippet)| {
+ let predecessors = snippet.cc.prereqs.defs.iter().copied();
+ predecessors.map(move |predecessor| toposort::Dependency { predecessor, successor })
+ });
+ let preferred_order =
+ |id1: &LocalDefId, id2: &LocalDefId| tcx.def_span(*id1).cmp(&tcx.def_span(*id2));
+ toposort::toposort(nodes, deps, preferred_order)
+ };
// Neighboring `ordered` items that belong to the same namespace should be put
// under a single `namespace foo::bar::baz { #items }`. We don't just translate