From cf66eccb753f3cf28928de7536cd9c51b48166ab Mon Sep 17 00:00:00 2001
From: Olexorus <olexorus@gmail.com>
Date: Tue, 15 Mar 2022 16:34:56 +0100
Subject: [PATCH 1/2] Use Rust 2021 postfix .into_iter()

---
 common/systems/src/phys.rs |  6 +++---
 world/src/sim/mod.rs       | 27 +++++++++++++++------------
 2 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/common/systems/src/phys.rs b/common/systems/src/phys.rs
index e45fe28a60..4ad86edfed 100644
--- a/common/systems/src/phys.rs
+++ b/common/systems/src/phys.rs
@@ -1972,13 +1972,13 @@ fn closest_points(n: LineSegment2<f32>, m: LineSegment2<f32>) -> (Vec2<f32>, Vec
 
     // Check to see whether the lines are parallel
     if !t.is_finite() || !u.is_finite() {
-        // TODO: can use postfix .into_iter() when switching to Rust 2021
-        IntoIterator::into_iter([
+        [
             (n.projected_point(m.start), m.start),
             (n.projected_point(m.end), m.end),
             (n.start, m.projected_point(n.start)),
             (n.end, m.projected_point(n.end)),
-        ])
+        ]
+        .into_iter()
         .min_by_key(|(a, b)| ordered_float::OrderedFloat(a.distance_squared(*b)))
         .expect("Lines had non-finite elements")
     } else {
diff --git a/world/src/sim/mod.rs b/world/src/sim/mod.rs
index e050f0d048..bf9d7becb6 100644
--- a/world/src/sim/mod.rs
+++ b/world/src/sim/mod.rs
@@ -2130,18 +2130,21 @@ impl WorldSim {
     /// them spawning).
     pub fn get_near_trees(&self, wpos: Vec2<i32>) -> impl Iterator<Item = TreeAttr> + '_ {
         // Deterministic based on wpos
-        // TODO: can use postfix .into_iter() when switching to Rust 2021
-        let normal_trees = IntoIterator::into_iter(self.gen_ctx.structure_gen.get(wpos))
-            .filter_map(move |(wpos, seed)| {
-                let lottery = self.make_forest_lottery(wpos);
-                Some(TreeAttr {
-                    pos: wpos,
-                    seed,
-                    scale: 1.0,
-                    forest_kind: *lottery.choose_seeded(seed).as_ref()?,
-                    inhabited: false,
-                })
-            });
+        let normal_trees =
+            self.gen_ctx
+                .structure_gen
+                .get(wpos)
+                .into_iter()
+                .filter_map(move |(wpos, seed)| {
+                    let lottery = self.make_forest_lottery(wpos);
+                    Some(TreeAttr {
+                        pos: wpos,
+                        seed,
+                        scale: 1.0,
+                        forest_kind: *lottery.choose_seeded(seed).as_ref()?,
+                        inhabited: false,
+                    })
+                });
 
         // // For testing
         // let giant_trees =

From 2212c3d70cb295df9201729452d7bea8dd1dd393 Mon Sep 17 00:00:00 2001
From: Olexorus <olexorus@gmail.com>
Date: Tue, 15 Mar 2022 16:49:03 +0100
Subject: [PATCH 2/2] Remove borrow-checker appeasing code that's no longer
 necessary in Rust 2021

---
 voxygen/src/render/renderer.rs         | 16 ++++++++++------
 voxygen/src/ui/graphic/mod.rs          |  8 ++------
 voxygen/src/ui/widgets/item_tooltip.rs |  6 +++---
 3 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/voxygen/src/render/renderer.rs b/voxygen/src/render/renderer.rs
index 1ce1db0668..4f8a17baf2 100644
--- a/voxygen/src/render/renderer.rs
+++ b/voxygen/src/render/renderer.rs
@@ -647,19 +647,23 @@ impl Renderer {
             );
             self.views = views;
 
-            // appease borrow check (TODO: remove after Rust 2021)
-            let device = &self.device;
-            let queue = &self.queue;
-            let views = &self.views;
             let bloom_params = self
                 .views
                 .bloom_tgts
                 .as_ref()
                 .map(|tgts| locals::BloomParams {
                     locals: bloom_sizes.map(|size| {
-                        Self::create_consts_inner(device, queue, &[bloom::Locals::new(size)])
+                        Self::create_consts_inner(&self.device, &self.queue, &[bloom::Locals::new(
+                            size,
+                        )])
                     }),
-                    src_views: [&views.tgt_color_pp, &tgts[1], &tgts[2], &tgts[3], &tgts[4]],
+                    src_views: [
+                        &self.views.tgt_color_pp,
+                        &tgts[1],
+                        &tgts[2],
+                        &tgts[3],
+                        &tgts[4],
+                    ],
                     final_tgt_view: &tgts[0],
                 });
 
diff --git a/voxygen/src/ui/graphic/mod.rs b/voxygen/src/ui/graphic/mod.rs
index b92cd96352..1ece067e4f 100644
--- a/voxygen/src/ui/graphic/mod.rs
+++ b/voxygen/src/ui/graphic/mod.rs
@@ -181,19 +181,15 @@ impl GraphicCache {
             return;
         }
 
-        // TODO: remove with Rust 2021 edition
-        let cache_map = &mut self.cache_map;
-        let textures = &mut self.textures;
-
         // Remove from caches
         // Maybe make this more efficient if replace graphic is used more often
-        cache_map.retain(|&(key_id, _key_dims), details| {
+        self.cache_map.retain(|&(key_id, _key_dims), details| {
             // If the entry does not reference id, or it does but we can successfully
             // invalidate, retain the entry; otherwise, discard this entry completely.
             key_id != id
                 || details
                     .invalidate()
-                    .map_err(|index| textures.remove(index))
+                    .map_err(|index| self.textures.remove(index))
                     .is_ok()
         });
     }
diff --git a/voxygen/src/ui/widgets/item_tooltip.rs b/voxygen/src/ui/widgets/item_tooltip.rs
index bde83ebd0f..9d76661775 100644
--- a/voxygen/src/ui/widgets/item_tooltip.rs
+++ b/voxygen/src/ui/widgets/item_tooltip.rs
@@ -125,13 +125,13 @@ impl ItemTooltipManager {
     {
         let mp_h = MOUSE_PAD_Y / self.logical_scale_factor;
 
-        let tooltip_ids = &mut self.tooltip_ids; // TODO: remove with Rust 2021
-        let mut id_walker = tooltip_ids.walk();
+        let mut id_walker = self.tooltip_ids.walk();
 
         let tooltip = |transparency, mouse_pos: [f64; 2], ui: &mut UiCell| {
             let mut prev_id = None;
             for item in items {
-                let tooltip_id = id_walker.next(tooltip_ids, &mut ui.widget_id_generator());
+                let tooltip_id =
+                    id_walker.next(&mut self.tooltip_ids, &mut ui.widget_id_generator());
                 // Fill in text and the potential image beforehand to get an accurate size for
                 // spacing
                 let tooltip = tooltip