zed: Reduce clones (#30550)

tidely created

A collection of small patches that reduce clones. Mostly by using owned
iterators where possible.

Release Notes:

- N/A

Change summary

crates/agent/src/thread.rs                                      |  2 
crates/agent/src/thread_store.rs                                | 20 +-
crates/assistant_context_editor/src/slash_command.rs            |  4 
crates/git_ui/src/branch_picker.rs                              |  3 
crates/git_ui/src/git_panel.rs                                  |  4 
crates/inline_completion_button/src/inline_completion_button.rs |  2 
crates/language_tools/src/lsp_log.rs                            |  6 
crates/project/src/git_store.rs                                 |  4 
8 files changed, 22 insertions(+), 23 deletions(-)

Detailed changes

crates/agent/src/thread.rs 🔗

@@ -2241,7 +2241,7 @@ impl Thread {
             .read(cx)
             .enabled_tools(cx)
             .iter()
-            .map(|tool| tool.name().to_string())
+            .map(|tool| tool.name())
             .collect();
 
         self.message_feedback.insert(message_id, feedback);

crates/agent/src/thread_store.rs 🔗

@@ -486,8 +486,8 @@ impl ThreadStore {
                 ToolSource::Native,
                 &profile
                     .tools
-                    .iter()
-                    .filter_map(|(tool, enabled)| enabled.then(|| tool.clone()))
+                    .into_iter()
+                    .filter_map(|(tool, enabled)| enabled.then(|| tool))
                     .collect::<Vec<_>>(),
                 cx,
             );
@@ -511,32 +511,32 @@ impl ThreadStore {
                 });
             }
             // Enable all the tools from all context servers, but disable the ones that are explicitly disabled
-            for (context_server_id, preset) in &profile.context_servers {
+            for (context_server_id, preset) in profile.context_servers {
                 self.tools.update(cx, |tools, cx| {
                     tools.disable(
                         ToolSource::ContextServer {
-                            id: context_server_id.clone().into(),
+                            id: context_server_id.into(),
                         },
                         &preset
                             .tools
-                            .iter()
-                            .filter_map(|(tool, enabled)| (!enabled).then(|| tool.clone()))
+                            .into_iter()
+                            .filter_map(|(tool, enabled)| (!enabled).then(|| tool))
                             .collect::<Vec<_>>(),
                         cx,
                     )
                 })
             }
         } else {
-            for (context_server_id, preset) in &profile.context_servers {
+            for (context_server_id, preset) in profile.context_servers {
                 self.tools.update(cx, |tools, cx| {
                     tools.enable(
                         ToolSource::ContextServer {
-                            id: context_server_id.clone().into(),
+                            id: context_server_id.into(),
                         },
                         &preset
                             .tools
-                            .iter()
-                            .filter_map(|(tool, enabled)| enabled.then(|| tool.clone()))
+                            .into_iter()
+                            .filter_map(|(tool, enabled)| enabled.then(|| tool))
                             .collect::<Vec<_>>(),
                         cx,
                     )

crates/assistant_context_editor/src/slash_command.rs 🔗

@@ -278,8 +278,8 @@ impl CompletionProvider for SlashCommandCompletionProvider {
                         buffer.anchor_after(Point::new(position.row, first_arg_start.start as u32));
                     let arguments = call
                         .arguments
-                        .iter()
-                        .filter_map(|argument| Some(line.get(argument.clone())?.to_string()))
+                        .into_iter()
+                        .filter_map(|argument| Some(line.get(argument)?.to_string()))
                         .collect::<Vec<_>>();
                     let argument_range = first_arg_start..buffer_position;
                     (

crates/git_ui/src/branch_picker.rs 🔗

@@ -306,8 +306,7 @@ impl PickerDelegate for BranchListDelegate {
                     cx.background_executor().clone(),
                 )
                 .await
-                .iter()
-                .cloned()
+                .into_iter()
                 .map(|candidate| BranchEntry {
                     branch: all_branches[candidate.candidate_id].clone(),
                     positions: candidate.positions,

crates/git_ui/src/git_panel.rs 🔗

@@ -1051,8 +1051,8 @@ impl GitPanel {
                     repo.checkout_files(
                         "HEAD",
                         entries
-                            .iter()
-                            .map(|entries| entries.repo_path.clone())
+                            .into_iter()
+                            .map(|entries| entries.repo_path)
                             .collect(),
                         cx,
                     )

crates/language_tools/src/lsp_log.rs 🔗

@@ -1238,12 +1238,12 @@ impl Render for LspLogToolbarItemView {
             }
         });
         let available_language_servers: Vec<_> = menu_rows
-            .iter()
+            .into_iter()
             .map(|row| {
                 (
                     row.server_id,
-                    row.server_name.clone(),
-                    row.worktree_root_name.clone(),
+                    row.server_name,
+                    row.worktree_root_name,
                     row.selected_entry,
                 )
             })

crates/project/src/git_store.rs 🔗

@@ -4278,9 +4278,9 @@ impl Repository {
                             }));
                         }
                         let mut cursor = prev_statuses.cursor::<PathProgress>(&());
-                        for path in changed_paths.iter() {
+                        for path in changed_paths.into_iter() {
                             if cursor.seek_forward(&PathTarget::Path(&path), Bias::Left, &()) {
-                                changed_path_statuses.push(Edit::Remove(PathKey(path.0.clone())));
+                                changed_path_statuses.push(Edit::Remove(PathKey(path.0)));
                             }
                         }
                         changed_path_statuses