Merge pull request #1492 from zed-industries/add-clippy

Mikayla Maki created

Add clippy! :D

Change summary

.cargo/config.toml                                  |   7 
.github/workflows/ci.yml                            |  11 
assets/settings/default.json                        |  19 +
crates/activity_indicator/src/activity_indicator.rs |   8 
crates/auto_update/src/auto_update.rs               |   5 
crates/chat_panel/src/chat_panel.rs                 |   4 
crates/client/src/channel.rs                        |  14 
crates/client/src/client.rs                         |  30 +
crates/client/src/http.rs                           |   4 
crates/client/src/test.rs                           |   9 
crates/client/src/user.rs                           |   2 
crates/clock/src/clock.rs                           |   6 
crates/collab/src/api.rs                            |   2 
crates/collab/src/auth.rs                           |   4 
crates/collab/src/db.rs                             |  33 -
crates/collab/src/integration_tests.rs              | 194 +++++-----
crates/collab/src/rpc.rs                            |   6 
crates/collab/src/rpc/store.rs                      |  22 
crates/command_palette/src/command_palette.rs       |   4 
crates/contacts_panel/src/contact_finder.rs         |   4 
crates/contacts_panel/src/contacts_panel.rs         |  39 +-
crates/diagnostics/src/diagnostics.rs               |  22 
crates/editor/src/display_map.rs                    |  37 -
crates/editor/src/display_map/block_map.rs          |  45 +-
crates/editor/src/display_map/fold_map.rs           |  49 +-
crates/editor/src/display_map/tab_map.rs            |  10 
crates/editor/src/display_map/wrap_map.rs           |  14 
crates/editor/src/editor.rs                         | 253 +++++++-------
crates/editor/src/element.rs                        |  33 +
crates/editor/src/hover_popover.rs                  |   4 
crates/editor/src/items.rs                          |  37 +-
crates/editor/src/link_go_to_definition.rs          |  12 
crates/editor/src/multi_buffer.rs                   | 126 +++---
crates/editor/src/multi_buffer/anchor.rs            |   8 
crates/editor/src/selections_collection.rs          |  17 
crates/file_finder/src/file_finder.rs               |   4 
crates/fsevent/examples/events.rs                   |   2 
crates/fsevent/src/fsevent.rs                       |   8 
crates/fuzzy/src/char_bag.rs                        |  12 
crates/fuzzy/src/fuzzy.rs                           |  34 +
crates/gpui/build.rs                                |   2 
crates/gpui/examples/text.rs                        |  10 
crates/gpui/src/app.rs                              |  64 +-
crates/gpui/src/elements.rs                         |   6 
crates/gpui/src/elements/empty.rs                   |   3 
crates/gpui/src/elements/expanded.rs                |   4 
crates/gpui/src/elements/image.rs                   |   4 
crates/gpui/src/elements/list.rs                    |  23 
crates/gpui/src/elements/mouse_event_handler.rs     |   2 
crates/gpui/src/elements/overlay.rs                 |   2 
crates/gpui/src/elements/stack.rs                   |   5 
crates/gpui/src/elements/text.rs                    |   2 
crates/gpui/src/elements/uniform_list.rs            |  23 
crates/gpui/src/executor.rs                         |   8 
crates/gpui/src/font_cache.rs                       |   6 
crates/gpui/src/fonts.rs                            |   3 
crates/gpui/src/geometry.rs                         |  11 
crates/gpui/src/keymap.rs                           |  27 
crates/gpui/src/platform.rs                         |   2 
crates/gpui/src/platform/mac/event.rs               |   2 
crates/gpui/src/platform/mac/fonts.rs               |  14 
crates/gpui/src/platform/mac/platform.rs            |   8 
crates/gpui/src/platform/mac/renderer.rs            |  45 +-
crates/gpui/src/platform/mac/window.rs              |  41 +-
crates/gpui/src/platform/test.rs                    |   2 
crates/gpui/src/presenter.rs                        |  32 -
crates/gpui/src/scene/mouse_region.rs               |   2 
crates/gpui/src/text_layout.rs                      |  28 +
crates/gpui_macros/src/gpui_macros.rs               |   2 
crates/language/src/buffer.rs                       | 111 +++---
crates/language/src/diagnostic_set.rs               |  27 -
crates/language/src/highlight_map.rs                |   5 
crates/language/src/language.rs                     |   7 
crates/language/src/proto.rs                        |  12 
crates/language/src/tests.rs                        |  76 +--
crates/lsp/src/lsp.rs                               |  16 
crates/outline/src/outline.rs                       |   8 
crates/plugin/src/lib.rs                            |   2 
crates/plugin_runtime/build.rs                      |   7 
crates/plugin_runtime/src/lib.rs                    |   4 
crates/plugin_runtime/src/plugin.rs                 |  16 
crates/project/src/fs.rs                            |   2 
crates/project/src/lsp_command.rs                   |  10 
crates/project/src/project.rs                       |  92 ++--
crates/project/src/project_tests.rs                 |  32 
crates/project/src/search.rs                        |   2 
crates/project/src/worktree.rs                      |  62 +-
crates/project_panel/src/project_panel.rs           |  59 +-
crates/rpc/src/conn.rs                              |   7 
crates/rpc/src/peer.rs                              |   3 
crates/rpc/src/proto.rs                             |  15 
crates/search/src/buffer_search.rs                  |  27 
crates/search/src/project_search.rs                 |  14 
crates/search/src/search.rs                         |   8 
crates/settings/src/keymap_file.rs                  |  52 +-
crates/settings/src/settings.rs                     |  13 
crates/snippet/src/snippet.rs                       |   8 
crates/sum_tree/src/cursor.rs                       |   8 
crates/sum_tree/src/sum_tree.rs                     |  10 
crates/sum_tree/src/tree_map.rs                     |   4 
crates/terminal/src/connected_el.rs                 |  38 +-
crates/terminal/src/connected_view.rs               |   6 
crates/terminal/src/mappings/colors.rs              |   2 
crates/terminal/src/mappings/keys.rs                |   4 
crates/terminal/src/modal.rs                        |   4 
crates/terminal/src/terminal.rs                     |  47 +-
crates/terminal/src/terminal_view.rs                |   6 
crates/text/src/anchor.rs                           |  20 
crates/text/src/locator.rs                          |   4 
crates/text/src/operation_queue.rs                  |  10 
crates/text/src/patch.rs                            |   4 
crates/text/src/point.rs                            |   2 
crates/text/src/rope.rs                             |  10 
crates/text/src/tests.rs                            |  12 
crates/text/src/text.rs                             |  51 +-
crates/theme_selector/src/theme_selector.rs         |   2 
crates/util/src/lib.rs                              |   4 
crates/util/src/test/marked_text.rs                 |  10 
crates/vim/src/motion.rs                            |  11 
crates/vim/src/normal.rs                            |   2 
crates/vim/src/normal/change.rs                     |   4 
crates/vim/src/normal/delete.rs                     |   2 
crates/vim/src/state.rs                             |   7 
crates/vim/src/vim_test_context.rs                  |   2 
crates/vim/src/visual.rs                            |   8 
crates/workspace/src/pane.rs                        |  32 -
crates/workspace/src/pane_group.rs                  |   2 
crates/workspace/src/sidebar.rs                     |  11 
crates/workspace/src/status_bar.rs                  |   6 
crates/workspace/src/toolbar.rs                     |  13 
crates/workspace/src/waiting_room.rs                |   2 
crates/workspace/src/workspace.rs                   |  71 ++--
crates/zed/src/feedback.rs                          |   3 
crates/zed/src/languages/c.rs                       |   2 
crates/zed/src/languages/go.rs                      |   6 
crates/zed/src/languages/python.rs                  |   2 
crates/zed/src/languages/typescript.rs              |   2 
crates/zed/src/main.rs                              |  18 
crates/zed/src/settings_file.rs                     |   8 
crates/zed/src/zed.rs                               |  34 -
plugins/json_language/src/lib.rs                    |  23 
styles/package-lock.json                            |   1 
142 files changed, 1,374 insertions(+), 1,390 deletions(-)

Detailed changes

.cargo/config.toml ๐Ÿ”—

@@ -0,0 +1,7 @@
+[target.'cfg(all())']
+rustflags = [
+    "-Dwarnings",
+    "-Aclippy::reversed_empty_ranges",
+    "-Aclippy::missing_safety_doc",
+    "-Aclippy::let_unit_value",
+]

.github/workflows/ci.yml ๐Ÿ”—

@@ -28,6 +28,7 @@ jobs:
         run: |
           rustup set profile minimal
           rustup update stable
+          rustup component add clippy
           rustup target add wasm32-wasi
 
       - name: Install Node
@@ -39,7 +40,15 @@ jobs:
         uses: actions/checkout@v2
         with:
           clean: false
-
+          
+      - name: Run clippy
+        run: >
+            cargo clippy --workspace -- 
+            -Dwarnings 
+            -Aclippy::reversed_empty_ranges 
+            -Aclippy::missing_safety_doc 
+            -Aclippy::let_unit_value
+            
       - name: Run tests
         run: cargo test --workspace --no-fail-fast
     

assets/settings/default.json ๐Ÿ”—

@@ -145,5 +145,22 @@
             "tab_size": 2
         }
     },
-    "lsp": {}
+    //LSP Specific settings.
+    "lsp": {
+        //Specify the LSP name as a key here.
+        //As of 8/10/22, supported LSPs are:
+        //pyright
+        //gopls
+        //rust-analyzer
+        //typescript-language-server
+        //vscode-json-languageserver
+        "rust_analyzer": {
+            //These initialization options are merged into Zed's defaults
+            "initialization_options": {
+                "checkOnSave": {
+                    "command": "clippy"
+                }
+            }
+        }
+    }
 }

crates/activity_indicator/src/activity_indicator.rs ๐Ÿ”—

@@ -15,9 +15,9 @@ use workspace::{ItemHandle, StatusItemView, Workspace};
 
 actions!(lsp_status, [ShowErrorMessage]);
 
-const DOWNLOAD_ICON: &'static str = "icons/download_12.svg";
-const WARNING_ICON: &'static str = "icons/triangle_exclamation_12.svg";
-const DONE_ICON: &'static str = "icons/circle_check_12.svg";
+const DOWNLOAD_ICON: &str = "icons/download_12.svg";
+const WARNING_ICON: &str = "icons/triangle_exclamation_12.svg";
+const DONE_ICON: &str = "icons/circle_check_12.svg";
 
 pub enum Event {
     ShowError { lsp_name: Arc<str>, error: String },
@@ -76,7 +76,7 @@ impl ActivityIndicator {
         cx.subscribe(&this, move |workspace, _, event, cx| match event {
             Event::ShowError { lsp_name, error } => {
                 if let Some(buffer) = project
-                    .update(cx, |project, cx| project.create_buffer(&error, None, cx))
+                    .update(cx, |project, cx| project.create_buffer(error, None, cx))
                     .log_err()
                 {
                     buffer.update(cx, |buffer, cx| {

crates/auto_update/src/auto_update.rs ๐Ÿ”—

@@ -13,8 +13,7 @@ use std::{env, ffi::OsString, path::PathBuf, sync::Arc, time::Duration};
 use update_notification::UpdateNotification;
 use workspace::Workspace;
 
-const SHOULD_SHOW_UPDATE_NOTIFICATION_KEY: &'static str =
-    "auto-updater-should-show-updated-notification";
+const SHOULD_SHOW_UPDATE_NOTIFICATION_KEY: &str = "auto-updater-should-show-updated-notification";
 const POLL_INTERVAL: Duration = Duration::from_secs(60 * 60);
 
 lazy_static! {
@@ -61,7 +60,7 @@ pub fn init(
     server_url: String,
     cx: &mut MutableAppContext,
 ) {
-    if let Some(version) = ZED_APP_VERSION.clone().or(cx.platform().app_version().ok()) {
+    if let Some(version) = (*ZED_APP_VERSION).or_else(|| cx.platform().app_version().ok()) {
         let auto_updater = cx.add_model(|cx| {
             let updater = AutoUpdater::new(version, db.clone(), http_client, server_url.clone());
             updater.start_polling(cx).detach();

crates/chat_panel/src/chat_panel.rs ๐Ÿ”—

@@ -70,7 +70,7 @@ impl ChatPanel {
                 let theme = &cx.global::<Settings>().theme.chat_panel.channel_select;
                 SelectStyle {
                     header: theme.header.container,
-                    menu: theme.menu.clone(),
+                    menu: theme.menu,
                 }
             })
         });
@@ -91,7 +91,7 @@ impl ChatPanel {
         let _observe_status = cx.spawn_weak(|this, mut cx| {
             let mut status = rpc.status();
             async move {
-                while let Some(_) = status.recv().await {
+                while (status.recv().await).is_some() {
                     if let Some(this) = this.upgrade(&cx) {
                         this.update(&mut cx, |_, cx| cx.notify());
                     } else {

crates/client/src/channel.rs ๐Ÿ”—

@@ -145,7 +145,7 @@ impl ChannelList {
     }
 
     pub fn available_channels(&self) -> Option<&[ChannelDetails]> {
-        self.available_channels.as_ref().map(Vec::as_slice)
+        self.available_channels.as_deref()
     }
 
     pub fn get_channel(
@@ -601,8 +601,8 @@ mod tests {
 
         let user_id = 5;
         let http_client = FakeHttpClient::with_404_response();
-        let mut client = Client::new(http_client.clone());
-        let server = FakeServer::for_client(user_id, &mut client, &cx).await;
+        let client = Client::new(http_client.clone());
+        let server = FakeServer::for_client(user_id, &client, cx).await;
 
         Channel::init(&client);
         let user_store = cx.add_model(|cx| UserStore::new(client.clone(), http_client, cx));
@@ -623,7 +623,7 @@ mod tests {
                 },
             )
             .await;
-        channel_list.next_notification(&cx).await;
+        channel_list.next_notification(cx).await;
         channel_list.read_with(cx, |list, _| {
             assert_eq!(
                 list.available_channels().unwrap(),
@@ -701,7 +701,7 @@ mod tests {
             .await;
 
         assert_eq!(
-            channel.next_event(&cx).await,
+            channel.next_event(cx).await,
             ChannelEvent::MessagesUpdated {
                 old_range: 0..0,
                 new_count: 2,
@@ -749,7 +749,7 @@ mod tests {
             .await;
 
         assert_eq!(
-            channel.next_event(&cx).await,
+            channel.next_event(cx).await,
             ChannelEvent::MessagesUpdated {
                 old_range: 2..2,
                 new_count: 1,
@@ -798,7 +798,7 @@ mod tests {
             .await;
 
         assert_eq!(
-            channel.next_event(&cx).await,
+            channel.next_event(cx).await,
             ChannelEvent::MessagesUpdated {
                 old_range: 0..0,
                 new_count: 2,

crates/client/src/client.rs ๐Ÿ”—

@@ -41,13 +41,13 @@ pub use user::*;
 
 lazy_static! {
     pub static ref ZED_SERVER_URL: String =
-        std::env::var("ZED_SERVER_URL").unwrap_or("https://zed.dev".to_string());
+        std::env::var("ZED_SERVER_URL").unwrap_or_else(|_| "https://zed.dev".to_string());
     pub static ref IMPERSONATE_LOGIN: Option<String> = std::env::var("ZED_IMPERSONATE")
         .ok()
         .and_then(|s| if s.is_empty() { None } else { Some(s) });
 }
 
-pub const ZED_SECRET_CLIENT_TOKEN: &'static str = "618033988749894";
+pub const ZED_SECRET_CLIENT_TOKEN: &str = "618033988749894";
 
 actions!(client, [Authenticate]);
 
@@ -65,10 +65,13 @@ pub struct Client {
     http: Arc<dyn HttpClient>,
     state: RwLock<ClientState>,
 
+    #[allow(clippy::type_complexity)]
     #[cfg(any(test, feature = "test-support"))]
     authenticate: RwLock<
         Option<Box<dyn 'static + Send + Sync + Fn(&AsyncAppContext) -> Task<Result<Credentials>>>>,
     >,
+
+    #[allow(clippy::type_complexity)]
     #[cfg(any(test, feature = "test-support"))]
     establish_connection: RwLock<
         Option<
@@ -149,6 +152,7 @@ struct ClientState {
     entities_by_type_and_remote_id: HashMap<(TypeId, u64), AnyWeakEntityHandle>,
     models_by_message_type: HashMap<TypeId, AnyWeakModelHandle>,
     entity_types_by_message_type: HashMap<TypeId, TypeId>,
+    #[allow(clippy::type_complexity)]
     message_handlers: HashMap<
         TypeId,
         Arc<
@@ -596,7 +600,7 @@ impl Client {
             let mut status_rx = self.status();
             let _ = status_rx.next().await;
             futures::select_biased! {
-                authenticate = self.authenticate(&cx).fuse() => {
+                authenticate = self.authenticate(cx).fuse() => {
                     match authenticate {
                         Ok(creds) => credentials = Some(creds),
                         Err(err) => {
@@ -819,7 +823,7 @@ impl Client {
                     .get("Location")
                     .ok_or_else(|| anyhow!("missing location header in /rpc response"))?
                     .to_str()
-                    .map_err(|error| EstablishConnectionError::other(error))?
+                    .map_err(EstablishConnectionError::other)?
                     .to_string();
             }
             // Until we switch the zed.dev domain to point to the new Next.js app, there
@@ -1051,7 +1055,7 @@ fn write_credentials_to_keychain(credentials: &Credentials, cx: &AsyncAppContext
     )
 }
 
-const WORKTREE_URL_PREFIX: &'static str = "zed://worktrees/";
+const WORKTREE_URL_PREFIX: &str = "zed://worktrees/";
 
 pub fn encode_worktree_url(id: u64, access_token: &str) -> String {
     format!("{}{}/{}", WORKTREE_URL_PREFIX, id, access_token)
@@ -1081,8 +1085,8 @@ mod tests {
         cx.foreground().forbid_parking();
 
         let user_id = 5;
-        let mut client = Client::new(FakeHttpClient::with_404_response());
-        let server = FakeServer::for_client(user_id, &mut client, &cx).await;
+        let client = Client::new(FakeHttpClient::with_404_response());
+        let server = FakeServer::for_client(user_id, &client, cx).await;
         let mut status = client.status();
         assert!(matches!(
             status.next().await,
@@ -1169,8 +1173,8 @@ mod tests {
         cx.foreground().forbid_parking();
 
         let user_id = 5;
-        let mut client = Client::new(FakeHttpClient::with_404_response());
-        let server = FakeServer::for_client(user_id, &mut client, &cx).await;
+        let client = Client::new(FakeHttpClient::with_404_response());
+        let server = FakeServer::for_client(user_id, &client, cx).await;
 
         let (done_tx1, mut done_rx1) = smol::channel::unbounded();
         let (done_tx2, mut done_rx2) = smol::channel::unbounded();
@@ -1215,8 +1219,8 @@ mod tests {
         cx.foreground().forbid_parking();
 
         let user_id = 5;
-        let mut client = Client::new(FakeHttpClient::with_404_response());
-        let server = FakeServer::for_client(user_id, &mut client, &cx).await;
+        let client = Client::new(FakeHttpClient::with_404_response());
+        let server = FakeServer::for_client(user_id, &client, cx).await;
 
         let model = cx.add_model(|_| Model::default());
         let (done_tx1, _done_rx1) = smol::channel::unbounded();
@@ -1243,8 +1247,8 @@ mod tests {
         cx.foreground().forbid_parking();
 
         let user_id = 5;
-        let mut client = Client::new(FakeHttpClient::with_404_response());
-        let server = FakeServer::for_client(user_id, &mut client, &cx).await;
+        let client = Client::new(FakeHttpClient::with_404_response());
+        let server = FakeServer::for_client(user_id, &client, cx).await;
 
         let model = cx.add_model(|_| Model::default());
         let (done_tx, mut done_rx) = smol::channel::unbounded();

crates/client/src/http.rs ๐Ÿ”—

@@ -16,7 +16,7 @@ pub type Request = isahc::Request<AsyncBody>;
 pub type Response = isahc::Response<AsyncBody>;
 
 pub trait HttpClient: Send + Sync {
-    fn send<'a>(&'a self, req: Request) -> BoxFuture<'a, Result<Response, Error>>;
+    fn send(&self, req: Request) -> BoxFuture<Result<Response, Error>>;
 
     fn get<'a>(
         &'a self,
@@ -45,7 +45,7 @@ pub fn client() -> Arc<dyn HttpClient> {
 }
 
 impl HttpClient for isahc::HttpClient {
-    fn send<'a>(&'a self, req: Request) -> BoxFuture<'a, Result<Response, Error>> {
+    fn send(&self, req: Request) -> BoxFuture<Result<Response, Error>> {
         Box::pin(async move { self.send_async(req).await })
     }
 }

crates/client/src/test.rs ๐Ÿ”—

@@ -56,7 +56,7 @@ impl FakeServer {
                 }
             })
             .override_establish_connection({
-                let peer = Arc::downgrade(&server.peer).clone();
+                let peer = Arc::downgrade(&server.peer);
                 let state = Arc::downgrade(&server.state);
                 move |credentials, cx| {
                     let peer = peer.clone();
@@ -123,6 +123,7 @@ impl FakeServer {
         self.peer.send(self.connection_id(), message).unwrap();
     }
 
+    #[allow(clippy::await_holding_lock)]
     pub async fn receive<M: proto::EnvelopedMessage>(&self) -> Result<TypedEnvelope<M>> {
         self.executor.start_waiting();
         let message = self
@@ -194,7 +195,7 @@ pub struct FakeHttpClient {
 }
 
 impl FakeHttpClient {
-    pub fn new<Fut, F>(handler: F) -> Arc<dyn HttpClient>
+    pub fn create<Fut, F>(handler: F) -> Arc<dyn HttpClient>
     where
         Fut: 'static + Send + Future<Output = Result<Response, http::Error>>,
         F: 'static + Send + Sync + Fn(Request) -> Fut,
@@ -205,7 +206,7 @@ impl FakeHttpClient {
     }
 
     pub fn with_404_response() -> Arc<dyn HttpClient> {
-        Self::new(|_| async move {
+        Self::create(|_| async move {
             Ok(isahc::Response::builder()
                 .status(404)
                 .body(Default::default())
@@ -221,7 +222,7 @@ impl fmt::Debug for FakeHttpClient {
 }
 
 impl HttpClient for FakeHttpClient {
-    fn send<'a>(&'a self, req: Request) -> BoxFuture<'a, Result<Response, crate::http::Error>> {
+    fn send(&self, req: Request) -> BoxFuture<Result<Response, crate::http::Error>> {
         let future = (self.handler)(req);
         Box::pin(async move { future.await.map(Into::into) })
     }

crates/client/src/user.rs ๐Ÿ”—

@@ -17,7 +17,7 @@ pub struct User {
 
 impl PartialOrd for User {
     fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
-        Some(self.cmp(&other))
+        Some(self.cmp(other))
     }
 }
 

crates/clock/src/clock.rs ๐Ÿ”—

@@ -54,14 +54,14 @@ impl<'a> Add<&'a Self> for Local {
     type Output = Local;
 
     fn add(self, other: &'a Self) -> Self::Output {
-        cmp::max(&self, other).clone()
+        *cmp::max(&self, other)
     }
 }
 
 impl<'a> AddAssign<&'a Local> for Local {
     fn add_assign(&mut self, other: &Self) {
         if *self < *other {
-            *self = other.clone();
+            *self = *other;
         }
     }
 }
@@ -177,7 +177,7 @@ impl Global {
         false
     }
 
-    pub fn iter<'a>(&'a self) -> impl 'a + Iterator<Item = Local> {
+    pub fn iter(&self) -> impl Iterator<Item = Local> + '_ {
         self.0.iter().enumerate().map(|(replica_id, seq)| Local {
             replica_id: replica_id as ReplicaId,
             value: *seq,

crates/collab/src/api.rs ๐Ÿ”—

@@ -394,7 +394,7 @@ async fn create_access_token(
         } else {
             return Err(Error::Http(
                 StatusCode::UNAUTHORIZED,
-                format!("you do not have permission to impersonate other users"),
+                "you do not have permission to impersonate other users".to_string(),
             ));
         }
     }

crates/collab/src/auth.rs ๐Ÿ”—

@@ -44,7 +44,7 @@ pub async fn validate_header<B>(mut req: Request<B>, next: Next<B>) -> impl Into
     let state = req.extensions().get::<Arc<AppState>>().unwrap();
     let mut credentials_valid = false;
     for password_hash in state.db.get_access_token_hashes(user_id).await? {
-        if verify_access_token(&access_token, &password_hash)? {
+        if verify_access_token(access_token, &password_hash)? {
             credentials_valid = true;
             break;
         }
@@ -100,7 +100,7 @@ pub fn encrypt_access_token(access_token: &str, public_key: String) -> Result<St
     let native_app_public_key =
         rpc::auth::PublicKey::try_from(public_key).context("failed to parse app public key")?;
     let encrypted_access_token = native_app_public_key
-        .encrypt_string(&access_token)
+        .encrypt_string(access_token)
         .context("failed to encrypt access token with public key")?;
     Ok(encrypted_access_token)
 }

crates/collab/src/db.rs ๐Ÿ”—

@@ -154,7 +154,7 @@ pub trait Db: Send + Sync {
     #[cfg(test)]
     async fn teardown(&self, url: &str);
     #[cfg(test)]
-    fn as_fake<'a>(&'a self) -> Option<&'a tests::FakeDb>;
+    fn as_fake(&self) -> Option<&tests::FakeDb>;
 }
 
 pub struct PostgresDb {
@@ -165,7 +165,7 @@ impl PostgresDb {
     pub async fn new(url: &str, max_connections: u32) -> Result<Self> {
         let pool = DbOptions::new()
             .max_connections(max_connections)
-            .connect(&url)
+            .connect(url)
             .await
             .context("failed to connect to postgres database")?;
         Ok(Self { pool })
@@ -568,7 +568,7 @@ impl Db for PostgresDb {
         for count in counts {
             extension_counts
                 .entry(count.worktree_id as u64)
-                .or_insert(HashMap::default())
+                .or_insert_with(HashMap::default)
                 .insert(count.extension, count.count as usize);
         }
         Ok(extension_counts)
@@ -863,20 +863,18 @@ impl Db for PostgresDb {
                         should_notify,
                     });
                 }
+            } else if accepted {
+                contacts.push(Contact::Accepted {
+                    user_id: user_id_a,
+                    should_notify: should_notify && !a_to_b,
+                });
+            } else if a_to_b {
+                contacts.push(Contact::Incoming {
+                    user_id: user_id_a,
+                    should_notify,
+                });
             } else {
-                if accepted {
-                    contacts.push(Contact::Accepted {
-                        user_id: user_id_a,
-                        should_notify: should_notify && !a_to_b,
-                    });
-                } else if a_to_b {
-                    contacts.push(Contact::Incoming {
-                        user_id: user_id_a,
-                        should_notify,
-                    });
-                } else {
-                    contacts.push(Contact::Outgoing { user_id: user_id_a });
-                }
+                contacts.push(Contact::Outgoing { user_id: user_id_a });
             }
         }
 
@@ -1331,7 +1329,7 @@ macro_rules! id_type {
             }
 
             #[allow(unused)]
-            pub fn to_proto(&self) -> u64 {
+            pub fn to_proto(self) -> u64 {
                 self.0 as u64
             }
         }
@@ -2408,6 +2406,7 @@ pub mod tests {
     }
 
     impl TestDb {
+        #[allow(clippy::await_holding_lock)]
         pub async fn postgres() -> Self {
             lazy_static! {
                 static ref LOCK: Mutex<()> = Mutex::new(());

crates/collab/src/integration_tests.rs ๐Ÿ”—

@@ -157,7 +157,7 @@ async fn test_share_project(
     // Edit the buffer as client B and see that edit as client A.
     editor_b.update(cx_b, |editor, cx| editor.handle_input("ok, ", cx));
     buffer_a
-        .condition(&cx_a, |buffer, _| buffer.text() == "ok, b-contents")
+        .condition(cx_a, |buffer, _| buffer.text() == "ok, b-contents")
         .await;
 
     // TODO
@@ -482,7 +482,7 @@ async fn test_cancel_join_request(
             client_b.client.clone(),
             client_b.user_store.clone(),
             client_b.project_store.clone(),
-            client_b.language_registry.clone().clone(),
+            client_b.language_registry.clone(),
             FakeFs::new(cx.background()),
             cx,
         )
@@ -504,7 +504,7 @@ async fn test_cancel_join_request(
     deterministic.run_until_parked();
     assert_eq!(
         &*project_a_events.borrow(),
-        &[project::Event::ContactCancelledJoinRequest(user_b.clone())]
+        &[project::Event::ContactCancelledJoinRequest(user_b)]
     );
 }
 
@@ -554,17 +554,17 @@ async fn test_offline_projects(
             user_store: ModelHandle<UserStore>,
             cx: &mut gpui::MutableAppContext,
         ) {
-            let open_project_ids = project_store
-                .read(cx)
-                .projects(cx)
-                .filter_map(|project| project.read(cx).remote_id())
-                .collect::<Vec<_>>();
-
             let user_store = user_store.read(cx);
             for contact in user_store.contacts() {
                 if contact.user.id == user_store.current_user().unwrap().id {
                     for project in &contact.projects {
-                        if !open_project_ids.contains(&project.id) {
+                        let store_contains_project = project_store
+                            .read(cx)
+                            .projects(cx)
+                            .filter_map(|project| project.read(cx).remote_id())
+                            .any(|x| x == project.id);
+
+                        if !store_contains_project {
                             panic!(
                                 concat!(
                                     "current user's contact data has a project",
@@ -903,7 +903,7 @@ async fn test_propagate_saves_and_fs_changes(
     client_a.fs.insert_file("/a/file4", "4".into()).await;
 
     worktree_a
-        .condition(&cx_a, |tree, _| {
+        .condition(cx_a, |tree, _| {
             tree.paths()
                 .map(|p| p.to_string_lossy())
                 .collect::<Vec<_>>()
@@ -911,7 +911,7 @@ async fn test_propagate_saves_and_fs_changes(
         })
         .await;
     worktree_b
-        .condition(&cx_b, |tree, _| {
+        .condition(cx_b, |tree, _| {
             tree.paths()
                 .map(|p| p.to_string_lossy())
                 .collect::<Vec<_>>()
@@ -919,7 +919,7 @@ async fn test_propagate_saves_and_fs_changes(
         })
         .await;
     worktree_c
-        .condition(&cx_c, |tree, _| {
+        .condition(cx_c, |tree, _| {
             tree.paths()
                 .map(|p| p.to_string_lossy())
                 .collect::<Vec<_>>()
@@ -929,17 +929,17 @@ async fn test_propagate_saves_and_fs_changes(
 
     // Ensure buffer files are updated as well.
     buffer_a
-        .condition(&cx_a, |buf, _| {
+        .condition(cx_a, |buf, _| {
             buf.file().unwrap().path().to_str() == Some("file1-renamed")
         })
         .await;
     buffer_b
-        .condition(&cx_b, |buf, _| {
+        .condition(cx_b, |buf, _| {
             buf.file().unwrap().path().to_str() == Some("file1-renamed")
         })
         .await;
     buffer_c
-        .condition(&cx_c, |buf, _| {
+        .condition(cx_c, |buf, _| {
             buf.file().unwrap().path().to_str() == Some("file1-renamed")
         })
         .await;
@@ -1246,7 +1246,7 @@ async fn test_buffer_conflict_after_save(cx_a: &mut TestAppContext, cx_b: &mut T
 
     buffer_b.update(cx_b, |buf, cx| buf.save(cx)).await.unwrap();
     buffer_b
-        .condition(&cx_b, |buffer_b, _| !buffer_b.is_dirty())
+        .condition(cx_b, |buffer_b, _| !buffer_b.is_dirty())
         .await;
     buffer_b.read_with(cx_b, |buf, _| {
         assert!(!buf.has_conflict());
@@ -1299,7 +1299,7 @@ async fn test_buffer_reloading(cx_a: &mut TestAppContext, cx_b: &mut TestAppCont
         .await
         .unwrap();
     buffer_b
-        .condition(&cx_b, |buf, _| {
+        .condition(cx_b, |buf, _| {
             buf.text() == new_contents.to_string() && !buf.is_dirty()
         })
         .await;
@@ -1349,7 +1349,7 @@ async fn test_editing_while_guest_opens_buffer(
 
     let text = buffer_a.read_with(cx_a, |buf, _| buf.text());
     let buffer_b = buffer_b.await.unwrap();
-    buffer_b.condition(&cx_b, |buf, _| buf.text() == text).await;
+    buffer_b.condition(cx_b, |buf, _| buf.text() == text).await;
 }
 
 #[gpui::test(iterations = 10)]
@@ -1374,7 +1374,7 @@ async fn test_leaving_worktree_while_opening_buffer(
 
     // See that a guest has joined as client A.
     project_a
-        .condition(&cx_a, |p, _| p.collaborators().len() == 1)
+        .condition(cx_a, |p, _| p.collaborators().len() == 1)
         .await;
 
     // Begin opening a buffer as client B, but leave the project before the open completes.
@@ -1386,7 +1386,7 @@ async fn test_leaving_worktree_while_opening_buffer(
 
     // See that the guest has left.
     project_a
-        .condition(&cx_a, |p, _| p.collaborators().len() == 0)
+        .condition(cx_a, |p, _| p.collaborators().is_empty())
         .await;
 }
 
@@ -1421,7 +1421,7 @@ async fn test_leaving_project(cx_a: &mut TestAppContext, cx_b: &mut TestAppConte
     // Drop client B's connection and ensure client A observes client B leaving the project.
     client_b.disconnect(&cx_b.to_async()).unwrap();
     project_a
-        .condition(cx_a, |p, _| p.collaborators().len() == 0)
+        .condition(cx_a, |p, _| p.collaborators().is_empty())
         .await;
 
     // Rejoin the project as client B
@@ -1437,7 +1437,7 @@ async fn test_leaving_project(cx_a: &mut TestAppContext, cx_b: &mut TestAppConte
     server.disconnect_client(client_b.current_user_id(cx_b));
     cx_a.foreground().advance_clock(rpc::RECEIVE_TIMEOUT);
     project_a
-        .condition(cx_a, |p, _| p.collaborators().len() == 0)
+        .condition(cx_a, |p, _| p.collaborators().is_empty())
         .await;
 }
 
@@ -1639,7 +1639,6 @@ async fn test_collaborating_with_diagnostics(
             buffer
                 .snapshot()
                 .diagnostics_in_range::<_, Point>(0..buffer.len(), false)
-                .map(|entry| entry)
                 .collect::<Vec<_>>(),
             &[
                 DiagnosticEntry {
@@ -1744,7 +1743,7 @@ async fn test_collaborating_with_completion(cx_a: &mut TestAppContext, cx_b: &mu
 
     let fake_language_server = fake_language_servers.next().await.unwrap();
     buffer_b
-        .condition(&cx_b, |buffer, _| !buffer.completion_triggers().is_empty())
+        .condition(cx_b, |buffer, _| !buffer.completion_triggers().is_empty())
         .await;
 
     // Type a completion trigger character as the guest.
@@ -1808,12 +1807,12 @@ async fn test_collaborating_with_completion(cx_a: &mut TestAppContext, cx_b: &mu
         .await
         .unwrap();
     buffer_a
-        .condition(&cx_a, |buffer, _| buffer.text() == "fn main() { a. }")
+        .condition(cx_a, |buffer, _| buffer.text() == "fn main() { a. }")
         .await;
 
     // Confirm a completion on the guest.
     editor_b
-        .condition(&cx_b, |editor, _| editor.context_menu_visible())
+        .condition(cx_b, |editor, _| editor.context_menu_visible())
         .await;
     editor_b.update(cx_b, |editor, cx| {
         editor.confirm_completion(&ConfirmCompletion { item_ix: Some(0) }, cx);
@@ -1844,12 +1843,12 @@ async fn test_collaborating_with_completion(cx_a: &mut TestAppContext, cx_b: &mu
 
     // The additional edit is applied.
     buffer_a
-        .condition(&cx_a, |buffer, _| {
+        .condition(cx_a, |buffer, _| {
             buffer.text() == "use d::SomeTrait;\nfn main() { a.first_method() }"
         })
         .await;
     buffer_b
-        .condition(&cx_b, |buffer, _| {
+        .condition(cx_b, |buffer, _| {
             buffer.text() == "use d::SomeTrait;\nfn main() { a.first_method() }"
         })
         .await;
@@ -2256,9 +2255,9 @@ async fn test_references(cx_a: &mut TestAppContext, cx_b: &mut TestAppContext) {
             Path::new("three.rs")
         );
 
-        assert_eq!(references[0].range.to_offset(&two_buffer), 24..27);
-        assert_eq!(references[1].range.to_offset(&two_buffer), 35..38);
-        assert_eq!(references[2].range.to_offset(&three_buffer), 37..40);
+        assert_eq!(references[0].range.to_offset(two_buffer), 24..27);
+        assert_eq!(references[1].range.to_offset(two_buffer), 35..38);
+        assert_eq!(references[2].range.to_offset(three_buffer), 37..40);
     });
 }
 
@@ -2707,7 +2706,7 @@ async fn test_collaborating_with_code_actions(
     cx_b: &mut TestAppContext,
 ) {
     cx_a.foreground().forbid_parking();
-    cx_b.update(|cx| editor::init(cx));
+    cx_b.update(editor::init);
     let mut server = TestServer::start(cx_a.foreground(), cx_a.background()).await;
     let client_a = server.create_client(cx_a, "user_a").await;
     let client_b = server.create_client(cx_b, "user_b").await;
@@ -2839,7 +2838,7 @@ async fn test_collaborating_with_code_actions(
         );
     });
     editor_b
-        .condition(&cx_b, |editor, _| editor.context_menu_visible())
+        .condition(cx_b, |editor, _| editor.context_menu_visible())
         .await;
 
     fake_language_server.remove_request_handler::<lsp::request::CodeActionRequest>();
@@ -2912,7 +2911,7 @@ async fn test_collaborating_with_code_actions(
 #[gpui::test(iterations = 10)]
 async fn test_collaborating_with_renames(cx_a: &mut TestAppContext, cx_b: &mut TestAppContext) {
     cx_a.foreground().forbid_parking();
-    cx_b.update(|cx| editor::init(cx));
+    cx_b.update(editor::init);
     let mut server = TestServer::start(cx_a.foreground(), cx_a.background()).await;
     let client_a = server.create_client(cx_a, "user_a").await;
     let client_b = server.create_client(cx_b, "user_b").await;
@@ -3098,7 +3097,7 @@ async fn test_language_server_statuses(
 ) {
     deterministic.forbid_parking();
 
-    cx_b.update(|cx| editor::init(cx));
+    cx_b.update(editor::init);
     let mut server = TestServer::start(cx_a.foreground(), cx_a.background()).await;
     let client_a = server.create_client(cx_a, "user_a").await;
     let client_b = server.create_client(cx_b, "user_b").await;
@@ -3207,24 +3206,24 @@ async fn test_basic_chat(cx_a: &mut TestAppContext, cx_b: &mut TestAppContext) {
     // Create an org that includes these 2 users.
     let db = &server.app_state.db;
     let org_id = db.create_org("Test Org", "test-org").await.unwrap();
-    db.add_org_member(org_id, client_a.current_user_id(&cx_a), false)
+    db.add_org_member(org_id, client_a.current_user_id(cx_a), false)
         .await
         .unwrap();
-    db.add_org_member(org_id, client_b.current_user_id(&cx_b), false)
+    db.add_org_member(org_id, client_b.current_user_id(cx_b), false)
         .await
         .unwrap();
 
     // Create a channel that includes all the users.
     let channel_id = db.create_org_channel(org_id, "test-channel").await.unwrap();
-    db.add_channel_member(channel_id, client_a.current_user_id(&cx_a), false)
+    db.add_channel_member(channel_id, client_a.current_user_id(cx_a), false)
         .await
         .unwrap();
-    db.add_channel_member(channel_id, client_b.current_user_id(&cx_b), false)
+    db.add_channel_member(channel_id, client_b.current_user_id(cx_b), false)
         .await
         .unwrap();
     db.create_channel_message(
         channel_id,
-        client_b.current_user_id(&cx_b),
+        client_b.current_user_id(cx_b),
         "hello A, it's B.",
         OffsetDateTime::now_utc(),
         1,
@@ -3251,7 +3250,7 @@ async fn test_basic_chat(cx_a: &mut TestAppContext, cx_b: &mut TestAppContext) {
     });
     channel_a.read_with(cx_a, |channel, _| assert!(channel.messages().is_empty()));
     channel_a
-        .condition(&cx_a, |channel, _| {
+        .condition(cx_a, |channel, _| {
             channel_messages(channel)
                 == [("user_b".to_string(), "hello A, it's B.".to_string(), false)]
         })
@@ -3277,7 +3276,7 @@ async fn test_basic_chat(cx_a: &mut TestAppContext, cx_b: &mut TestAppContext) {
     });
     channel_b.read_with(cx_b, |channel, _| assert!(channel.messages().is_empty()));
     channel_b
-        .condition(&cx_b, |channel, _| {
+        .condition(cx_b, |channel, _| {
             channel_messages(channel)
                 == [("user_b".to_string(), "hello A, it's B.".to_string(), false)]
         })
@@ -3304,7 +3303,7 @@ async fn test_basic_chat(cx_a: &mut TestAppContext, cx_b: &mut TestAppContext) {
         .unwrap();
 
     channel_b
-        .condition(&cx_b, |channel, _| {
+        .condition(cx_b, |channel, _| {
             channel_messages(channel)
                 == [
                     ("user_b".to_string(), "hello A, it's B.".to_string(), false),
@@ -3344,10 +3343,10 @@ async fn test_chat_message_validation(cx_a: &mut TestAppContext) {
     let db = &server.app_state.db;
     let org_id = db.create_org("Test Org", "test-org").await.unwrap();
     let channel_id = db.create_org_channel(org_id, "test-channel").await.unwrap();
-    db.add_org_member(org_id, client_a.current_user_id(&cx_a), false)
+    db.add_org_member(org_id, client_a.current_user_id(cx_a), false)
         .await
         .unwrap();
-    db.add_channel_member(channel_id, client_a.current_user_id(&cx_a), false)
+    db.add_channel_member(channel_id, client_a.current_user_id(cx_a), false)
         .await
         .unwrap();
 
@@ -3406,24 +3405,24 @@ async fn test_chat_reconnection(cx_a: &mut TestAppContext, cx_b: &mut TestAppCon
     // Create an org that includes these 2 users.
     let db = &server.app_state.db;
     let org_id = db.create_org("Test Org", "test-org").await.unwrap();
-    db.add_org_member(org_id, client_a.current_user_id(&cx_a), false)
+    db.add_org_member(org_id, client_a.current_user_id(cx_a), false)
         .await
         .unwrap();
-    db.add_org_member(org_id, client_b.current_user_id(&cx_b), false)
+    db.add_org_member(org_id, client_b.current_user_id(cx_b), false)
         .await
         .unwrap();
 
     // Create a channel that includes all the users.
     let channel_id = db.create_org_channel(org_id, "test-channel").await.unwrap();
-    db.add_channel_member(channel_id, client_a.current_user_id(&cx_a), false)
+    db.add_channel_member(channel_id, client_a.current_user_id(cx_a), false)
         .await
         .unwrap();
-    db.add_channel_member(channel_id, client_b.current_user_id(&cx_b), false)
+    db.add_channel_member(channel_id, client_b.current_user_id(cx_b), false)
         .await
         .unwrap();
     db.create_channel_message(
         channel_id,
-        client_b.current_user_id(&cx_b),
+        client_b.current_user_id(cx_b),
         "hello A, it's B.",
         OffsetDateTime::now_utc(),
         2,
@@ -3451,7 +3450,7 @@ async fn test_chat_reconnection(cx_a: &mut TestAppContext, cx_b: &mut TestAppCon
     });
     channel_a.read_with(cx_a, |channel, _| assert!(channel.messages().is_empty()));
     channel_a
-        .condition(&cx_a, |channel, _| {
+        .condition(cx_a, |channel, _| {
             channel_messages(channel)
                 == [("user_b".to_string(), "hello A, it's B.".to_string(), false)]
         })
@@ -3477,7 +3476,7 @@ async fn test_chat_reconnection(cx_a: &mut TestAppContext, cx_b: &mut TestAppCon
     });
     channel_b.read_with(cx_b, |channel, _| assert!(channel.messages().is_empty()));
     channel_b
-        .condition(&cx_b, |channel, _| {
+        .condition(cx_b, |channel, _| {
             channel_messages(channel)
                 == [("user_b".to_string(), "hello A, it's B.".to_string(), false)]
         })
@@ -3485,7 +3484,7 @@ async fn test_chat_reconnection(cx_a: &mut TestAppContext, cx_b: &mut TestAppCon
 
     // Disconnect client B, ensuring we can still access its cached channel data.
     server.forbid_connections();
-    server.disconnect_client(client_b.current_user_id(&cx_b));
+    server.disconnect_client(client_b.current_user_id(cx_b));
     cx_b.foreground().advance_clock(rpc::RECEIVE_TIMEOUT);
     while !matches!(
         status_b.next().await,
@@ -3554,7 +3553,7 @@ async fn test_chat_reconnection(cx_a: &mut TestAppContext, cx_b: &mut TestAppCon
     // Verify that B sees the new messages upon reconnection, as well as the message client B
     // sent while offline.
     channel_b
-        .condition(&cx_b, |channel, _| {
+        .condition(cx_b, |channel, _| {
             channel_messages(channel)
                 == [
                     ("user_b".to_string(), "hello A, it's B.".to_string(), false),
@@ -3573,7 +3572,7 @@ async fn test_chat_reconnection(cx_a: &mut TestAppContext, cx_b: &mut TestAppCon
         .await
         .unwrap();
     channel_b
-        .condition(&cx_b, |channel, _| {
+        .condition(cx_b, |channel, _| {
             channel_messages(channel)
                 == [
                     ("user_b".to_string(), "hello A, it's B.".to_string(), false),
@@ -3592,7 +3591,7 @@ async fn test_chat_reconnection(cx_a: &mut TestAppContext, cx_b: &mut TestAppCon
         .await
         .unwrap();
     channel_a
-        .condition(&cx_a, |channel, _| {
+        .condition(cx_a, |channel, _| {
             channel_messages(channel)
                 == [
                     ("user_b".to_string(), "hello A, it's B.".to_string(), false),
@@ -3701,7 +3700,7 @@ async fn test_contacts(
     }
 
     project_a
-        .condition(&cx_a, |project, _| {
+        .condition(cx_a, |project, _| {
             project.collaborators().contains_key(&client_b.peer_id)
         })
         .await;
@@ -3766,6 +3765,7 @@ async fn test_contacts(
         });
     }
 
+    #[allow(clippy::type_complexity)]
     fn contacts(user_store: &UserStore) -> Vec<(&str, bool, Vec<(&str, Vec<&str>)>)> {
         user_store
             .contacts()
@@ -3831,27 +3831,27 @@ async fn test_contact_requests(
 
     // All users see the pending request appear in all their clients.
     assert_eq!(
-        client_a.summarize_contacts(&cx_a).outgoing_requests,
+        client_a.summarize_contacts(cx_a).outgoing_requests,
         &["user_b"]
     );
     assert_eq!(
-        client_a2.summarize_contacts(&cx_a2).outgoing_requests,
+        client_a2.summarize_contacts(cx_a2).outgoing_requests,
         &["user_b"]
     );
     assert_eq!(
-        client_b.summarize_contacts(&cx_b).incoming_requests,
+        client_b.summarize_contacts(cx_b).incoming_requests,
         &["user_a", "user_c"]
     );
     assert_eq!(
-        client_b2.summarize_contacts(&cx_b2).incoming_requests,
+        client_b2.summarize_contacts(cx_b2).incoming_requests,
         &["user_a", "user_c"]
     );
     assert_eq!(
-        client_c.summarize_contacts(&cx_c).outgoing_requests,
+        client_c.summarize_contacts(cx_c).outgoing_requests,
         &["user_b"]
     );
     assert_eq!(
-        client_c2.summarize_contacts(&cx_c2).outgoing_requests,
+        client_c2.summarize_contacts(cx_c2).outgoing_requests,
         &["user_b"]
     );
 
@@ -3861,15 +3861,15 @@ async fn test_contact_requests(
     disconnect_and_reconnect(&client_c, cx_c).await;
     executor.run_until_parked();
     assert_eq!(
-        client_a.summarize_contacts(&cx_a).outgoing_requests,
+        client_a.summarize_contacts(cx_a).outgoing_requests,
         &["user_b"]
     );
     assert_eq!(
-        client_b.summarize_contacts(&cx_b).incoming_requests,
+        client_b.summarize_contacts(cx_b).incoming_requests,
         &["user_a", "user_c"]
     );
     assert_eq!(
-        client_c.summarize_contacts(&cx_c).outgoing_requests,
+        client_c.summarize_contacts(cx_c).outgoing_requests,
         &["user_b"]
     );
 
@@ -3885,18 +3885,18 @@ async fn test_contact_requests(
     executor.run_until_parked();
 
     // User B sees user A as their contact now in all client, and the incoming request from them is removed.
-    let contacts_b = client_b.summarize_contacts(&cx_b);
+    let contacts_b = client_b.summarize_contacts(cx_b);
     assert_eq!(contacts_b.current, &["user_a", "user_b"]);
     assert_eq!(contacts_b.incoming_requests, &["user_c"]);
-    let contacts_b2 = client_b2.summarize_contacts(&cx_b2);
+    let contacts_b2 = client_b2.summarize_contacts(cx_b2);
     assert_eq!(contacts_b2.current, &["user_a", "user_b"]);
     assert_eq!(contacts_b2.incoming_requests, &["user_c"]);
 
     // User A sees user B as their contact now in all clients, and the outgoing request to them is removed.
-    let contacts_a = client_a.summarize_contacts(&cx_a);
+    let contacts_a = client_a.summarize_contacts(cx_a);
     assert_eq!(contacts_a.current, &["user_a", "user_b"]);
     assert!(contacts_a.outgoing_requests.is_empty());
-    let contacts_a2 = client_a2.summarize_contacts(&cx_a2);
+    let contacts_a2 = client_a2.summarize_contacts(cx_a2);
     assert_eq!(contacts_a2.current, &["user_a", "user_b"]);
     assert!(contacts_a2.outgoing_requests.is_empty());
 
@@ -3906,20 +3906,20 @@ async fn test_contact_requests(
     disconnect_and_reconnect(&client_c, cx_c).await;
     executor.run_until_parked();
     assert_eq!(
-        client_a.summarize_contacts(&cx_a).current,
+        client_a.summarize_contacts(cx_a).current,
         &["user_a", "user_b"]
     );
     assert_eq!(
-        client_b.summarize_contacts(&cx_b).current,
+        client_b.summarize_contacts(cx_b).current,
         &["user_a", "user_b"]
     );
     assert_eq!(
-        client_b.summarize_contacts(&cx_b).incoming_requests,
+        client_b.summarize_contacts(cx_b).incoming_requests,
         &["user_c"]
     );
-    assert_eq!(client_c.summarize_contacts(&cx_c).current, &["user_c"]);
+    assert_eq!(client_c.summarize_contacts(cx_c).current, &["user_c"]);
     assert_eq!(
-        client_c.summarize_contacts(&cx_c).outgoing_requests,
+        client_c.summarize_contacts(cx_c).outgoing_requests,
         &["user_b"]
     );
 
@@ -3935,18 +3935,18 @@ async fn test_contact_requests(
     executor.run_until_parked();
 
     // User B doesn't see user C as their contact, and the incoming request from them is removed.
-    let contacts_b = client_b.summarize_contacts(&cx_b);
+    let contacts_b = client_b.summarize_contacts(cx_b);
     assert_eq!(contacts_b.current, &["user_a", "user_b"]);
     assert!(contacts_b.incoming_requests.is_empty());
-    let contacts_b2 = client_b2.summarize_contacts(&cx_b2);
+    let contacts_b2 = client_b2.summarize_contacts(cx_b2);
     assert_eq!(contacts_b2.current, &["user_a", "user_b"]);
     assert!(contacts_b2.incoming_requests.is_empty());
 
     // User C doesn't see user B as their contact, and the outgoing request to them is removed.
-    let contacts_c = client_c.summarize_contacts(&cx_c);
+    let contacts_c = client_c.summarize_contacts(cx_c);
     assert_eq!(contacts_c.current, &["user_c"]);
     assert!(contacts_c.outgoing_requests.is_empty());
-    let contacts_c2 = client_c2.summarize_contacts(&cx_c2);
+    let contacts_c2 = client_c2.summarize_contacts(cx_c2);
     assert_eq!(contacts_c2.current, &["user_c"]);
     assert!(contacts_c2.outgoing_requests.is_empty());
 
@@ -3956,20 +3956,20 @@ async fn test_contact_requests(
     disconnect_and_reconnect(&client_c, cx_c).await;
     executor.run_until_parked();
     assert_eq!(
-        client_a.summarize_contacts(&cx_a).current,
+        client_a.summarize_contacts(cx_a).current,
         &["user_a", "user_b"]
     );
     assert_eq!(
-        client_b.summarize_contacts(&cx_b).current,
+        client_b.summarize_contacts(cx_b).current,
         &["user_a", "user_b"]
     );
     assert!(client_b
-        .summarize_contacts(&cx_b)
+        .summarize_contacts(cx_b)
         .incoming_requests
         .is_empty());
-    assert_eq!(client_c.summarize_contacts(&cx_c).current, &["user_c"]);
+    assert_eq!(client_c.summarize_contacts(cx_c).current, &["user_c"]);
     assert!(client_c
-        .summarize_contacts(&cx_c)
+        .summarize_contacts(cx_c)
         .outgoing_requests
         .is_empty());
 
@@ -4553,13 +4553,13 @@ async fn test_peers_simultaneously_following_each_other(
     futures::try_join!(a_follow_b, b_follow_a).unwrap();
     workspace_a.read_with(cx_a, |workspace, _| {
         assert_eq!(
-            workspace.leader_for_pane(&workspace.active_pane()),
+            workspace.leader_for_pane(workspace.active_pane()),
             Some(client_b_id)
         );
     });
     workspace_b.read_with(cx_b, |workspace, _| {
         assert_eq!(
-            workspace.leader_for_pane(&workspace.active_pane()),
+            workspace.leader_for_pane(workspace.active_pane()),
             Some(client_a_id)
         );
     });
@@ -4740,7 +4740,7 @@ async fn test_random_collaboration(
 
                     fake_server.handle_request::<lsp::request::DocumentHighlightRequest, _, _>({
                         let rng = rng.clone();
-                        let project = project.clone();
+                        let project = project;
                         move |params, mut cx| {
                             let highlights = if let Some(project) = project.upgrade(&cx) {
                                 project.update(&mut cx, |project, cx| {
@@ -5027,10 +5027,12 @@ async fn test_random_collaboration(
         for guest_buffer in &guest_client.buffers {
             let buffer_id = guest_buffer.read_with(&guest_cx, |buffer, _| buffer.remote_id());
             let host_buffer = host_project.read_with(&host_cx, |project, cx| {
-                project.buffer_for_id(buffer_id, cx).expect(&format!(
-                    "host does not have buffer for guest:{}, peer:{}, id:{}",
-                    guest_client.username, guest_client.peer_id, buffer_id
-                ))
+                project.buffer_for_id(buffer_id, cx).unwrap_or_else(|| {
+                    panic!(
+                        "host does not have buffer for guest:{}, peer:{}, id:{}",
+                        guest_client.username, guest_client.peer_id, buffer_id
+                    )
+                })
             });
             let path =
                 host_buffer.read_with(&host_cx, |buffer, cx| buffer.file().unwrap().full_path(cx));
@@ -5174,7 +5176,7 @@ impl TestServer {
             languages: Arc::new(LanguageRegistry::new(Task::ready(()))),
             themes: ThemeRegistry::new((), cx.font_cache()),
             fs: fs.clone(),
-            build_window_options: || Default::default(),
+            build_window_options: Default::default,
             initialize_workspace: |_, _, _| unimplemented!(),
         });
 
@@ -5540,7 +5542,7 @@ impl TestClient {
 
                         log::info!("Host: creating file {:?}", path,);
 
-                        if fs.create_dir(&parent_path).await.is_ok()
+                        if fs.create_dir(parent_path).await.is_ok()
                             && fs.create_file(&path, Default::default()).await.is_ok()
                         {
                             break;
@@ -5587,7 +5589,7 @@ impl TestClient {
                 let buffer = if client.buffers.is_empty() || rng.lock().gen() {
                     let worktree = if let Some(worktree) = project.read_with(cx, |project, cx| {
                         project
-                            .worktrees(&cx)
+                            .worktrees(cx)
                             .filter(|worktree| {
                                 let worktree = worktree.read(cx);
                                 worktree.is_visible()
@@ -5820,7 +5822,7 @@ impl TestClient {
                         let worktree = project
                             .read_with(cx, |project, cx| {
                                 project
-                                    .worktrees(&cx)
+                                    .worktrees(cx)
                                     .filter(|worktree| {
                                         let worktree = worktree.read(cx);
                                         worktree.is_visible()

crates/collab/src/rpc.rs ๐Ÿ”—

@@ -832,7 +832,7 @@ impl Server {
             // First, we send the metadata associated with each worktree.
             for (receipt, replica_id) in &receipts_with_replica_ids {
                 self.peer.respond(
-                    receipt.clone(),
+                    *receipt,
                     proto::JoinProjectResponse {
                         variant: Some(proto::join_project_response::Variant::Accept(
                             proto::join_project_response::Accept {
@@ -1711,7 +1711,7 @@ impl Server {
         Ok(())
     }
 
-    pub(crate) async fn store<'a>(&'a self) -> StoreGuard<'a> {
+    pub(crate) async fn store(&self) -> StoreGuard<'_> {
         #[cfg(test)]
         tokio::task::yield_now().await;
         let guard = self.store.lock().await;
@@ -1796,7 +1796,7 @@ impl Header for ProtocolVersion {
     {
         let version = values
             .next()
-            .ok_or_else(|| axum::headers::Error::invalid())?
+            .ok_or_else(axum::headers::Error::invalid)?
             .to_str()
             .map_err(|_| axum::headers::Error::invalid())?
             .parse()

crates/collab/src/rpc/store.rs ๐Ÿ”—

@@ -159,8 +159,10 @@ impl Store {
         let connection_projects = mem::take(&mut connection.projects);
         let connection_channels = mem::take(&mut connection.channels);
 
-        let mut result = RemovedConnectionState::default();
-        result.user_id = user_id;
+        let mut result = RemovedConnectionState {
+            user_id,
+            ..Default::default()
+        };
 
         // Leave all channels.
         for channel_id in connection_channels {
@@ -223,10 +225,10 @@ impl Store {
             .user_id)
     }
 
-    pub fn connection_ids_for_user<'a>(
-        &'a self,
+    pub fn connection_ids_for_user(
+        &self,
         user_id: UserId,
-    ) -> impl 'a + Iterator<Item = ConnectionId> {
+    ) -> impl Iterator<Item = ConnectionId> + '_ {
         self.connections_by_user_id
             .get(&user_id)
             .into_iter()
@@ -425,14 +427,14 @@ impl Store {
                     }
 
                     for guest_connection in project.guests.keys() {
-                        if let Some(connection) = self.connections.get_mut(&guest_connection) {
+                        if let Some(connection) = self.connections.get_mut(guest_connection) {
                             connection.projects.remove(&project_id);
                         }
                     }
 
                     for requester_user_id in project.join_requests.keys() {
                         if let Some(requester_connection_ids) =
-                            self.connections_by_user_id.get_mut(&requester_user_id)
+                            self.connections_by_user_id.get_mut(requester_user_id)
                         {
                             for requester_connection_id in requester_connection_ids.iter() {
                                 if let Some(requester_connection) =
@@ -544,6 +546,7 @@ impl Store {
         Some(receipts)
     }
 
+    #[allow(clippy::type_complexity)]
     pub fn accept_join_project_request(
         &mut self,
         responder_connection_id: ConnectionId,
@@ -638,6 +641,7 @@ impl Store {
         })
     }
 
+    #[allow(clippy::too_many_arguments)]
     pub fn update_worktree(
         &mut self,
         connection_id: ConnectionId,
@@ -660,7 +664,7 @@ impl Store {
         worktree.root_name = worktree_root_name.to_string();
 
         for entry_id in removed_entries {
-            worktree.entries.remove(&entry_id);
+            worktree.entries.remove(entry_id);
         }
 
         for entry in updated_entries {
@@ -760,7 +764,7 @@ impl Store {
     pub fn check_invariants(&self) {
         for (connection_id, connection) in &self.connections {
             for project_id in &connection.projects {
-                let project = &self.projects.get(&project_id).unwrap();
+                let project = &self.projects.get(project_id).unwrap();
                 if project.host_connection_id != *connection_id {
                     assert!(project.guests.contains_key(connection_id));
                 }

crates/command_palette/src/command_palette.rs ๐Ÿ”—

@@ -83,7 +83,9 @@ impl CommandPalette {
     fn toggle(_: &mut Workspace, _: &Toggle, cx: &mut ViewContext<Workspace>) {
         let workspace = cx.handle();
         let window_id = cx.window_id();
-        let focused_view_id = cx.focused_view_id(window_id).unwrap_or(workspace.id());
+        let focused_view_id = cx
+            .focused_view_id(window_id)
+            .unwrap_or_else(|| workspace.id());
 
         cx.as_mut().defer(move |cx| {
             let this = cx.add_view(workspace.clone(), |cx| Self::new(focused_view_id, cx));

crates/contacts_panel/src/contact_finder.rs ๐Ÿ”—

@@ -111,7 +111,7 @@ impl PickerDelegate for ContactFinder {
     ) -> ElementBox {
         let theme = &cx.global::<Settings>().theme;
         let user = &self.potential_contacts[ix];
-        let request_status = self.user_store.read(cx).contact_request_status(&user);
+        let request_status = self.user_store.read(cx).contact_request_status(user);
 
         let icon_path = match request_status {
             ContactRequestStatus::None | ContactRequestStatus::RequestReceived => {
@@ -121,7 +121,7 @@ impl PickerDelegate for ContactFinder {
                 "icons/x_mark_8.svg"
             }
         };
-        let button_style = if self.user_store.read(cx).is_contact_request_pending(&user) {
+        let button_style = if self.user_store.read(cx).is_contact_request_pending(user) {
             &theme.contact_finder.disabled_contact_button
         } else {
             &theme.contact_finder.contact_button

crates/contacts_panel/src/contacts_panel.rs ๐Ÿ”—

@@ -131,9 +131,9 @@ impl ContactsPanel {
             move |_, cx| {
                 if let Some(workspace_handle) = workspace.upgrade(cx) {
                     cx.subscribe(&workspace_handle.read(cx).project().clone(), {
-                        let workspace = workspace.clone();
-                        move |_, project, event, cx| match event {
-                            project::Event::ContactRequestedJoin(user) => {
+                        let workspace = workspace;
+                        move |_, project, event, cx| {
+                            if let project::Event::ContactRequestedJoin(user) = event {
                                 if let Some(workspace) = workspace.upgrade(cx) {
                                     workspace.update(cx, |workspace, cx| {
                                         workspace.show_notification(user.id as usize, cx, |cx| {
@@ -148,7 +148,6 @@ impl ContactsPanel {
                                     });
                                 }
                             }
-                            _ => {}
                         }
                     })
                     .detach();
@@ -161,17 +160,16 @@ impl ContactsPanel {
 
         cx.subscribe(&user_store, move |_, user_store, event, cx| {
             if let Some(workspace) = workspace.upgrade(cx) {
-                workspace.update(cx, |workspace, cx| match event {
-                    client::Event::Contact { user, kind } => match kind {
-                        ContactEventKind::Requested | ContactEventKind::Accepted => workspace
-                            .show_notification(user.id as usize, cx, |cx| {
+                workspace.update(cx, |workspace, cx| {
+                    if let client::Event::Contact { user, kind } = event {
+                        if let ContactEventKind::Requested | ContactEventKind::Accepted = kind {
+                            workspace.show_notification(user.id as usize, cx, |cx| {
                                 cx.add_view(|cx| {
                                     ContactNotification::new(user.clone(), *kind, user_store, cx)
                                 })
-                            }),
-                        _ => {}
-                    },
-                    _ => {}
+                            })
+                        }
+                    }
                 });
             }
 
@@ -188,7 +186,7 @@ impl ContactsPanel {
 
             match &this.entries[ix] {
                 ContactEntry::Header(section) => {
-                    let is_collapsed = this.collapsed_sections.contains(&section);
+                    let is_collapsed = this.collapsed_sections.contains(section);
                     Self::render_header(
                         *section,
                         &theme.contacts_panel,
@@ -229,7 +227,7 @@ impl ContactsPanel {
                         contact.clone(),
                         current_user_id,
                         *project_ix,
-                        open_project.clone(),
+                        *open_project,
                         &theme.contacts_panel,
                         &theme.tooltip,
                         is_last_project_for_contact,
@@ -238,7 +236,7 @@ impl ContactsPanel {
                     )
                 }
                 ContactEntry::OfflineProject(project) => Self::render_offline_project(
-                    project.clone(),
+                    *project,
                     &theme.contacts_panel,
                     &theme.tooltip,
                     is_selected,
@@ -345,6 +343,7 @@ impl ContactsPanel {
             .boxed()
     }
 
+    #[allow(clippy::too_many_arguments)]
     fn render_project(
         contact: Arc<Contact>,
         current_user_id: Option<u64>,
@@ -370,7 +369,7 @@ impl ContactsPanel {
             .or(theme.contact_avatar.height)
             .unwrap_or(0.);
         let row = &theme.project_row.default;
-        let tree_branch = theme.tree_branch.clone();
+        let tree_branch = theme.tree_branch;
         let line_height = row.name.text.line_height(font_cache);
         let cap_height = row.name.text.cap_height(font_cache);
         let baseline_offset =
@@ -641,7 +640,7 @@ impl ContactsPanel {
                     let button_style = if is_contact_request_pending {
                         &theme.disabled_button
                     } else {
-                        &theme.contact_button.style_for(mouse_state, false)
+                        theme.contact_button.style_for(mouse_state, false)
                     };
                     render_icon_button(button_style, "icons/x_mark_8.svg")
                         .aligned()
@@ -663,7 +662,7 @@ impl ContactsPanel {
                     let button_style = if is_contact_request_pending {
                         &theme.disabled_button
                     } else {
-                        &theme.contact_button.style_for(mouse_state, false)
+                        theme.contact_button.style_for(mouse_state, false)
                     };
                     render_icon_button(button_style, "icons/check_8.svg")
                         .aligned()
@@ -685,7 +684,7 @@ impl ContactsPanel {
                     let button_style = if is_contact_request_pending {
                         &theme.disabled_button
                     } else {
-                        &theme.contact_button.style_for(mouse_state, false)
+                        theme.contact_button.style_for(mouse_state, false)
                     };
                     render_icon_button(button_style, "icons/x_mark_8.svg")
                         .aligned()
@@ -1224,7 +1223,7 @@ mod tests {
         let client = Client::new(http_client.clone());
         let user_store = cx.add_model(|cx| UserStore::new(client.clone(), http_client, cx));
         let project_store = cx.add_model(|_| ProjectStore::new(project::Db::open_fake()));
-        let server = FakeServer::for_client(current_user_id, &client, &cx).await;
+        let server = FakeServer::for_client(current_user_id, &client, cx).await;
         let fs = FakeFs::new(cx.background());
         fs.insert_tree("/private_dir", json!({ "one.rs": "" }))
             .await;

crates/diagnostics/src/diagnostics.rs ๐Ÿ”—

@@ -365,7 +365,7 @@ impl ProjectDiagnosticsEditor {
                                 if !diagnostic.message.is_empty() {
                                     group_state.block_count += 1;
                                     blocks_to_add.push(BlockProperties {
-                                        position: (excerpt_id.clone(), entry.range.start.clone()),
+                                        position: (excerpt_id.clone(), entry.range.start),
                                         height: diagnostic.message.matches('\n').count() as u8 + 1,
                                         style: BlockStyle::Fixed,
                                         render: diagnostic_block_renderer(diagnostic, true),
@@ -460,7 +460,7 @@ impl ProjectDiagnosticsEditor {
             for selection in &mut selections {
                 if let Some(new_excerpt_id) = new_excerpt_ids_by_selection_id.get(&selection.id) {
                     let group_ix = match groups.binary_search_by(|probe| {
-                        probe.excerpts.last().unwrap().cmp(&new_excerpt_id)
+                        probe.excerpts.last().unwrap().cmp(new_excerpt_id)
                     }) {
                         Ok(ix) | Err(ix) => ix,
                     };
@@ -468,7 +468,7 @@ impl ProjectDiagnosticsEditor {
                         let offset = excerpts_snapshot
                             .anchor_in_excerpt(
                                 group.excerpts[group.primary_excerpt_ix].clone(),
-                                group.primary_diagnostic.range.start.clone(),
+                                group.primary_diagnostic.range.start,
                             )
                             .to_offset(&excerpts_snapshot);
                         selection.start = offset;
@@ -486,10 +486,8 @@ impl ProjectDiagnosticsEditor {
             if self.editor.is_focused(cx) {
                 cx.focus_self();
             }
-        } else {
-            if cx.handle().is_focused(cx) {
-                cx.focus(&self.editor);
-            }
+        } else if cx.handle().is_focused(cx) {
+            cx.focus(&self.editor);
         }
         cx.notify();
     }
@@ -725,12 +723,12 @@ fn compare_diagnostics<L: language::ToOffset, R: language::ToOffset>(
 ) -> Ordering {
     lhs.range
         .start
-        .to_offset(&snapshot)
+        .to_offset(snapshot)
         .cmp(&rhs.range.start.to_offset(snapshot))
         .then_with(|| {
             lhs.range
                 .end
-                .to_offset(&snapshot)
+                .to_offset(snapshot)
                 .cmp(&rhs.range.end.to_offset(snapshot))
         })
         .then_with(|| lhs.diagnostic.message.cmp(&rhs.diagnostic.message))
@@ -873,7 +871,7 @@ mod tests {
             ProjectDiagnosticsEditor::new(project.clone(), workspace.downgrade(), cx)
         });
 
-        view.next_notification(&cx).await;
+        view.next_notification(cx).await;
         view.update(cx, |view, cx| {
             assert_eq!(
                 editor_blocks(&view.editor, cx),
@@ -960,7 +958,7 @@ mod tests {
             project.disk_based_diagnostics_finished(0, cx);
         });
 
-        view.next_notification(&cx).await;
+        view.next_notification(cx).await;
         view.update(cx, |view, cx| {
             assert_eq!(
                 editor_blocks(&view.editor, cx),
@@ -1074,7 +1072,7 @@ mod tests {
             project.disk_based_diagnostics_finished(0, cx);
         });
 
-        view.next_notification(&cx).await;
+        view.next_notification(cx).await;
         view.update(cx, |view, cx| {
             assert_eq!(
                 editor_blocks(&view.editor, cx),

crates/editor/src/display_map.rs ๐Ÿ”—

@@ -253,7 +253,7 @@ impl DisplaySnapshot {
         self.buffer_snapshot.len() == 0
     }
 
-    pub fn buffer_rows<'a>(&'a self, start_row: u32) -> DisplayBufferRows<'a> {
+    pub fn buffer_rows(&self, start_row: u32) -> DisplayBufferRows {
         self.blocks_snapshot.buffer_rows(start_row)
     }
 
@@ -313,7 +313,7 @@ impl DisplaySnapshot {
     fn point_to_display_point(&self, point: Point, bias: Bias) -> DisplayPoint {
         let fold_point = self.folds_snapshot.to_fold_point(point, bias);
         let tab_point = self.tabs_snapshot.to_tab_point(fold_point);
-        let wrap_point = self.wraps_snapshot.from_tab_point(tab_point);
+        let wrap_point = self.wraps_snapshot.tab_point_to_wrap_point(tab_point);
         let block_point = self.blocks_snapshot.to_block_point(wrap_point);
         DisplayPoint(block_point)
     }
@@ -336,16 +336,12 @@ impl DisplaySnapshot {
             .map(|h| h.text)
     }
 
-    pub fn chunks<'a>(
-        &'a self,
-        display_rows: Range<u32>,
-        language_aware: bool,
-    ) -> DisplayChunks<'a> {
+    pub fn chunks(&self, display_rows: Range<u32>, language_aware: bool) -> DisplayChunks<'_> {
         self.blocks_snapshot
             .chunks(display_rows, language_aware, Some(&self.text_highlights))
     }
 
-    pub fn chars_at<'a>(&'a self, point: DisplayPoint) -> impl Iterator<Item = char> + 'a {
+    pub fn chars_at(&self, point: DisplayPoint) -> impl Iterator<Item = char> + '_ {
         let mut column = 0;
         let mut chars = self.text_chunks(point.row()).flat_map(str::chars);
         while column < point.column() {
@@ -372,15 +368,15 @@ impl DisplaySnapshot {
     }
 
     pub fn column_from_chars(&self, display_row: u32, char_count: u32) -> u32 {
-        let mut count = 0;
         let mut column = 0;
-        for c in self.chars_at(DisplayPoint::new(display_row, 0)) {
-            if c == '\n' || count >= char_count {
+
+        for (count, c) in self.chars_at(DisplayPoint::new(display_row, 0)).enumerate() {
+            if c == '\n' || count >= char_count as usize {
                 break;
             }
-            count += 1;
             column += c.len_utf8() as u32;
         }
+
         column
     }
 
@@ -401,20 +397,17 @@ impl DisplaySnapshot {
         DisplayPoint(point)
     }
 
-    pub fn folds_in_range<'a, T>(
-        &'a self,
-        range: Range<T>,
-    ) -> impl Iterator<Item = &'a Range<Anchor>>
+    pub fn folds_in_range<T>(&self, range: Range<T>) -> impl Iterator<Item = &Range<Anchor>>
     where
         T: ToOffset,
     {
         self.folds_snapshot.folds_in_range(range)
     }
 
-    pub fn blocks_in_range<'a>(
-        &'a self,
+    pub fn blocks_in_range(
+        &self,
         rows: Range<u32>,
-    ) -> impl Iterator<Item = (u32, &'a TransformBlock)> {
+    ) -> impl Iterator<Item = (u32, &TransformBlock)> {
         self.blocks_snapshot.blocks_in_range(rows)
     }
 
@@ -1015,7 +1008,7 @@ pub mod tests {
         });
 
         let buffer = cx.add_model(|cx| Buffer::new(0, text, cx).with_language(language, cx));
-        buffer.condition(&cx, |buf, _| !buf.is_parsing()).await;
+        buffer.condition(cx, |buf, _| !buf.is_parsing()).await;
         let buffer = cx.add_model(|cx| MultiBuffer::singleton(buffer, cx));
 
         let font_cache = cx.font_cache();
@@ -1102,7 +1095,7 @@ pub mod tests {
         cx.update(|cx| cx.set_global(Settings::test(cx)));
 
         let buffer = cx.add_model(|cx| Buffer::new(0, text, cx).with_language(language, cx));
-        buffer.condition(&cx, |buf, _| !buf.is_parsing()).await;
+        buffer.condition(cx, |buf, _| !buf.is_parsing()).await;
         let buffer = cx.add_model(|cx| MultiBuffer::singleton(buffer, cx));
 
         let font_cache = cx.font_cache();
@@ -1173,7 +1166,7 @@ pub mod tests {
         let (text, highlighted_ranges) = marked_text_ranges(r#"constห‡ ยซaยป: B = "c ยซdยป""#, false);
 
         let buffer = cx.add_model(|cx| Buffer::new(0, text, cx).with_language(language, cx));
-        buffer.condition(&cx, |buf, _| !buf.is_parsing()).await;
+        buffer.condition(cx, |buf, _| !buf.is_parsing()).await;
 
         let buffer = cx.add_model(|cx| MultiBuffer::singleton(buffer, cx));
         let buffer_snapshot = buffer.read_with(cx, |buffer, cx| buffer.snapshot(cx));

crates/editor/src/display_map/block_map.rs ๐Ÿ”—

@@ -20,7 +20,7 @@ use std::{
 use sum_tree::{Bias, SumTree};
 use text::{Edit, Point};
 
-const NEWLINES: &'static [u8] = &[b'\n'; u8::MAX as usize];
+const NEWLINES: &[u8] = &[b'\n'; u8::MAX as usize];
 
 pub struct BlockMap {
     next_block_id: AtomicUsize,
@@ -102,6 +102,7 @@ struct Transform {
     block: Option<TransformBlock>,
 }
 
+#[allow(clippy::large_enum_variant)]
 #[derive(Clone)]
 pub enum TransformBlock {
     Custom(Arc<Block>),
@@ -317,7 +318,7 @@ impl BlockMap {
             let start_block_ix = match self.blocks[last_block_ix..].binary_search_by(|probe| {
                 probe
                     .position
-                    .to_point(&buffer)
+                    .to_point(buffer)
                     .cmp(&new_buffer_start)
                     .then(Ordering::Greater)
             }) {
@@ -335,7 +336,7 @@ impl BlockMap {
                 match self.blocks[start_block_ix..].binary_search_by(|probe| {
                     probe
                         .position
-                        .to_point(&buffer)
+                        .to_point(buffer)
                         .cmp(&new_buffer_end)
                         .then(Ordering::Greater)
                 }) {
@@ -349,14 +350,14 @@ impl BlockMap {
                 self.blocks[start_block_ix..end_block_ix]
                     .iter()
                     .map(|block| {
-                        let mut position = block.position.to_point(&buffer);
+                        let mut position = block.position.to_point(buffer);
                         match block.disposition {
                             BlockDisposition::Above => position.column = 0,
                             BlockDisposition::Below => {
                                 position.column = buffer.line_len(position.row)
                             }
                         }
-                        let position = wrap_snapshot.from_point(position, Bias::Left);
+                        let position = wrap_snapshot.make_wrap_point(position, Bias::Left);
                         (position.row(), TransformBlock::Custom(block.clone()))
                     }),
             );
@@ -366,7 +367,7 @@ impl BlockMap {
                     .map(|excerpt_boundary| {
                         (
                             wrap_snapshot
-                                .from_point(Point::new(excerpt_boundary.row, 0), Bias::Left)
+                                .make_wrap_point(Point::new(excerpt_boundary.row, 0), Bias::Left)
                                 .row(),
                             TransformBlock::ExcerptHeader {
                                 key: excerpt_boundary.key,
@@ -385,7 +386,7 @@ impl BlockMap {
 
             // Place excerpt headers above custom blocks on the same row.
             blocks_in_edit.sort_unstable_by(|(row_a, block_a), (row_b, block_b)| {
-                row_a.cmp(&row_b).then_with(|| match (block_a, block_b) {
+                row_a.cmp(row_b).then_with(|| match (block_a, block_b) {
                     (
                         TransformBlock::ExcerptHeader { .. },
                         TransformBlock::ExcerptHeader { .. },
@@ -498,9 +499,9 @@ impl<'a> BlockMapWriter<'a> {
             ids.push(id);
 
             let position = block.position;
-            let point = position.to_point(&buffer);
+            let point = position.to_point(buffer);
             let wrap_row = wrap_snapshot
-                .from_point(Point::new(point.row, 0), Bias::Left)
+                .make_wrap_point(Point::new(point.row, 0), Bias::Left)
                 .row();
             let start_row = wrap_snapshot.prev_row_boundary(WrapPoint::new(wrap_row, 0));
             let end_row = wrap_snapshot
@@ -510,7 +511,7 @@ impl<'a> BlockMapWriter<'a> {
             let block_ix = match self
                 .0
                 .blocks
-                .binary_search_by(|probe| probe.position.cmp(&position, &buffer))
+                .binary_search_by(|probe| probe.position.cmp(&position, buffer))
             {
                 Ok(ix) | Err(ix) => ix,
             };
@@ -543,11 +544,11 @@ impl<'a> BlockMapWriter<'a> {
         let mut last_block_buffer_row = None;
         self.0.blocks.retain(|block| {
             if block_ids.contains(&block.id) {
-                let buffer_row = block.position.to_point(&buffer).row;
+                let buffer_row = block.position.to_point(buffer).row;
                 if last_block_buffer_row != Some(buffer_row) {
                     last_block_buffer_row = Some(buffer_row);
                     let wrap_row = wrap_snapshot
-                        .from_point(Point::new(buffer_row, 0), Bias::Left)
+                        .make_wrap_point(Point::new(buffer_row, 0), Bias::Left)
                         .row();
                     let start_row = wrap_snapshot.prev_row_boundary(WrapPoint::new(wrap_row, 0));
                     let end_row = wrap_snapshot
@@ -620,7 +621,7 @@ impl BlockSnapshot {
         }
     }
 
-    pub fn buffer_rows<'a>(&'a self, start_row: u32) -> BlockBufferRows<'a> {
+    pub fn buffer_rows(&self, start_row: u32) -> BlockBufferRows {
         let mut cursor = self.transforms.cursor::<(BlockRow, WrapRow)>();
         cursor.seek(&BlockRow(start_row), Bias::Right, &());
         let (output_start, input_start) = cursor.start();
@@ -638,10 +639,10 @@ impl BlockSnapshot {
         }
     }
 
-    pub fn blocks_in_range<'a>(
-        &'a self,
+    pub fn blocks_in_range(
+        &self,
         rows: Range<u32>,
-    ) -> impl Iterator<Item = (u32, &'a TransformBlock)> {
+    ) -> impl Iterator<Item = (u32, &TransformBlock)> {
         let mut cursor = self.transforms.cursor::<BlockRow>();
         cursor.seek(&BlockRow(rows.start), Bias::Right, &());
         std::iter::from_fn(move || {
@@ -1025,7 +1026,7 @@ mod tests {
         let buffer_snapshot = buffer.read(cx).snapshot(cx);
         let subscription = buffer.update(cx, |buffer, _| buffer.subscribe());
         let (fold_map, folds_snapshot) = FoldMap::new(buffer_snapshot.clone());
-        let (tab_map, tabs_snapshot) = TabMap::new(folds_snapshot.clone(), 1.try_into().unwrap());
+        let (tab_map, tabs_snapshot) = TabMap::new(folds_snapshot, 1.try_into().unwrap());
         let (wrap_map, wraps_snapshot) = WrapMap::new(tabs_snapshot, font_id, 14.0, None, cx);
         let mut block_map = BlockMap::new(wraps_snapshot.clone(), 1, 1);
 
@@ -1194,7 +1195,7 @@ mod tests {
         let buffer = MultiBuffer::build_simple(text, cx);
         let buffer_snapshot = buffer.read(cx).snapshot(cx);
         let (_, folds_snapshot) = FoldMap::new(buffer_snapshot.clone());
-        let (_, tabs_snapshot) = TabMap::new(folds_snapshot.clone(), 1.try_into().unwrap());
+        let (_, tabs_snapshot) = TabMap::new(folds_snapshot, 1.try_into().unwrap());
         let (_, wraps_snapshot) = WrapMap::new(tabs_snapshot, font_id, 14.0, Some(60.), cx);
         let mut block_map = BlockMap::new(wraps_snapshot.clone(), 1, 1);
 
@@ -1262,11 +1263,11 @@ mod tests {
 
         let mut buffer_snapshot = buffer.read(cx).snapshot(cx);
         let (fold_map, folds_snapshot) = FoldMap::new(buffer_snapshot.clone());
-        let (tab_map, tabs_snapshot) = TabMap::new(folds_snapshot.clone(), tab_size);
+        let (tab_map, tabs_snapshot) = TabMap::new(folds_snapshot, tab_size);
         let (wrap_map, wraps_snapshot) =
             WrapMap::new(tabs_snapshot, font_id, font_size, wrap_width, cx);
         let mut block_map = BlockMap::new(
-            wraps_snapshot.clone(),
+            wraps_snapshot,
             buffer_start_header_height,
             excerpt_header_height,
         );
@@ -1383,7 +1384,7 @@ mod tests {
                         position.column = buffer_snapshot.line_len(position.row);
                     }
                 };
-                let row = wraps_snapshot.from_point(position, Bias::Left).row();
+                let row = wraps_snapshot.make_wrap_point(position, Bias::Left).row();
                 (
                     row,
                     ExpectedBlock::Custom {
@@ -1396,7 +1397,7 @@ mod tests {
             expected_blocks.extend(buffer_snapshot.excerpt_boundaries_in_range(0..).map(
                 |boundary| {
                     let position =
-                        wraps_snapshot.from_point(Point::new(boundary.row, 0), Bias::Left);
+                        wraps_snapshot.make_wrap_point(Point::new(boundary.row, 0), Bias::Left);
                     (
                         position.row(),
                         ExpectedBlock::ExcerptHeader {

crates/editor/src/display_map/fold_map.rs ๐Ÿ”—

@@ -41,27 +41,27 @@ impl FoldPoint {
         &mut self.0.column
     }
 
-    pub fn to_buffer_point(&self, snapshot: &FoldSnapshot) -> Point {
+    pub fn to_buffer_point(self, snapshot: &FoldSnapshot) -> Point {
         let mut cursor = snapshot.transforms.cursor::<(FoldPoint, Point)>();
-        cursor.seek(self, Bias::Right, &());
+        cursor.seek(&self, Bias::Right, &());
         let overshoot = self.0 - cursor.start().0 .0;
         cursor.start().1 + overshoot
     }
 
-    pub fn to_buffer_offset(&self, snapshot: &FoldSnapshot) -> usize {
+    pub fn to_buffer_offset(self, snapshot: &FoldSnapshot) -> usize {
         let mut cursor = snapshot.transforms.cursor::<(FoldPoint, Point)>();
-        cursor.seek(self, Bias::Right, &());
+        cursor.seek(&self, Bias::Right, &());
         let overshoot = self.0 - cursor.start().0 .0;
         snapshot
             .buffer_snapshot
             .point_to_offset(cursor.start().1 + overshoot)
     }
 
-    pub fn to_offset(&self, snapshot: &FoldSnapshot) -> FoldOffset {
+    pub fn to_offset(self, snapshot: &FoldSnapshot) -> FoldOffset {
         let mut cursor = snapshot
             .transforms
             .cursor::<(FoldPoint, TransformSummary)>();
-        cursor.seek(self, Bias::Right, &());
+        cursor.seek(&self, Bias::Right, &());
         let overshoot = self.0 - cursor.start().1.output.lines;
         let mut offset = cursor.start().1.output.len;
         if !overshoot.is_zero() {
@@ -600,10 +600,7 @@ impl FoldSnapshot {
         self.transforms.summary().output.longest_row
     }
 
-    pub fn folds_in_range<'a, T>(
-        &'a self,
-        range: Range<T>,
-    ) -> impl Iterator<Item = &'a Range<Anchor>>
+    pub fn folds_in_range<T>(&self, range: Range<T>) -> impl Iterator<Item = &Range<Anchor>>
     where
         T: ToOffset,
     {
@@ -689,7 +686,7 @@ impl FoldSnapshot {
                             let ranges = &highlights.1;
 
                             let start_ix = match ranges.binary_search_by(|probe| {
-                                let cmp = probe.end.cmp(&transform_start, &self.buffer_snapshot());
+                                let cmp = probe.end.cmp(&transform_start, self.buffer_snapshot());
                                 if cmp.is_gt() {
                                     Ordering::Greater
                                 } else {
@@ -1040,11 +1037,7 @@ impl<'a> Iterator for FoldChunks<'a> {
             return None;
         }
 
-        let transform = if let Some(item) = self.transform_cursor.item() {
-            item
-        } else {
-            return None;
-        };
+        let transform = self.transform_cursor.item()?;
 
         // If we're in a fold, then return the fold's display text and
         // advance the transform and buffer cursors to the end of the fold.
@@ -1150,11 +1143,11 @@ impl Ord for HighlightEndpoint {
 pub struct FoldOffset(pub usize);
 
 impl FoldOffset {
-    pub fn to_point(&self, snapshot: &FoldSnapshot) -> FoldPoint {
+    pub fn to_point(self, snapshot: &FoldSnapshot) -> FoldPoint {
         let mut cursor = snapshot
             .transforms
             .cursor::<(FoldOffset, TransformSummary)>();
-        cursor.seek(self, Bias::Right, &());
+        cursor.seek(&self, Bias::Right, &());
         let overshoot = if cursor.item().map_or(true, |t| t.is_fold()) {
             Point::new(0, (self.0 - cursor.start().0 .0) as u32)
         } else {
@@ -1214,7 +1207,7 @@ mod tests {
         let buffer_snapshot = buffer.read(cx).snapshot(cx);
         let mut map = FoldMap::new(buffer_snapshot.clone()).0;
 
-        let (mut writer, _, _) = map.write(buffer_snapshot.clone(), vec![]);
+        let (mut writer, _, _) = map.write(buffer_snapshot, vec![]);
         let (snapshot2, edits) = writer.fold(vec![
             Point::new(0, 2)..Point::new(2, 2),
             Point::new(2, 4)..Point::new(4, 1),
@@ -1245,8 +1238,7 @@ mod tests {
             );
             buffer.snapshot(cx)
         });
-        let (snapshot3, edits) =
-            map.read(buffer_snapshot.clone(), subscription.consume().into_inner());
+        let (snapshot3, edits) = map.read(buffer_snapshot, subscription.consume().into_inner());
         assert_eq!(snapshot3.text(), "123aโ€ฆc123cโ€ฆeeeee");
         assert_eq!(
             edits,
@@ -1276,7 +1268,7 @@ mod tests {
 
         let (mut writer, _, _) = map.write(buffer_snapshot.clone(), vec![]);
         writer.unfold(Some(Point::new(0, 4)..Point::new(0, 4)), true);
-        let (snapshot6, _) = map.read(buffer_snapshot.clone(), vec![]);
+        let (snapshot6, _) = map.read(buffer_snapshot, vec![]);
         assert_eq!(snapshot6.text(), "123aaaaa\nbbbbbb\nccc123456eee");
     }
 
@@ -1314,7 +1306,7 @@ mod tests {
             // Create two adjacent folds.
             let (mut writer, _, _) = map.write(buffer_snapshot.clone(), vec![]);
             writer.fold(vec![0..2, 2..5]);
-            let (snapshot, _) = map.read(buffer_snapshot.clone(), vec![]);
+            let (snapshot, _) = map.read(buffer_snapshot, vec![]);
             assert_eq!(snapshot.text(), "โ€ฆfghijkl");
 
             // Edit within one of the folds.
@@ -1322,8 +1314,7 @@ mod tests {
                 buffer.edit([(0..1, "12345")], None, cx);
                 buffer.snapshot(cx)
             });
-            let (snapshot, _) =
-                map.read(buffer_snapshot.clone(), subscription.consume().into_inner());
+            let (snapshot, _) = map.read(buffer_snapshot, subscription.consume().into_inner());
             assert_eq!(snapshot.text(), "12345โ€ฆfghijkl");
         }
     }
@@ -1340,7 +1331,7 @@ mod tests {
             Point::new(1, 2)..Point::new(3, 2),
             Point::new(3, 1)..Point::new(4, 1),
         ]);
-        let (snapshot, _) = map.read(buffer_snapshot.clone(), vec![]);
+        let (snapshot, _) = map.read(buffer_snapshot, vec![]);
         assert_eq!(snapshot.text(), "aaโ€ฆeeeee");
     }
 
@@ -1357,14 +1348,14 @@ mod tests {
             Point::new(0, 2)..Point::new(2, 2),
             Point::new(3, 1)..Point::new(4, 1),
         ]);
-        let (snapshot, _) = map.read(buffer_snapshot.clone(), vec![]);
+        let (snapshot, _) = map.read(buffer_snapshot, vec![]);
         assert_eq!(snapshot.text(), "aaโ€ฆcccc\ndโ€ฆeeeee");
 
         let buffer_snapshot = buffer.update(cx, |buffer, cx| {
             buffer.edit([(Point::new(2, 2)..Point::new(3, 1), "")], None, cx);
             buffer.snapshot(cx)
         });
-        let (snapshot, _) = map.read(buffer_snapshot.clone(), subscription.consume().into_inner());
+        let (snapshot, _) = map.read(buffer_snapshot, subscription.consume().into_inner());
         assert_eq!(snapshot.text(), "aaโ€ฆeeeee");
     }
 
@@ -1661,7 +1652,7 @@ mod tests {
             Point::new(3, 1)..Point::new(4, 1),
         ]);
 
-        let (snapshot, _) = map.read(buffer_snapshot.clone(), vec![]);
+        let (snapshot, _) = map.read(buffer_snapshot, vec![]);
         assert_eq!(snapshot.text(), "aaโ€ฆcccc\ndโ€ฆeeeee\nffffff\n");
         assert_eq!(
             snapshot.buffer_rows(0).collect::<Vec<_>>(),

crates/editor/src/display_map/tab_map.rs ๐Ÿ”—

@@ -253,7 +253,7 @@ impl TabSnapshot {
         )
     }
 
-    pub fn from_point(&self, point: Point, bias: Bias) -> TabPoint {
+    pub fn make_tab_point(&self, point: Point, bias: Bias) -> TabPoint {
         self.to_tab_point(self.fold_snapshot.to_fold_point(point, bias))
     }
 
@@ -290,7 +290,7 @@ impl TabSnapshot {
     }
 
     fn collapse_tabs(
-        mut chars: impl Iterator<Item = char>,
+        chars: impl Iterator<Item = char>,
         column: usize,
         bias: Bias,
         tab_size: NonZeroU32,
@@ -298,7 +298,7 @@ impl TabSnapshot {
         let mut expanded_bytes = 0;
         let mut expanded_chars = 0;
         let mut collapsed_bytes = 0;
-        while let Some(c) = chars.next() {
+        for c in chars {
             if expanded_bytes >= column {
                 break;
             }
@@ -410,7 +410,7 @@ impl<'a> std::ops::AddAssign<&'a Self> for TextSummary {
 }
 
 // Handles a tab width <= 16
-const SPACES: &'static str = "                ";
+const SPACES: &str = "                ";
 
 pub struct TabChunks<'a> {
     fold_chunks: fold_map::FoldChunks<'a>,
@@ -518,7 +518,7 @@ mod tests {
 
         let (mut fold_map, _) = FoldMap::new(buffer_snapshot.clone());
         fold_map.randomly_mutate(&mut rng);
-        let (folds_snapshot, _) = fold_map.read(buffer_snapshot.clone(), vec![]);
+        let (folds_snapshot, _) = fold_map.read(buffer_snapshot, vec![]);
         log::info!("FoldMap text: {:?}", folds_snapshot.text());
 
         let (_, tabs_snapshot) = TabMap::new(folds_snapshot.clone(), tab_size);

crates/editor/src/display_map/wrap_map.rs ๐Ÿ”—

@@ -285,7 +285,7 @@ impl WrapMap {
             if tab_snapshot.version <= self.snapshot.tab_snapshot.version {
                 to_remove_len += 1;
             } else {
-                let interpolated_edits = self.snapshot.interpolate(tab_snapshot.clone(), &edits);
+                let interpolated_edits = self.snapshot.interpolate(tab_snapshot.clone(), edits);
                 self.edits_since_sync = self.edits_since_sync.compose(&interpolated_edits);
                 self.interpolated_edits = self.interpolated_edits.compose(&interpolated_edits);
             }
@@ -394,7 +394,7 @@ impl WrapSnapshot {
             new_rows: Range<u32>,
         }
 
-        let mut tab_edits_iter = tab_edits.into_iter().peekable();
+        let mut tab_edits_iter = tab_edits.iter().peekable();
         let mut row_edits = Vec::new();
         while let Some(edit) = tab_edits_iter.next() {
             let mut row_edit = RowEdit {
@@ -671,11 +671,11 @@ impl WrapSnapshot {
         self.tab_snapshot.to_point(self.to_tab_point(point), bias)
     }
 
-    pub fn from_point(&self, point: Point, bias: Bias) -> WrapPoint {
-        self.from_tab_point(self.tab_snapshot.from_point(point, bias))
+    pub fn make_wrap_point(&self, point: Point, bias: Bias) -> WrapPoint {
+        self.tab_point_to_wrap_point(self.tab_snapshot.make_tab_point(point, bias))
     }
 
-    pub fn from_tab_point(&self, point: TabPoint) -> WrapPoint {
+    pub fn tab_point_to_wrap_point(&self, point: TabPoint) -> WrapPoint {
         let mut cursor = self.transforms.cursor::<(TabPoint, WrapPoint)>();
         cursor.seek(&point, Bias::Right, &());
         WrapPoint(cursor.start().1 .0 + (point.0 - cursor.start().0 .0))
@@ -691,7 +691,7 @@ impl WrapSnapshot {
             }
         }
 
-        self.from_tab_point(self.tab_snapshot.clip_point(self.to_tab_point(point), bias))
+        self.tab_point_to_wrap_point(self.tab_snapshot.clip_point(self.to_tab_point(point), bias))
     }
 
     pub fn prev_row_boundary(&self, mut point: WrapPoint) -> u32 {
@@ -1301,7 +1301,7 @@ mod tests {
                 end_row += 1;
 
                 let mut expected_text = self.text_chunks(start_row).collect::<String>();
-                if expected_text.ends_with("\n") {
+                if expected_text.ends_with('\n') {
                     expected_text.push('\n');
                 }
                 let mut expected_text = expected_text

crates/editor/src/editor.rs ๐Ÿ”—

@@ -425,6 +425,7 @@ pub struct Editor {
     vertical_scroll_margin: f32,
     placeholder_text: Option<Arc<str>>,
     highlighted_rows: Option<Range<u32>>,
+    #[allow(clippy::type_complexity)]
     background_highlights: BTreeMap<TypeId, (fn(&Theme) -> Color, Vec<Range<Anchor>>)>,
     nav_history: Option<ItemNavHistory>,
     context_menu: Option<ContextMenu>,
@@ -475,6 +476,7 @@ impl Default for SelectionHistoryMode {
 
 #[derive(Default)]
 struct SelectionHistory {
+    #[allow(clippy::type_complexity)]
     selections_by_transaction:
         HashMap<TransactionId, (Arc<[Selection<Anchor>]>, Option<Arc<[Selection<Anchor>]>>)>,
     mode: SelectionHistoryMode,
@@ -492,6 +494,7 @@ impl SelectionHistory {
             .insert(transaction_id, (selections, None));
     }
 
+    #[allow(clippy::type_complexity)]
     fn transaction(
         &self,
         transaction_id: TransactionId,
@@ -499,6 +502,7 @@ impl SelectionHistory {
         self.selections_by_transaction.get(&transaction_id)
     }
 
+    #[allow(clippy::type_complexity)]
     fn transaction_mut(
         &mut self,
         transaction_id: TransactionId,
@@ -1023,7 +1027,7 @@ impl Editor {
             background_highlights: Default::default(),
             nav_history: None,
             context_menu: None,
-            mouse_context_menu: cx.add_view(|cx| context_menu::ContextMenu::new(cx)),
+            mouse_context_menu: cx.add_view(context_menu::ContextMenu::new),
             completion_tasks: Default::default(),
             next_completion_id: 0,
             available_code_actions: Default::default(),
@@ -1649,7 +1653,7 @@ impl Editor {
         if let Some(tail) = self.columnar_selection_tail.as_ref() {
             let tail = tail.to_display_point(&display_map);
             self.select_columns(tail, position, goal_column, &display_map, cx);
-        } else if let Some(mut pending) = self.selections.pending_anchor().clone() {
+        } else if let Some(mut pending) = self.selections.pending_anchor() {
             let buffer = self.buffer.read(cx).snapshot(cx);
             let head;
             let tail;
@@ -1764,10 +1768,10 @@ impl Editor {
                 if start_column <= display_map.line_len(row) && !display_map.is_block_line(row) {
                     let start = display_map
                         .clip_point(DisplayPoint::new(row, start_column), Bias::Left)
-                        .to_point(&display_map);
+                        .to_point(display_map);
                     let end = display_map
                         .clip_point(DisplayPoint::new(row, end_column), Bias::Right)
-                        .to_point(&display_map);
+                        .to_point(display_map);
                     if reversed {
                         Some(end..start)
                     } else {
@@ -1915,7 +1919,7 @@ impl Editor {
                         cursor.row -= 1;
                         cursor.column = buffer.line_len(cursor.row);
                     }
-                    new_selection.map(|_| cursor.clone())
+                    new_selection.map(|_| cursor)
                 })
                 .collect();
 
@@ -2279,7 +2283,7 @@ impl Editor {
 
         let query = Self::completion_query(&self.buffer.read(cx).read(cx), position.clone());
         let completions = project.update(cx, |project, cx| {
-            project.completions(&buffer, buffer_position.clone(), cx)
+            project.completions(&buffer, buffer_position, cx)
         });
 
         let id = post_inc(&mut self.next_completion_id);
@@ -2369,7 +2373,7 @@ impl Editor {
         };
         let selections = self.selections.all::<usize>(cx);
         let buffer = buffer_handle.read(cx);
-        let old_range = completion.old_range.to_offset(&buffer);
+        let old_range = completion.old_range.to_offset(buffer);
         let old_text = buffer.text_for_range(old_range.clone()).collect::<String>();
 
         let newest_selection = self.selections.newest_anchor();
@@ -2807,7 +2811,7 @@ impl Editor {
                     let mut tabstop_ranges = tabstop
                         .iter()
                         .flat_map(|tabstop_range| {
-                            let mut delta = 0 as isize;
+                            let mut delta = 0_isize;
                             insertion_ranges.iter().map(move |insertion_range| {
                                 let insertion_start = insertion_range.start as isize + delta;
                                 delta +=
@@ -2871,7 +2875,7 @@ impl Editor {
             }
             if let Some(current_ranges) = snippet.ranges.get(snippet.active_index) {
                 self.change_selections(Some(Autoscroll::Fit), cx, |s| {
-                    s.select_anchor_ranges(current_ranges.into_iter().cloned())
+                    s.select_anchor_ranges(current_ranges.iter().cloned())
                 });
                 // If snippet state is not at the last tabstop, push it back on the stack
                 if snippet.active_index + 1 < snippet.ranges.len() {
@@ -2953,7 +2957,7 @@ impl Editor {
                     }
                 })
             });
-            this.insert(&"", cx);
+            this.insert("", cx);
         });
     }
 
@@ -3220,13 +3224,13 @@ impl Editor {
             }
 
             let buffer = &display_map.buffer_snapshot;
-            let mut edit_start = Point::new(rows.start, 0).to_offset(&buffer);
+            let mut edit_start = Point::new(rows.start, 0).to_offset(buffer);
             let edit_end;
             let cursor_buffer_row;
             if buffer.max_point().row >= rows.end {
                 // If there's a line after the range, delete the \n from the end of the row range
                 // and position the cursor on the next line.
-                edit_end = Point::new(rows.end, 0).to_offset(&buffer);
+                edit_end = Point::new(rows.end, 0).to_offset(buffer);
                 cursor_buffer_row = rows.end;
             } else {
                 // If there isn't a line after the range, delete the \n from the line before the
@@ -3292,7 +3296,7 @@ impl Editor {
 
             while let Some(next_selection) = selections_iter.peek() {
                 let next_rows = next_selection.spanned_rows(false, &display_map);
-                if next_rows.start <= rows.end - 1 {
+                if next_rows.start < rows.end {
                     rows.end = next_rows.end;
                     selections_iter.next().unwrap();
                 } else {
@@ -3414,7 +3418,7 @@ impl Editor {
             }
 
             // If we didn't move line(s), preserve the existing selections
-            new_selections.extend(contiguous_row_selections.drain(..));
+            new_selections.append(&mut contiguous_row_selections);
         }
 
         self.transact(cx, |this, cx| {
@@ -3519,7 +3523,7 @@ impl Editor {
             }
 
             // If we didn't move line(s), preserve the existing selections
-            new_selections.extend(contiguous_row_selections.drain(..));
+            new_selections.append(&mut contiguous_row_selections);
         }
 
         self.transact(cx, |this, cx| {
@@ -3831,7 +3835,7 @@ impl Editor {
                 if !selection.is_empty() && !line_mode {
                     selection.goal = SelectionGoal::None;
                 }
-                let (cursor, goal) = movement::up(&map, selection.start, selection.goal, false);
+                let (cursor, goal) = movement::up(map, selection.start, selection.goal, false);
                 selection.collapse_to(cursor, goal);
             });
         })
@@ -3863,7 +3867,7 @@ impl Editor {
                 if !selection.is_empty() && !line_mode {
                     selection.goal = SelectionGoal::None;
                 }
-                let (cursor, goal) = movement::down(&map, selection.end, selection.goal, false);
+                let (cursor, goal) = movement::down(map, selection.end, selection.goal, false);
                 selection.collapse_to(cursor, goal);
             });
         });
@@ -4779,12 +4783,10 @@ impl Editor {
                     } else {
                         search_start = buffer.len();
                     }
+                } else if search_start == 0 {
+                    break;
                 } else {
-                    if search_start == 0 {
-                        break;
-                    } else {
-                        search_start = 0;
-                    }
+                    search_start = 0;
                 }
             }
         }
@@ -5107,13 +5109,7 @@ impl Editor {
         })?;
 
         let rename = workspace.project().clone().update(cx, |project, cx| {
-            project.perform_rename(
-                buffer.clone(),
-                range.start.clone(),
-                new_name.clone(),
-                true,
-                cx,
-            )
+            project.perform_rename(buffer.clone(), range.start, new_name.clone(), true, cx)
         });
 
         Some(cx.spawn(|workspace, mut cx| async move {
@@ -5292,7 +5288,7 @@ impl Editor {
 
     fn push_to_selection_history(&mut self) {
         self.selection_history.push(SelectionHistoryEntry {
-            selections: self.selections.disjoint_anchors().clone(),
+            selections: self.selections.disjoint_anchors(),
             select_next_state: self.select_next_state.clone(),
             add_selections_state: self.add_selections_state.clone(),
         });
@@ -5325,7 +5321,7 @@ impl Editor {
             .update(cx, |buffer, cx| buffer.start_transaction_at(now, cx))
         {
             self.selection_history
-                .insert_transaction(tx_id, self.selections.disjoint_anchors().clone());
+                .insert_transaction(tx_id, self.selections.disjoint_anchors());
         }
     }
 
@@ -5339,7 +5335,7 @@ impl Editor {
             .update(cx, |buffer, cx| buffer.end_transaction_at(now, cx))
         {
             if let Some((_, end_selections)) = self.selection_history.transaction_mut(tx_id) {
-                *end_selections = Some(self.selections.disjoint_anchors().clone());
+                *end_selections = Some(self.selections.disjoint_anchors());
             } else {
                 log::error!("unexpectedly ended a transaction that wasn't started by this editor");
             }
@@ -5441,7 +5437,7 @@ impl Editor {
         }
 
         let end = end.unwrap_or(max_point);
-        return start.to_point(display_map)..end.to_point(display_map);
+        start.to_point(display_map)..end.to_point(display_map)
     }
 
     pub fn fold_selected_ranges(&mut self, _: &FoldSelectedRanges, cx: &mut ViewContext<Self>) {
@@ -5588,6 +5584,7 @@ impl Editor {
         cx.notify();
     }
 
+    #[allow(clippy::type_complexity)]
     pub fn clear_background_highlights<T: 'static>(
         &mut self,
         cx: &mut ViewContext<Self>,
@@ -5629,7 +5626,7 @@ impl Editor {
             .chain(write_highlights)
             .flat_map(move |ranges| {
                 let start_ix = match ranges.binary_search_by(|probe| {
-                    let cmp = probe.end.cmp(&left_position, &buffer);
+                    let cmp = probe.end.cmp(&left_position, buffer);
                     if cmp.is_ge() {
                         Ordering::Greater
                     } else {
@@ -5642,7 +5639,7 @@ impl Editor {
                 let right_position = right_position.clone();
                 ranges[start_ix..]
                     .iter()
-                    .take_while(move |range| range.start.cmp(&right_position, &buffer).is_le())
+                    .take_while(move |range| range.start.cmp(&right_position, buffer).is_le())
             })
     }
 
@@ -5657,7 +5654,7 @@ impl Editor {
         for (color_fetcher, ranges) in self.background_highlights.values() {
             let color = color_fetcher(theme);
             let start_ix = match ranges.binary_search_by(|probe| {
-                let cmp = probe.end.cmp(&search_range.start, &buffer);
+                let cmp = probe.end.cmp(&search_range.start, buffer);
                 if cmp.is_gt() {
                     Ordering::Greater
                 } else {
@@ -5667,7 +5664,7 @@ impl Editor {
                 Ok(i) | Err(i) => i,
             };
             for range in &ranges[start_ix..] {
-                if range.start.cmp(&search_range.end, &buffer).is_ge() {
+                if range.start.cmp(&search_range.end, buffer).is_ge() {
                     break;
                 }
                 let start = range
@@ -5899,7 +5896,7 @@ impl Editor {
         let (_, ranges) = self.text_highlights::<InputComposition>(cx)?;
         Some(
             ranges
-                .into_iter()
+                .iter()
                 .map(move |range| {
                     range.start.to_offset_utf16(&snapshot)..range.end.to_offset_utf16(&snapshot)
                 })
@@ -6138,10 +6135,8 @@ impl View for Editor {
             let new_selected_ranges = if let Some(range_utf16) = range_utf16 {
                 let range_utf16 = OffsetUtf16(range_utf16.start)..OffsetUtf16(range_utf16.end);
                 Some(this.selection_replacement_ranges(range_utf16, cx))
-            } else if let Some(marked_ranges) = this.marked_text_ranges(cx) {
-                Some(marked_ranges)
             } else {
-                None
+                this.marked_text_ranges(cx)
             };
 
             if let Some(new_selected_ranges) = new_selected_ranges {
@@ -6202,7 +6197,7 @@ impl View for Editor {
                 let snapshot = this.buffer.read(cx).read(cx);
                 this.selections
                     .disjoint_anchors()
-                    .into_iter()
+                    .iter()
                     .map(|selection| {
                         selection.start.bias_left(&*snapshot)..selection.end.bias_right(&*snapshot)
                     })
@@ -6385,9 +6380,9 @@ impl<T: InvalidationRegion> InvalidationStack<T> {
                 if selections.len() == region.ranges().len() {
                     selections
                         .iter()
-                        .zip(region.ranges().iter().map(|r| r.to_offset(&buffer)))
+                        .zip(region.ranges().iter().map(|r| r.to_offset(buffer)))
                         .all(|(selection, invalidation_range)| {
-                            let head = selection.head().to_offset(&buffer);
+                            let head = selection.head().to_offset(buffer);
                             invalidation_range.start <= head && invalidation_range.end >= head
                         })
                 } else {
@@ -6602,7 +6597,7 @@ pub fn styled_runs_for_code_label<'a>(
             } else {
                 return Default::default();
             };
-            let mut muted_style = style.clone();
+            let mut muted_style = style;
             muted_style.highlight(fade_out);
 
             let mut runs = SmallVec::<[(Range<usize>, HighlightStyle); 3]>::new();
@@ -7104,7 +7099,7 @@ mod tests {
     fn test_navigation_history(cx: &mut gpui::MutableAppContext) {
         cx.set_global(Settings::test(cx));
         use workspace::Item;
-        let (_, pane) = cx.add_window(Default::default(), |cx| Pane::new(cx));
+        let (_, pane) = cx.add_window(Default::default(), Pane::new);
         let buffer = MultiBuffer::build_simple(&sample_text(300, 5, 'a'), cx);
 
         cx.add_view(&pane, |cx| {
@@ -7194,7 +7189,7 @@ mod tests {
                 Box::new(NavigationData {
                     cursor_anchor: invalid_anchor.clone(),
                     cursor_position: invalid_point,
-                    scroll_top_anchor: invalid_anchor.clone(),
+                    scroll_top_anchor: invalid_anchor,
                     scroll_top_row: invalid_point.row,
                     scroll_position: Default::default(),
                 }),
@@ -8704,98 +8699,102 @@ mod tests {
     fn test_transpose(cx: &mut gpui::MutableAppContext) {
         cx.set_global(Settings::test(cx));
 
-        cx.add_window(Default::default(), |cx| {
-            let mut editor = build_editor(MultiBuffer::build_simple("abc", cx), cx);
+        _ = cx
+            .add_window(Default::default(), |cx| {
+                let mut editor = build_editor(MultiBuffer::build_simple("abc", cx), cx);
 
-            editor.change_selections(None, cx, |s| s.select_ranges([1..1]));
-            editor.transpose(&Default::default(), cx);
-            assert_eq!(editor.text(cx), "bac");
-            assert_eq!(editor.selections.ranges(cx), [2..2]);
+                editor.change_selections(None, cx, |s| s.select_ranges([1..1]));
+                editor.transpose(&Default::default(), cx);
+                assert_eq!(editor.text(cx), "bac");
+                assert_eq!(editor.selections.ranges(cx), [2..2]);
 
-            editor.transpose(&Default::default(), cx);
-            assert_eq!(editor.text(cx), "bca");
-            assert_eq!(editor.selections.ranges(cx), [3..3]);
+                editor.transpose(&Default::default(), cx);
+                assert_eq!(editor.text(cx), "bca");
+                assert_eq!(editor.selections.ranges(cx), [3..3]);
 
-            editor.transpose(&Default::default(), cx);
-            assert_eq!(editor.text(cx), "bac");
-            assert_eq!(editor.selections.ranges(cx), [3..3]);
+                editor.transpose(&Default::default(), cx);
+                assert_eq!(editor.text(cx), "bac");
+                assert_eq!(editor.selections.ranges(cx), [3..3]);
 
-            editor
-        })
-        .1;
+                editor
+            })
+            .1;
 
-        cx.add_window(Default::default(), |cx| {
-            let mut editor = build_editor(MultiBuffer::build_simple("abc\nde", cx), cx);
+        _ = cx
+            .add_window(Default::default(), |cx| {
+                let mut editor = build_editor(MultiBuffer::build_simple("abc\nde", cx), cx);
 
-            editor.change_selections(None, cx, |s| s.select_ranges([3..3]));
-            editor.transpose(&Default::default(), cx);
-            assert_eq!(editor.text(cx), "acb\nde");
-            assert_eq!(editor.selections.ranges(cx), [3..3]);
+                editor.change_selections(None, cx, |s| s.select_ranges([3..3]));
+                editor.transpose(&Default::default(), cx);
+                assert_eq!(editor.text(cx), "acb\nde");
+                assert_eq!(editor.selections.ranges(cx), [3..3]);
 
-            editor.change_selections(None, cx, |s| s.select_ranges([4..4]));
-            editor.transpose(&Default::default(), cx);
-            assert_eq!(editor.text(cx), "acbd\ne");
-            assert_eq!(editor.selections.ranges(cx), [5..5]);
+                editor.change_selections(None, cx, |s| s.select_ranges([4..4]));
+                editor.transpose(&Default::default(), cx);
+                assert_eq!(editor.text(cx), "acbd\ne");
+                assert_eq!(editor.selections.ranges(cx), [5..5]);
 
-            editor.transpose(&Default::default(), cx);
-            assert_eq!(editor.text(cx), "acbde\n");
-            assert_eq!(editor.selections.ranges(cx), [6..6]);
+                editor.transpose(&Default::default(), cx);
+                assert_eq!(editor.text(cx), "acbde\n");
+                assert_eq!(editor.selections.ranges(cx), [6..6]);
 
-            editor.transpose(&Default::default(), cx);
-            assert_eq!(editor.text(cx), "acbd\ne");
-            assert_eq!(editor.selections.ranges(cx), [6..6]);
+                editor.transpose(&Default::default(), cx);
+                assert_eq!(editor.text(cx), "acbd\ne");
+                assert_eq!(editor.selections.ranges(cx), [6..6]);
 
-            editor
-        })
-        .1;
+                editor
+            })
+            .1;
 
-        cx.add_window(Default::default(), |cx| {
-            let mut editor = build_editor(MultiBuffer::build_simple("abc\nde", cx), cx);
+        _ = cx
+            .add_window(Default::default(), |cx| {
+                let mut editor = build_editor(MultiBuffer::build_simple("abc\nde", cx), cx);
 
-            editor.change_selections(None, cx, |s| s.select_ranges([1..1, 2..2, 4..4]));
-            editor.transpose(&Default::default(), cx);
-            assert_eq!(editor.text(cx), "bacd\ne");
-            assert_eq!(editor.selections.ranges(cx), [2..2, 3..3, 5..5]);
+                editor.change_selections(None, cx, |s| s.select_ranges([1..1, 2..2, 4..4]));
+                editor.transpose(&Default::default(), cx);
+                assert_eq!(editor.text(cx), "bacd\ne");
+                assert_eq!(editor.selections.ranges(cx), [2..2, 3..3, 5..5]);
 
-            editor.transpose(&Default::default(), cx);
-            assert_eq!(editor.text(cx), "bcade\n");
-            assert_eq!(editor.selections.ranges(cx), [3..3, 4..4, 6..6]);
+                editor.transpose(&Default::default(), cx);
+                assert_eq!(editor.text(cx), "bcade\n");
+                assert_eq!(editor.selections.ranges(cx), [3..3, 4..4, 6..6]);
 
-            editor.transpose(&Default::default(), cx);
-            assert_eq!(editor.text(cx), "bcda\ne");
-            assert_eq!(editor.selections.ranges(cx), [4..4, 6..6]);
+                editor.transpose(&Default::default(), cx);
+                assert_eq!(editor.text(cx), "bcda\ne");
+                assert_eq!(editor.selections.ranges(cx), [4..4, 6..6]);
 
-            editor.transpose(&Default::default(), cx);
-            assert_eq!(editor.text(cx), "bcade\n");
-            assert_eq!(editor.selections.ranges(cx), [4..4, 6..6]);
+                editor.transpose(&Default::default(), cx);
+                assert_eq!(editor.text(cx), "bcade\n");
+                assert_eq!(editor.selections.ranges(cx), [4..4, 6..6]);
 
-            editor.transpose(&Default::default(), cx);
-            assert_eq!(editor.text(cx), "bcaed\n");
-            assert_eq!(editor.selections.ranges(cx), [5..5, 6..6]);
+                editor.transpose(&Default::default(), cx);
+                assert_eq!(editor.text(cx), "bcaed\n");
+                assert_eq!(editor.selections.ranges(cx), [5..5, 6..6]);
 
-            editor
-        })
-        .1;
+                editor
+            })
+            .1;
 
-        cx.add_window(Default::default(), |cx| {
-            let mut editor = build_editor(MultiBuffer::build_simple("๐Ÿ๐Ÿ€โœ‹", cx), cx);
+        _ = cx
+            .add_window(Default::default(), |cx| {
+                let mut editor = build_editor(MultiBuffer::build_simple("๐Ÿ๐Ÿ€โœ‹", cx), cx);
 
-            editor.change_selections(None, cx, |s| s.select_ranges([4..4]));
-            editor.transpose(&Default::default(), cx);
-            assert_eq!(editor.text(cx), "๐Ÿ€๐Ÿโœ‹");
-            assert_eq!(editor.selections.ranges(cx), [8..8]);
+                editor.change_selections(None, cx, |s| s.select_ranges([4..4]));
+                editor.transpose(&Default::default(), cx);
+                assert_eq!(editor.text(cx), "๐Ÿ€๐Ÿโœ‹");
+                assert_eq!(editor.selections.ranges(cx), [8..8]);
 
-            editor.transpose(&Default::default(), cx);
-            assert_eq!(editor.text(cx), "๐Ÿ€โœ‹๐Ÿ");
-            assert_eq!(editor.selections.ranges(cx), [11..11]);
+                editor.transpose(&Default::default(), cx);
+                assert_eq!(editor.text(cx), "๐Ÿ€โœ‹๐Ÿ");
+                assert_eq!(editor.selections.ranges(cx), [11..11]);
 
-            editor.transpose(&Default::default(), cx);
-            assert_eq!(editor.text(cx), "๐Ÿ€๐Ÿโœ‹");
-            assert_eq!(editor.selections.ranges(cx), [11..11]);
+                editor.transpose(&Default::default(), cx);
+                assert_eq!(editor.text(cx), "๐Ÿ€๐Ÿโœ‹");
+                assert_eq!(editor.selections.ranges(cx), [11..11]);
 
-            editor
-        })
-        .1;
+                editor
+            })
+            .1;
     }
 
     #[gpui::test]
@@ -9347,7 +9346,7 @@ mod tests {
         let buffer = cx.add_model(|cx| Buffer::new(0, text, cx).with_language(language, cx));
         let buffer = cx.add_model(|cx| MultiBuffer::singleton(buffer, cx));
         let (_, view) = cx.add_window(|cx| build_editor(buffer, cx));
-        view.condition(&cx, |view, cx| !view.buffer.read(cx).is_parsing(cx))
+        view.condition(cx, |view, cx| !view.buffer.read(cx).is_parsing(cx))
             .await;
 
         view.update(cx, |view, cx| {
@@ -9506,7 +9505,7 @@ mod tests {
         let buffer = cx.add_model(|cx| MultiBuffer::singleton(buffer, cx));
         let (_, editor) = cx.add_window(|cx| build_editor(buffer, cx));
         editor
-            .condition(&cx, |editor, cx| !editor.buffer.read(cx).is_parsing(cx))
+            .condition(cx, |editor, cx| !editor.buffer.read(cx).is_parsing(cx))
             .await;
 
         editor.update(cx, |editor, cx| {
@@ -9566,7 +9565,7 @@ mod tests {
         let buffer = cx.add_model(|cx| Buffer::new(0, text, cx).with_language(language, cx));
         let buffer = cx.add_model(|cx| MultiBuffer::singleton(buffer, cx));
         let (_, view) = cx.add_window(|cx| build_editor(buffer, cx));
-        view.condition(&cx, |view, cx| !view.buffer.read(cx).is_parsing(cx))
+        view.condition(cx, |view, cx| !view.buffer.read(cx).is_parsing(cx))
             .await;
 
         view.update(cx, |view, cx| {
@@ -9742,7 +9741,7 @@ mod tests {
         let buffer = cx.add_model(|cx| Buffer::new(0, text, cx).with_language(language, cx));
         let buffer = cx.add_model(|cx| MultiBuffer::singleton(buffer, cx));
         let (_, view) = cx.add_window(|cx| build_editor(buffer, cx));
-        view.condition(&cx, |view, cx| !view.buffer.read(cx).is_parsing(cx))
+        view.condition(cx, |view, cx| !view.buffer.read(cx).is_parsing(cx))
             .await;
 
         view.update(cx, |view, cx| {
@@ -9824,7 +9823,7 @@ mod tests {
         let buffer = cx.add_model(|cx| MultiBuffer::singleton(buffer, cx));
         let (_, editor) = cx.add_window(|cx| build_editor(buffer, cx));
         editor
-            .condition(&cx, |view, cx| !view.buffer.read(cx).is_parsing(cx))
+            .condition(cx, |view, cx| !view.buffer.read(cx).is_parsing(cx))
             .await;
 
         editor.update(cx, |editor, cx| {
@@ -10028,7 +10027,7 @@ mod tests {
             }))
             .await;
 
-        let fs = FakeFs::new(cx.background().clone());
+        let fs = FakeFs::new(cx.background());
         fs.insert_file("/file.rs", Default::default()).await;
 
         let project = Project::test(fs, ["/file.rs".as_ref()], cx).await;
@@ -10142,7 +10141,7 @@ mod tests {
             }))
             .await;
 
-        let fs = FakeFs::new(cx.background().clone());
+        let fs = FakeFs::new(cx.background());
         fs.insert_file("/file.rs", Default::default()).await;
 
         let project = Project::test(fs, ["/file.rs".as_ref()], cx).await;
@@ -10425,7 +10424,7 @@ mod tests {
                             .map(|completion_text| lsp::CompletionItem {
                                 label: completion_text.to_string(),
                                 text_edit: Some(lsp::CompletionTextEdit::Edit(lsp::TextEdit {
-                                    range: replace_range.clone(),
+                                    range: replace_range,
                                     new_text: completion_text.to_string(),
                                 })),
                                 ..Default::default()
@@ -10856,7 +10855,7 @@ mod tests {
         let buffer = cx.add_model(|cx| Buffer::new(0, text, cx).with_language(language, cx));
         let buffer = cx.add_model(|cx| MultiBuffer::singleton(buffer, cx));
         let (_, view) = cx.add_window(|cx| build_editor(buffer, cx));
-        view.condition(&cx, |view, cx| !view.buffer.read(cx).is_parsing(cx))
+        view.condition(cx, |view, cx| !view.buffer.read(cx).is_parsing(cx))
             .await;
 
         view.update(cx, |view, cx| {
@@ -11084,7 +11083,7 @@ mod tests {
         let match_indices = [4, 6, 7, 8];
         assert_eq!(
             combine_syntax_and_fuzzy_match_highlights(
-                &string,
+                string,
                 Default::default(),
                 syntax_ranges.into_iter(),
                 &match_indices,

crates/editor/src/element.rs ๐Ÿ”—

@@ -110,6 +110,7 @@ impl EditorElement {
         self.update_view(cx, |view, cx| view.snapshot(cx))
     }
 
+    #[allow(clippy::too_many_arguments)]
     fn mouse_down(
         &self,
         position: Vector2F,
@@ -696,6 +697,7 @@ impl EditorElement {
         cx.scene.pop_layer();
     }
 
+    #[allow(clippy::too_many_arguments)]
     fn paint_highlighted_range(
         &self,
         range: Range<DisplayPoint>,
@@ -857,7 +859,7 @@ impl EditorElement {
                 .style
                 .placeholder_text
                 .as_ref()
-                .unwrap_or_else(|| &self.style.text);
+                .unwrap_or(&self.style.text);
             let placeholder_text = snapshot.placeholder_text();
             let placeholder_lines = placeholder_text
                 .as_ref()
@@ -866,7 +868,7 @@ impl EditorElement {
                 .skip(rows.start as usize)
                 .chain(iter::repeat(""))
                 .take(rows.len());
-            return placeholder_lines
+            placeholder_lines
                 .map(|line| {
                     cx.text_layout_cache.layout_str(
                         line,
@@ -881,7 +883,7 @@ impl EditorElement {
                         )],
                     )
                 })
-                .collect();
+                .collect()
         } else {
             let style = &self.style;
             let chunks = snapshot.chunks(rows.clone(), true).map(|chunk| {
@@ -926,14 +928,15 @@ impl EditorElement {
             layout_highlighted_chunks(
                 chunks,
                 &style.text,
-                &cx.text_layout_cache,
-                &cx.font_cache,
+                cx.text_layout_cache,
+                cx.font_cache,
                 MAX_LINE_LEN,
                 rows.len() as usize,
             )
         }
     }
 
+    #[allow(clippy::too_many_arguments)]
     fn layout_blocks(
         &mut self,
         rows: Range<u32>,
@@ -1299,7 +1302,9 @@ impl Element for EditorElement {
                 }
 
                 // Render the local selections in the leader's color when following.
-                let local_replica_id = view.leader_replica_id.unwrap_or(view.replica_id(cx));
+                let local_replica_id = view
+                    .leader_replica_id
+                    .unwrap_or_else(|| view.replica_id(cx));
 
                 selections.push((
                     local_replica_id,
@@ -1357,19 +1362,19 @@ impl Element for EditorElement {
 
         self.update_view(cx.app, |view, cx| {
             let clamped = view.clamp_scroll_left(scroll_max.x());
-            let autoscrolled;
-            if autoscroll_horizontally {
-                autoscrolled = view.autoscroll_horizontally(
+
+            let autoscrolled = if autoscroll_horizontally {
+                view.autoscroll_horizontally(
                     start_row,
                     text_size.x(),
                     scroll_width,
                     em_width,
                     &line_layouts,
                     cx,
-                );
+                )
             } else {
-                autoscrolled = false;
-            }
+                false
+            };
 
             if clamped || autoscrolled {
                 snapshot = view.snapshot(cx);
@@ -1991,8 +1996,8 @@ mod tests {
         let layouts = editor.update(cx, |editor, cx| {
             let snapshot = editor.snapshot(cx);
             let mut presenter = cx.build_presenter(window_id, 30.);
-            let mut layout_cx = presenter.build_layout_context(Vector2F::zero(), false, cx);
-            element.layout_line_numbers(0..6, &Default::default(), &snapshot, &mut layout_cx)
+            let layout_cx = presenter.build_layout_context(Vector2F::zero(), false, cx);
+            element.layout_line_numbers(0..6, &Default::default(), &snapshot, &layout_cx)
         });
         assert_eq!(layouts.len(), 6);
     }

crates/editor/src/hover_popover.rs ๐Ÿ”—

@@ -158,7 +158,7 @@ fn show_hover(
             // query the LSP for hover info
             let hover_request = cx.update(|cx| {
                 project.update(cx, |project, cx| {
-                    project.hover(&buffer, buffer_position.clone(), cx)
+                    project.hover(&buffer, buffer_position, cx)
                 })
             });
 
@@ -222,7 +222,7 @@ fn show_hover(
 
                 Some(InfoPopover {
                     project: project.clone(),
-                    symbol_range: range.clone(),
+                    symbol_range: range,
                     contents: hover_result.contents,
                 })
             });

crates/editor/src/items.rs ๐Ÿ”—

@@ -76,14 +76,14 @@ impl FollowableItem for Editor {
                     })
                     .collect::<Result<Vec<_>>>()?;
                 if !selections.is_empty() {
-                    editor.set_selections_from_remote(selections.into(), cx);
+                    editor.set_selections_from_remote(selections, cx);
                 }
 
                 if let Some(anchor) = state.scroll_top_anchor {
                     editor.set_scroll_top_anchor(
                         Anchor {
                             buffer_id: Some(state.buffer_id as usize),
-                            excerpt_id: excerpt_id.clone(),
+                            excerpt_id,
                             text_anchor: language::proto::deserialize_anchor(anchor)
                                 .ok_or_else(|| anyhow!("invalid scroll top"))?,
                         },
@@ -198,19 +198,17 @@ impl FollowableItem for Editor {
                 if !selections.is_empty() {
                     self.set_selections_from_remote(selections, cx);
                     self.request_autoscroll_remotely(Autoscroll::Newest, cx);
-                } else {
-                    if let Some(anchor) = message.scroll_top_anchor {
-                        self.set_scroll_top_anchor(
-                            Anchor {
-                                buffer_id: Some(buffer_id),
-                                excerpt_id: excerpt_id.clone(),
-                                text_anchor: language::proto::deserialize_anchor(anchor)
-                                    .ok_or_else(|| anyhow!("invalid scroll top"))?,
-                            },
-                            vec2f(message.scroll_x, message.scroll_y),
-                            cx,
-                        );
-                    }
+                } else if let Some(anchor) = message.scroll_top_anchor {
+                    self.set_scroll_top_anchor(
+                        Anchor {
+                            buffer_id: Some(buffer_id),
+                            excerpt_id,
+                            text_anchor: language::proto::deserialize_anchor(anchor)
+                                .ok_or_else(|| anyhow!("invalid scroll top"))?,
+                        },
+                        vec2f(message.scroll_x, message.scroll_y),
+                        cx,
+                    );
                 }
             }
         }
@@ -436,8 +434,7 @@ impl Item for Editor {
             .buffer()
             .read(cx)
             .as_singleton()
-            .expect("cannot call save_as on an excerpt list")
-            .clone();
+            .expect("cannot call save_as on an excerpt list");
 
         project.update(cx, |project, cx| {
             project.save_buffer_as(buffer, abs_path, cx)
@@ -503,6 +500,12 @@ pub struct CursorPosition {
     _observe_active_editor: Option<Subscription>,
 }
 
+impl Default for CursorPosition {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
 impl CursorPosition {
     pub fn new() -> Self {
         Self {
@@ -83,7 +83,7 @@ pub fn update_go_to_definition_link(
         &point,
         &editor.link_go_to_definition_state.last_mouse_location,
     ) {
-        if a.cmp(&b, &snapshot.buffer_snapshot).is_eq() {
+        if a.cmp(b, &snapshot.buffer_snapshot).is_eq() {
             return;
         }
     }
@@ -126,7 +126,7 @@ pub fn cmd_shift_changed(
                 LinkDefinitionKind::Symbol
             };
 
-            show_link_definition(kind, editor, point.clone(), snapshot, cx);
+            show_link_definition(kind, editor, point, snapshot, cx);
         } else {
             hide_link_definition(editor, cx)
         }
@@ -204,12 +204,10 @@ pub fn show_link_definition(
             // query the LSP for definition info
             let definition_request = cx.update(|cx| {
                 project.update(cx, |project, cx| match definition_kind {
-                    LinkDefinitionKind::Symbol => {
-                        project.definition(&buffer, buffer_position.clone(), cx)
-                    }
+                    LinkDefinitionKind::Symbol => project.definition(&buffer, buffer_position, cx),
 
                     LinkDefinitionKind::Type => {
-                        project.type_definition(&buffer, buffer_position.clone(), cx)
+                        project.type_definition(&buffer, buffer_position, cx)
                     }
                 })
             });
@@ -363,7 +361,7 @@ fn go_to_fetched_definition_of_kind(
         editor_handle.update(cx, |editor, cx| {
             editor.select(
                 &Select(SelectPhase::Begin {
-                    position: point.clone(),
+                    position: point,
                     add: false,
                     click_count: 1,
                 }),

crates/editor/src/multi_buffer.rs ๐Ÿ”—

@@ -33,7 +33,7 @@ use text::{
 use theme::SyntaxTheme;
 use util::post_inc;
 
-const NEWLINES: &'static [u8] = &[b'\n'; u8::MAX as usize];
+const NEWLINES: &[u8] = &[b'\n'; u8::MAX as usize];
 
 pub type ExcerptId = Locator;
 
@@ -289,10 +289,16 @@ impl MultiBuffer {
         self.read(cx).has_conflict()
     }
 
+    // The `is_empty` signature doesn't match what clippy expects
+    #[allow(clippy::len_without_is_empty)]
     pub fn len(&self, cx: &AppContext) -> usize {
         self.read(cx).len()
     }
 
+    pub fn is_empty(&self, cx: &AppContext) -> bool {
+        self.len(cx) != 0
+    }
+
     pub fn symbols_containing<T: ToOffset>(
         &self,
         offset: T,
@@ -338,6 +344,7 @@ impl MultiBuffer {
             _ => Default::default(),
         };
 
+        #[allow(clippy::type_complexity)]
         let mut buffer_edits: HashMap<usize, Vec<(Range<usize>, Arc<str>, bool, u32)>> =
             Default::default();
         let mut cursor = snapshot.excerpts.cursor::<usize>();
@@ -594,13 +601,13 @@ impl MultiBuffer {
                     break;
                 }
 
-                let mut start = excerpt.range.context.start.clone();
-                let mut end = excerpt.range.context.end.clone();
+                let mut start = excerpt.range.context.start;
+                let mut end = excerpt.range.context.end;
                 if excerpt.id == selection.start.excerpt_id {
-                    start = selection.start.text_anchor.clone();
+                    start = selection.start.text_anchor;
                 }
                 if excerpt.id == selection.end.excerpt_id {
-                    end = selection.end.text_anchor.clone();
+                    end = selection.end.text_anchor;
                 }
                 selections_by_buffer
                     .entry(excerpt.buffer_id)
@@ -666,7 +673,7 @@ impl MultiBuffer {
         while let Some(transaction) = self.history.pop_undo() {
             let mut undone = false;
             for (buffer_id, buffer_transaction_id) in &mut transaction.buffer_transactions {
-                if let Some(BufferState { buffer, .. }) = self.buffers.borrow().get(&buffer_id) {
+                if let Some(BufferState { buffer, .. }) = self.buffers.borrow().get(buffer_id) {
                     undone |= buffer.update(cx, |buffer, cx| {
                         let undo_to = *buffer_transaction_id;
                         if let Some(entry) = buffer.peek_undo_stack() {
@@ -693,7 +700,7 @@ impl MultiBuffer {
         while let Some(transaction) = self.history.pop_redo() {
             let mut redone = false;
             for (buffer_id, buffer_transaction_id) in &mut transaction.buffer_transactions {
-                if let Some(BufferState { buffer, .. }) = self.buffers.borrow().get(&buffer_id) {
+                if let Some(BufferState { buffer, .. }) = self.buffers.borrow().get(buffer_id) {
                     redone |= buffer.update(cx, |buffer, cx| {
                         let redo_to = *buffer_transaction_id;
                         if let Some(entry) = buffer.peek_redo_stack() {
@@ -982,8 +989,8 @@ impl MultiBuffer {
     }
 
     // If point is at the end of the buffer, the last excerpt is returned
-    pub fn point_to_buffer_offset<'a, T: ToOffset>(
-        &'a self,
+    pub fn point_to_buffer_offset<T: ToOffset>(
+        &self,
         point: T,
         cx: &AppContext,
     ) -> Option<(ModelHandle<Buffer>, usize)> {
@@ -1004,8 +1011,8 @@ impl MultiBuffer {
         })
     }
 
-    pub fn range_to_buffer_ranges<'a, T: ToOffset>(
-        &'a self,
+    pub fn range_to_buffer_ranges<T: ToOffset>(
+        &self,
         range: Range<T>,
         cx: &AppContext,
     ) -> Vec<(ModelHandle<Buffer>, Range<usize>)> {
@@ -1112,8 +1119,8 @@ impl MultiBuffer {
         cx.notify();
     }
 
-    pub fn text_anchor_for_position<'a, T: ToOffset>(
-        &'a self,
+    pub fn text_anchor_for_position<T: ToOffset>(
+        &self,
         position: T,
         cx: &AppContext,
     ) -> Option<(ModelHandle<Buffer>, language::Anchor)> {
@@ -1439,7 +1446,7 @@ impl MultiBuffer {
                 .flat_map(|b| &b.excerpts)
                 .cloned()
                 .collect::<Vec<_>>();
-            if excerpt_ids.len() == 0 || (rng.gen() && excerpt_ids.len() < max_excerpts) {
+            if excerpt_ids.is_empty() || (rng.gen() && excerpt_ids.len() < max_excerpts) {
                 let buffer_handle = if rng.gen() || self.buffers.borrow().is_empty() {
                     let text = RandomCharIter::new(&mut *rng).take(10).collect::<String>();
                     buffers.push(cx.add_model(|cx| Buffer::new(0, text, cx)));
@@ -1514,8 +1521,8 @@ impl MultiBuffer {
                 .choose(rng)
                 .map(|state| state.buffer.clone());
 
-            if rng.gen() && buffer.is_some() {
-                buffer.unwrap().update(cx, |buffer, cx| {
+            if let Some(buffer) = buffer {
+                buffer.update(cx, |buffer, cx| {
                     if rng.gen() {
                         buffer.randomly_edit(rng, mutation_count, cx);
                     } else {
@@ -1542,10 +1549,7 @@ impl MultiBufferSnapshot {
             .collect()
     }
 
-    pub fn reversed_chars_at<'a, T: ToOffset>(
-        &'a self,
-        position: T,
-    ) -> impl Iterator<Item = char> + 'a {
+    pub fn reversed_chars_at<T: ToOffset>(&self, position: T) -> impl Iterator<Item = char> + '_ {
         let mut offset = position.to_offset(self);
         let mut cursor = self.excerpts.cursor::<usize>();
         cursor.seek(&offset, Bias::Left, &());
@@ -1579,16 +1583,13 @@ impl MultiBufferSnapshot {
         .flat_map(|c| c.chars().rev())
     }
 
-    pub fn chars_at<'a, T: ToOffset>(&'a self, position: T) -> impl Iterator<Item = char> + 'a {
+    pub fn chars_at<T: ToOffset>(&self, position: T) -> impl Iterator<Item = char> + '_ {
         let offset = position.to_offset(self);
         self.text_for_range(offset..self.len())
             .flat_map(|chunk| chunk.chars())
     }
 
-    pub fn text_for_range<'a, T: ToOffset>(
-        &'a self,
-        range: Range<T>,
-    ) -> impl Iterator<Item = &'a str> {
+    pub fn text_for_range<T: ToOffset>(&self, range: Range<T>) -> impl Iterator<Item = &str> + '_ {
         self.chunks(range, false).map(|chunk| chunk.text)
     }
 
@@ -1655,6 +1656,10 @@ impl MultiBufferSnapshot {
         self.excerpts.summary().text.len
     }
 
+    pub fn is_empty(&self) -> bool {
+        self.excerpts.summary().text.len == 0
+    }
+
     pub fn max_buffer_row(&self) -> u32 {
         self.excerpts.summary().max_buffer_row
     }
@@ -1737,7 +1742,7 @@ impl MultiBufferSnapshot {
         *cursor.start() + overshoot
     }
 
-    pub fn bytes_in_range<'a, T: ToOffset>(&'a self, range: Range<T>) -> MultiBufferBytes<'a> {
+    pub fn bytes_in_range<T: ToOffset>(&self, range: Range<T>) -> MultiBufferBytes {
         let range = range.start.to_offset(self)..range.end.to_offset(self);
         let mut excerpts = self.excerpts.cursor::<usize>();
         excerpts.seek(&range.start, Bias::Right, &());
@@ -1760,7 +1765,7 @@ impl MultiBufferSnapshot {
         }
     }
 
-    pub fn buffer_rows<'a>(&'a self, start_row: u32) -> MultiBufferRows<'a> {
+    pub fn buffer_rows(&self, start_row: u32) -> MultiBufferRows {
         let mut result = MultiBufferRows {
             buffer_row_range: 0..0,
             excerpts: self.excerpts.cursor(),
@@ -1769,11 +1774,7 @@ impl MultiBufferSnapshot {
         result
     }
 
-    pub fn chunks<'a, T: ToOffset>(
-        &'a self,
-        range: Range<T>,
-        language_aware: bool,
-    ) -> MultiBufferChunks<'a> {
+    pub fn chunks<T: ToOffset>(&self, range: Range<T>, language_aware: bool) -> MultiBufferChunks {
         let range = range.start.to_offset(self)..range.end.to_offset(self);
         let mut chunks = MultiBufferChunks {
             range: range.clone(),
@@ -2033,7 +2034,7 @@ impl MultiBufferSnapshot {
         self.excerpts.summary().text.clone()
     }
 
-    pub fn text_summary_for_range<'a, D, O>(&'a self, range: Range<O>) -> D
+    pub fn text_summary_for_range<D, O>(&self, range: Range<O>) -> D
     where
         D: TextDimension,
         O: ToOffset,
@@ -2204,15 +2205,15 @@ impl MultiBufferSnapshot {
                 let (anchor_ix, anchor) = anchors.next().unwrap();
                 let mut anchor = anchor.clone();
 
-                // Leave min and max anchors unchanged.
-                if *old_excerpt_id == ExcerptId::max() || *old_excerpt_id == ExcerptId::min() {
-                    kept_position = true;
-                }
-                // If the old excerpt still exists at this location, then leave
-                // the anchor unchanged.
-                else if next_excerpt.map_or(false, |excerpt| {
+                let id_invalid =
+                    *old_excerpt_id == ExcerptId::max() || *old_excerpt_id == ExcerptId::min();
+                let still_exists = next_excerpt.map_or(false, |excerpt| {
                     excerpt.id == *old_excerpt_id && excerpt.contains(&anchor)
-                }) {
+                });
+
+                // Leave min and max anchors unchanged if invalid or
+                // if the old excerpt still exists at this location
+                if id_invalid || still_exists {
                     kept_position = true;
                 }
                 // If the old excerpt no longer exists at this location, then attempt to
@@ -2239,7 +2240,7 @@ impl MultiBufferSnapshot {
                             .cmp(&excerpt.range.context.end, &excerpt.buffer)
                             .is_gt()
                         {
-                            text_anchor = excerpt.range.context.end.clone();
+                            text_anchor = excerpt.range.context.end;
                         }
                         Anchor {
                             buffer_id: Some(excerpt.buffer_id),
@@ -2256,7 +2257,7 @@ impl MultiBufferSnapshot {
                             .cmp(&excerpt.range.context.start, &excerpt.buffer)
                             .is_lt()
                         {
-                            text_anchor = excerpt.range.context.start.clone();
+                            text_anchor = excerpt.range.context.start;
                         }
                         Anchor {
                             buffer_id: Some(excerpt.buffer_id),
@@ -2349,10 +2350,10 @@ impl MultiBufferSnapshot {
         }
     }
 
-    pub fn excerpt_boundaries_in_range<'a, R, T>(
-        &'a self,
+    pub fn excerpt_boundaries_in_range<R, T>(
+        &self,
         range: R,
-    ) -> impl Iterator<Item = ExcerptBoundary> + 'a
+    ) -> impl Iterator<Item = ExcerptBoundary> + '_
     where
         R: RangeBounds<T>,
         T: ToOffset,
@@ -2635,13 +2636,12 @@ impl MultiBufferSnapshot {
         cursor
             .take_while(move |excerpt| excerpt.id <= range.end.excerpt_id)
             .flat_map(move |excerpt| {
-                let mut query_range =
-                    excerpt.range.context.start.clone()..excerpt.range.context.end.clone();
+                let mut query_range = excerpt.range.context.start..excerpt.range.context.end;
                 if excerpt.id == range.start.excerpt_id {
-                    query_range.start = range.start.text_anchor.clone();
+                    query_range.start = range.start.text_anchor;
                 }
                 if excerpt.id == range.end.excerpt_id {
-                    query_range.end = range.end.text_anchor.clone();
+                    query_range.end = range.end.text_anchor;
                 }
 
                 excerpt
@@ -2652,12 +2652,12 @@ impl MultiBufferSnapshot {
                             let mut start = Anchor {
                                 buffer_id: Some(excerpt.buffer_id),
                                 excerpt_id: excerpt.id.clone(),
-                                text_anchor: selection.start.clone(),
+                                text_anchor: selection.start,
                             };
                             let mut end = Anchor {
                                 buffer_id: Some(excerpt.buffer_id),
                                 excerpt_id: excerpt.id.clone(),
-                                text_anchor: selection.end.clone(),
+                                text_anchor: selection.end,
                             };
                             if range.start.cmp(&start, self).is_gt() {
                                 start = range.start.clone();
@@ -2862,11 +2862,7 @@ impl Excerpt {
         }
     }
 
-    fn chunks_in_range<'a>(
-        &'a self,
-        range: Range<usize>,
-        language_aware: bool,
-    ) -> ExcerptChunks<'a> {
+    fn chunks_in_range(&self, range: Range<usize>, language_aware: bool) -> ExcerptChunks {
         let content_start = self.range.context.start.to_offset(&self.buffer);
         let chunks_start = content_start + range.start;
         let chunks_end = content_start + cmp::min(range.end, self.text_summary.len);
@@ -2913,12 +2909,12 @@ impl Excerpt {
             .cmp(&self.range.context.start, &self.buffer)
             .is_lt()
         {
-            self.range.context.start.clone()
+            self.range.context.start
         } else if text_anchor
             .cmp(&self.range.context.end, &self.buffer)
             .is_gt()
         {
-            self.range.context.end.clone()
+            self.range.context.end
         } else {
             text_anchor
         }
@@ -3835,7 +3831,7 @@ mod tests {
                             "Removing excerpt {}: {:?}",
                             ix,
                             buffer
-                                .text_for_range(range.to_offset(&buffer))
+                                .text_for_range(range.to_offset(buffer))
                                 .collect::<String>(),
                         );
                     }
@@ -3851,7 +3847,7 @@ mod tests {
                     let bias = if rng.gen() { Bias::Left } else { Bias::Right };
                     log::info!("Creating anchor at {} with bias {:?}", offset, bias);
                     anchors.push(multibuffer.anchor_at(offset, bias));
-                    anchors.sort_by(|a, b| a.cmp(&b, &multibuffer));
+                    anchors.sort_by(|a, b| a.cmp(b, &multibuffer));
                 }
                 40..=44 if !anchors.is_empty() => {
                     let multibuffer = multibuffer.read(cx).read(cx);
@@ -3896,7 +3892,7 @@ mod tests {
                     let prev_excerpt_id = excerpt_ids
                         .get(prev_excerpt_ix)
                         .cloned()
-                        .unwrap_or(ExcerptId::max());
+                        .unwrap_or_else(ExcerptId::max);
                     let excerpt_ix = (prev_excerpt_ix + 1).min(expected_excerpts.len());
 
                     log::info!(
@@ -3984,11 +3980,7 @@ mod tests {
 
             assert_eq!(
                 snapshot.max_buffer_row(),
-                expected_buffer_rows
-                    .into_iter()
-                    .filter_map(|r| r)
-                    .max()
-                    .unwrap()
+                expected_buffer_rows.into_iter().flatten().max().unwrap()
             );
 
             let mut excerpt_starts = excerpt_starts.into_iter();

crates/editor/src/multi_buffer/anchor.rs ๐Ÿ”—

@@ -34,7 +34,7 @@ impl Anchor {
         &self.excerpt_id
     }
 
-    pub fn cmp<'a>(&self, other: &Anchor, snapshot: &MultiBufferSnapshot) -> Ordering {
+    pub fn cmp(&self, other: &Anchor, snapshot: &MultiBufferSnapshot) -> Ordering {
         let excerpt_id_cmp = self.excerpt_id.cmp(&other.excerpt_id);
         if excerpt_id_cmp.is_eq() {
             if self.excerpt_id == ExcerptId::min() || self.excerpt_id == ExcerptId::max() {
@@ -111,15 +111,15 @@ impl AnchorRangeExt for Range<Anchor> {
     fn cmp(&self, other: &Range<Anchor>, buffer: &MultiBufferSnapshot) -> Ordering {
         match self.start.cmp(&other.start, buffer) {
             Ordering::Equal => other.end.cmp(&self.end, buffer),
-            ord @ _ => ord,
+            ord => ord,
         }
     }
 
     fn to_offset(&self, content: &MultiBufferSnapshot) -> Range<usize> {
-        self.start.to_offset(&content)..self.end.to_offset(&content)
+        self.start.to_offset(content)..self.end.to_offset(content)
     }
 
     fn to_point(&self, content: &MultiBufferSnapshot) -> Range<Point> {
-        self.start.to_point(&content)..self.end.to_point(&content)
+        self.start.to_point(content)..self.end.to_point(content)
     }
 }

crates/editor/src/selections_collection.rs ๐Ÿ”—

@@ -68,7 +68,7 @@ impl SelectionsCollection {
         self.pending = other.pending.clone();
     }
 
-    pub fn count<'a>(&self) -> usize {
+    pub fn count(&self) -> usize {
         let mut count = self.disjoint.len();
         if self.pending.is_some() {
             count += 1;
@@ -365,7 +365,7 @@ impl<'a> MutableSelectionsCollection<'a> {
         let mut changed = false;
         self.collection.disjoint = self
             .disjoint
-            .into_iter()
+            .iter()
             .filter(|selection| {
                 let found = selection.id == selection_id;
                 changed |= found;
@@ -464,7 +464,7 @@ impl<'a> MutableSelectionsCollection<'a> {
             return true;
         }
 
-        return false;
+        false
     }
 
     pub fn insert_range<T>(&mut self, range: Range<T>)
@@ -729,8 +729,7 @@ impl<'a> MutableSelectionsCollection<'a> {
                     kept_end
                 };
                 if !kept_head {
-                    selections_with_lost_position
-                        .insert(selection.id, selection.head().excerpt_id.clone());
+                    selections_with_lost_position.insert(selection.id, selection.head().excerpt_id);
                 }
 
                 Selection {
@@ -761,10 +760,8 @@ impl<'a> MutableSelectionsCollection<'a> {
                 kept_end
             };
             if !kept_head {
-                selections_with_lost_position.insert(
-                    pending.selection.id,
-                    pending.selection.head().excerpt_id.clone(),
-                );
+                selections_with_lost_position
+                    .insert(pending.selection.id, pending.selection.head().excerpt_id);
             }
 
             pending.selection.start = start;
@@ -814,5 +811,5 @@ fn resolve<D: TextDimension + Ord + Sub<D, Output = D>>(
     selection: &Selection<Anchor>,
     buffer: &MultiBufferSnapshot,
 ) -> Selection<D> {
-    selection.map(|p| p.summary::<D>(&buffer))
+    selection.map(|p| p.summary::<D>(buffer))
 }

crates/file_finder/src/file_finder.rs ๐Ÿ”—

@@ -262,7 +262,7 @@ impl PickerDelegate for FileFinder {
             self.labels_for_match(path_match);
         Flex::column()
             .with_child(
-                Label::new(file_name.to_string(), style.label.clone())
+                Label::new(file_name, style.label.clone())
                     .with_highlights(file_name_positions)
                     .boxed(),
             )
@@ -333,7 +333,7 @@ mod tests {
         cx.dispatch_action(window_id, SelectNext);
         cx.dispatch_action(window_id, Confirm);
         active_pane
-            .condition(&cx, |pane, _| pane.active_item().is_some())
+            .condition(cx, |pane, _| pane.active_item().is_some())
             .await;
         cx.read(|cx| {
             let active_item = active_pane.read(cx).active_item().unwrap();

crates/fsevent/examples/events.rs ๐Ÿ”—

@@ -4,7 +4,7 @@ use std::{env::args, path::Path, time::Duration};
 fn main() {
     let paths = args().skip(1).collect::<Vec<_>>();
     let paths = paths.iter().map(Path::new).collect::<Vec<_>>();
-    assert!(paths.len() > 0, "Must pass 1 or more paths as arguments");
+    assert!(!paths.is_empty(), "Must pass 1 or more paths as arguments");
     let (stream, _handle) = EventStream::new(&paths, Duration::from_millis(100));
     stream.run(|events| {
         eprintln!("event batch");

crates/fsevent/src/fsevent.rs ๐Ÿ”—

@@ -233,11 +233,9 @@ impl EventStream {
                     }
                 }
 
-                if !events.is_empty() {
-                    if !callback(events) {
-                        fs::FSEventStreamStop(stream_ref);
-                        cf::CFRunLoopStop(cf::CFRunLoopGetCurrent());
-                    }
+                if !events.is_empty() && !callback(events) {
+                    fs::FSEventStreamStop(stream_ref);
+                    cf::CFRunLoopStop(cf::CFRunLoopGetCurrent());
                 }
             }
         }

crates/fuzzy/src/char_bag.rs ๐Ÿ”—

@@ -10,15 +10,15 @@ impl CharBag {
 
     fn insert(&mut self, c: char) {
         let c = c.to_ascii_lowercase();
-        if c >= 'a' && c <= 'z' {
+        if ('a'..='z').contains(&c) {
             let mut count = self.0;
-            let idx = c as u8 - 'a' as u8;
-            count = count >> (idx * 2);
+            let idx = c as u8 - b'a';
+            count >>= idx * 2;
             count = ((count << 1) | 1) & 3;
-            count = count << idx * 2;
+            count <<= idx * 2;
             self.0 |= count;
-        } else if c >= '0' && c <= '9' {
-            let idx = c as u8 - '0' as u8;
+        } else if ('0'..='9').contains(&c) {
+            let idx = c as u8 - b'0';
             self.0 |= 1 << (idx + 52);
         } else if c == '-' {
             self.0 |= 1 << 62;

crates/fuzzy/src/fuzzy.rs ๐Ÿ”—

@@ -35,7 +35,7 @@ trait Match: Ord {
 
 trait MatchCandidate {
     fn has_chars(&self, bag: CharBag) -> bool;
-    fn to_string<'a>(&'a self) -> Cow<'a, str>;
+    fn to_string(&self) -> Cow<'_, str>;
 }
 
 #[derive(Clone, Debug)]
@@ -64,6 +64,9 @@ pub trait PathMatchCandidateSet<'a>: Send + Sync {
     type Candidates: Iterator<Item = PathMatchCandidate<'a>>;
     fn id(&self) -> usize;
     fn len(&self) -> usize;
+    fn is_empty(&self) -> bool {
+        self.len() == 0
+    }
     fn prefix(&self) -> Arc<str>;
     fn candidates(&'a self, start: usize) -> Self::Candidates;
 }
@@ -239,7 +242,7 @@ pub async fn match_strings(
         if results.is_empty() {
             results = segment_result;
         } else {
-            util::extend_sorted(&mut results, segment_result, max_results, |a, b| b.cmp(&a));
+            util::extend_sorted(&mut results, segment_result, max_results, |a, b| b.cmp(a));
         }
     }
     results
@@ -299,7 +302,7 @@ pub async fn match_paths<'a, Set: PathMatchCandidateSet<'a>>(
                                 candidate_set.prefix(),
                                 candidates,
                                 results,
-                                &cancel_flag,
+                                cancel_flag,
                             );
                         }
                         if tree_end >= segment_end {
@@ -317,7 +320,7 @@ pub async fn match_paths<'a, Set: PathMatchCandidateSet<'a>>(
         if results.is_empty() {
             results = segment_result;
         } else {
-            util::extend_sorted(&mut results, segment_result, max_results, |a, b| b.cmp(&a));
+            util::extend_sorted(&mut results, segment_result, max_results, |a, b| b.cmp(a));
         }
     }
     results
@@ -426,7 +429,7 @@ impl<'a> Matcher<'a> {
                 lowercase_candidate_chars.push(c.to_ascii_lowercase());
             }
 
-            if !self.find_last_positions(&lowercase_prefix, &lowercase_candidate_chars) {
+            if !self.find_last_positions(lowercase_prefix, &lowercase_candidate_chars) {
                 continue;
             }
 
@@ -439,13 +442,13 @@ impl<'a> Matcher<'a> {
             let score = self.score_match(
                 &candidate_chars,
                 &lowercase_candidate_chars,
-                &prefix,
-                &lowercase_prefix,
+                prefix,
+                lowercase_prefix,
             );
 
             if score > 0.0 {
                 let mut mat = build_match(&candidate, score);
-                if let Err(i) = results.binary_search_by(|m| mat.cmp(&m)) {
+                if let Err(i) = results.binary_search_by(|m| mat.cmp(m)) {
                     if results.len() < self.max_results {
                         mat.set_positions(self.match_positions.clone());
                         results.insert(i, mat);
@@ -523,6 +526,7 @@ impl<'a> Matcher<'a> {
         score
     }
 
+    #[allow(clippy::too_many_arguments)]
     fn recursive_score_match(
         &mut self,
         path: &[char],
@@ -579,9 +583,9 @@ impl<'a> Matcher<'a> {
 
                     if last == '/' {
                         char_score = 0.9;
-                    } else if last == '-' || last == '_' || last == ' ' || last.is_numeric() {
-                        char_score = 0.8;
-                    } else if last.is_lowercase() && curr.is_uppercase() {
+                    } else if (last == '-' || last == '_' || last == ' ' || last.is_numeric())
+                        || (last.is_lowercase() && curr.is_uppercase())
+                    {
                         char_score = 0.8;
                     } else if last == '.' {
                         char_score = 0.7;
@@ -662,18 +666,18 @@ mod tests {
         let mut query: &[char] = &['d', 'c'];
         let mut matcher = Matcher::new(query, query, query.into(), false, 10);
         let result = matcher.find_last_positions(&['a', 'b', 'c'], &['b', 'd', 'e', 'f']);
-        assert_eq!(result, false);
+        assert!(!result);
 
         query = &['c', 'd'];
         let mut matcher = Matcher::new(query, query, query.into(), false, 10);
         let result = matcher.find_last_positions(&['a', 'b', 'c'], &['b', 'd', 'e', 'f']);
-        assert_eq!(result, true);
+        assert!(result);
         assert_eq!(matcher.last_positions, vec![2, 4]);
 
         query = &['z', '/', 'z', 'f'];
         let mut matcher = Matcher::new(query, query, query.into(), false, 10);
         let result = matcher.find_last_positions(&['z', 'e', 'd', '/'], &['z', 'e', 'd', '/', 'f']);
-        assert_eq!(result, true);
+        assert!(result);
         assert_eq!(matcher.last_positions, vec![0, 3, 4, 8]);
     }
 
@@ -741,7 +745,7 @@ mod tests {
     fn match_query<'a>(
         query: &str,
         smart_case: bool,
-        paths: &Vec<&'a str>,
+        paths: &[&'a str],
     ) -> Vec<(&'a str, Vec<usize>)> {
         let lowercase_query = query.to_lowercase().chars().collect::<Vec<_>>();
         let query = query.chars().collect::<Vec<_>>();

crates/gpui/build.rs ๐Ÿ”—

@@ -41,7 +41,7 @@ fn compile_context_predicate_parser() {
         .compile("tree_sitter_context_predicate");
 }
 
-const SHADER_HEADER_PATH: &'static str = "./src/platform/mac/shaders/shaders.h";
+const SHADER_HEADER_PATH: &str = "./src/platform/mac/shaders/shaders.h";
 
 fn compile_metal_shaders() {
     let shader_path = "./src/platform/mac/shaders/shaders.metal";

crates/gpui/examples/text.rs ๐Ÿ”—

@@ -85,11 +85,11 @@ impl gpui::Element for TextElement {
             text,
             font_size,
             &[
-                (1, normal.clone()),
-                (1, bold.clone()),
-                (1, normal.clone()),
-                (1, bold.clone()),
-                (text.len() - 4, normal.clone()),
+                (1, normal),
+                (1, bold),
+                (1, normal),
+                (1, bold),
+                (text.len() - 4, normal),
             ],
         );
 

crates/gpui/src/app.rs ๐Ÿ”—

@@ -432,7 +432,7 @@ impl TestAppContext {
         first_entity_id: usize,
     ) -> Self {
         let mut cx = MutableAppContext::new(
-            foreground.clone(),
+            foreground,
             background,
             platform,
             foreground_platform.clone(),
@@ -964,6 +964,7 @@ pub struct MutableAppContext {
     release_observations: Arc<Mutex<HashMap<usize, BTreeMap<usize, ReleaseObservationCallback>>>>,
     action_dispatch_observations: Arc<Mutex<BTreeMap<usize, ActionObservationCallback>>>,
 
+    #[allow(clippy::type_complexity)]
     presenters_and_platform_windows:
         HashMap<usize, (Rc<RefCell<Presenter>>, Box<dyn platform::Window>)>,
     foreground: Rc<executor::Foreground>,
@@ -1172,7 +1173,9 @@ impl MutableAppContext {
         F: 'static + FnMut(&mut V, &A, &mut ViewContext<V>) -> Option<Task<Result<()>>>,
     {
         self.add_action(move |view, action, cx| {
-            handler(view, action, cx).map(|task| task.detach_and_log_err(cx));
+            if let Some(task) = handler(view, action, cx) {
+                task.detach_and_log_err(cx);
+            }
         })
     }
 
@@ -1240,7 +1243,7 @@ impl MutableAppContext {
             .cx
             .views
             .remove(&(window_id, view_id))
-            .ok_or(anyhow!("view not found"))?;
+            .ok_or_else(|| anyhow!("view not found"))?;
         let element = view.render(params, self);
         self.cx.views.insert((window_id, view_id), view);
         Ok(element)
@@ -1252,6 +1255,7 @@ impl MutableAppContext {
         titlebar_height: f32,
     ) -> HashMap<usize, ElementBox> {
         self.start_frame();
+        #[allow(clippy::needless_collect)]
         let view_ids = self
             .views
             .keys()
@@ -1263,6 +1267,7 @@ impl MutableAppContext {
                 }
             })
             .collect::<Vec<_>>();
+
         view_ids
             .into_iter()
             .map(|view_id| {
@@ -2401,7 +2406,7 @@ impl MutableAppContext {
             let mut invalidation = self
                 .cx
                 .windows
-                .get_mut(&window_id)
+                .get_mut(window_id)
                 .unwrap()
                 .invalidation
                 .take();
@@ -2626,7 +2631,7 @@ impl MutableAppContext {
 
     fn handle_action_dispatch_notification_effect(&mut self, action_id: TypeId) {
         let mut callbacks = mem::take(&mut *self.action_dispatch_observations.lock());
-        for (_, callback) in &mut callbacks {
+        for callback in callbacks.values_mut() {
             callback(action_id, self);
         }
         self.action_dispatch_observations.lock().extend(callbacks);
@@ -3228,7 +3233,7 @@ pub trait AnyView {
         cx: &mut MutableAppContext,
     ) -> Option<Pin<Box<dyn 'static + Future<Output = ()>>>>;
     fn ui_name(&self) -> &'static str;
-    fn render<'a>(&mut self, params: RenderParams, cx: &mut MutableAppContext) -> ElementBox;
+    fn render(&mut self, params: RenderParams, cx: &mut MutableAppContext) -> ElementBox;
     fn on_focus_in(
         &mut self,
         cx: &mut MutableAppContext,
@@ -3304,7 +3309,7 @@ where
         T::ui_name()
     }
 
-    fn render<'a>(&mut self, params: RenderParams, cx: &mut MutableAppContext) -> ElementBox {
+    fn render(&mut self, params: RenderParams, cx: &mut MutableAppContext) -> ElementBox {
         View::render(self, &mut RenderContext::new(params, cx))
     }
 
@@ -3611,7 +3616,7 @@ impl<M> Deref for ModelContext<'_, M> {
     type Target = MutableAppContext;
 
     fn deref(&self) -> &Self::Target {
-        &self.app
+        self.app
     }
 }
 
@@ -4140,7 +4145,7 @@ impl<M> Deref for ViewContext<'_, M> {
     type Target = MutableAppContext;
 
     fn deref(&self) -> &Self::Target {
-        &self.app
+        self.app
     }
 }
 
@@ -4290,7 +4295,7 @@ impl<T: Entity> ModelHandle<T> {
         cx.read_model(self)
     }
 
-    pub fn read_with<'a, C, F, S>(&self, cx: &C, read: F) -> S
+    pub fn read_with<C, F, S>(&self, cx: &C, read: F) -> S
     where
         C: ReadModelWith,
         F: FnOnce(&T, &AppContext) -> S,
@@ -4381,7 +4386,6 @@ impl<T: Entity> ModelHandle<T> {
                 }
             }),
             cx.subscribe(self, {
-                let tx = tx.clone();
                 move |_, _, _| {
                     tx.unbounded_send(()).ok();
                 }
@@ -5258,6 +5262,7 @@ pub enum Subscription {
     ReleaseObservation {
         id: usize,
         entity_id: usize,
+        #[allow(clippy::type_complexity)]
         observations:
             Option<Weak<Mutex<HashMap<usize, BTreeMap<usize, ReleaseObservationCallback>>>>>,
     },
@@ -5407,7 +5412,7 @@ impl Drop for Subscription {
             }
             Subscription::ActionObservation { id, observations } => {
                 if let Some(observations) = observations.as_ref().and_then(Weak::upgrade) {
-                    observations.lock().remove(&id);
+                    observations.lock().remove(id);
                 }
             }
             Subscription::WindowActivationObservation {
@@ -5465,6 +5470,7 @@ lazy_static! {
 #[derive(Default)]
 pub struct LeakDetector {
     next_handle_id: usize,
+    #[allow(clippy::type_complexity)]
     handle_backtraces: HashMap<
         usize,
         (
@@ -5502,11 +5508,9 @@ impl LeakDetector {
 
     pub fn assert_dropped(&mut self, entity_id: usize) {
         if let Some((type_name, backtraces)) = self.handle_backtraces.get_mut(&entity_id) {
-            for trace in backtraces.values_mut() {
-                if let Some(trace) = trace {
-                    trace.resolve();
-                    eprintln!("{:?}", crate::util::CwdBacktrace(trace));
-                }
+            for trace in backtraces.values_mut().flatten() {
+                trace.resolve();
+                eprintln!("{:?}", crate::util::CwdBacktrace(trace));
             }
 
             let hint = if *LEAK_BACKTRACE {
@@ -5534,11 +5538,9 @@ impl LeakDetector {
                 type_name.unwrap_or("entity"),
                 id
             );
-            for trace in backtraces.values_mut() {
-                if let Some(trace) = trace {
-                    trace.resolve();
-                    eprintln!("{:?}", crate::util::CwdBacktrace(trace));
-                }
+            for trace in backtraces.values_mut().flatten() {
+                trace.resolve();
+                eprintln!("{:?}", crate::util::CwdBacktrace(trace));
             }
             found_leaks = true;
         }
@@ -6586,7 +6588,7 @@ mod tests {
                 let subscription = subscription.clone();
                 move |_, _, e, _| {
                     subscription.borrow_mut().take();
-                    events.borrow_mut().push(e.clone());
+                    events.borrow_mut().push(*e);
                 }
             }));
         });
@@ -7158,8 +7160,8 @@ mod tests {
 
         let model = cx.add_model(|_| Counter(0));
 
-        let condition1 = model.condition(&cx, |model, _| model.0 == 2);
-        let condition2 = model.condition(&cx, |model, _| model.0 == 3);
+        let condition1 = model.condition(cx, |model, _| model.0 == 2);
+        let condition2 = model.condition(cx, |model, _| model.0 == 3);
         smol::pin!(condition1, condition2);
 
         model.update(cx, |model, cx| model.inc(cx));
@@ -7186,7 +7188,7 @@ mod tests {
         }
 
         let model = cx.add_model(|_| Model);
-        model.condition(&cx, |_, _| false).await;
+        model.condition(cx, |_, _| false).await;
     }
 
     #[crate::test(self)]
@@ -7199,7 +7201,7 @@ mod tests {
         }
 
         let model = cx.add_model(|_| Model);
-        let condition = model.condition(&cx, |_, _| false);
+        let condition = model.condition(cx, |_, _| false);
         cx.update(|_| drop(model));
         condition.await;
     }
@@ -7231,8 +7233,8 @@ mod tests {
 
         let (_, view) = cx.add_window(|_| Counter(0));
 
-        let condition1 = view.condition(&cx, |view, _| view.0 == 2);
-        let condition2 = view.condition(&cx, |view, _| view.0 == 3);
+        let condition1 = view.condition(cx, |view, _| view.0 == 2);
+        let condition2 = view.condition(cx, |view, _| view.0 == 3);
         smol::pin!(condition1, condition2);
 
         view.update(cx, |view, cx| view.inc(cx));
@@ -7268,7 +7270,7 @@ mod tests {
         }
 
         let (_, view) = cx.add_window(|_| View);
-        view.condition(&cx, |_, _| false).await;
+        view.condition(cx, |_, _| false).await;
     }
 
     #[crate::test(self)]
@@ -7293,7 +7295,7 @@ mod tests {
         let (_, root_view) = cx.add_window(|_| View);
         let view = cx.add_view(&root_view, |_| View);
 
-        let condition = view.condition(&cx, |_, _| false);
+        let condition = view.condition(cx, |_, _| false);
         cx.update(|_| drop(view));
         condition.await;
     }

crates/gpui/src/elements.rs ๐Ÿ”—

@@ -389,9 +389,9 @@ impl ElementBox {
     }
 }
 
-impl Into<ElementRc> for ElementBox {
-    fn into(self) -> ElementRc {
-        self.0
+impl From<ElementBox> for ElementRc {
+    fn from(val: ElementBox) -> Self {
+        val.0
     }
 }
 

crates/gpui/src/elements/empty.rs ๐Ÿ”—

@@ -11,13 +11,14 @@ use crate::{
 };
 use crate::{Element, Event, EventContext, LayoutContext, PaintContext, SizeConstraint};
 
+#[derive(Default)]
 pub struct Empty {
     collapsed: bool,
 }
 
 impl Empty {
     pub fn new() -> Self {
-        Self { collapsed: false }
+        Self::default()
     }
 
     pub fn collapsed(mut self) -> Self {

crates/gpui/src/elements/expanded.rs ๐Ÿ”—

@@ -24,13 +24,13 @@ impl Expanded {
         }
     }
 
-    pub fn to_full_width(mut self) -> Self {
+    pub fn full_width(mut self) -> Self {
         self.full_width = true;
         self.full_height = false;
         self
     }
 
-    pub fn to_full_height(mut self) -> Self {
+    pub fn full_height(mut self) -> Self {
         self.full_width = false;
         self.full_height = true;
         self

crates/gpui/src/elements/image.rs ๐Ÿ”—

@@ -53,8 +53,8 @@ impl Element for Image {
         _: &mut LayoutContext,
     ) -> (Vector2F, Self::LayoutState) {
         let desired_size = vec2f(
-            self.style.width.unwrap_or(constraint.max.x()),
-            self.style.height.unwrap_or(constraint.max.y()),
+            self.style.width.unwrap_or_else(|| constraint.max.x()),
+            self.style.height.unwrap_or_else(|| constraint.max.y()),
         );
         let size = constrain_size_preserving_aspect_ratio(
             constraint.constrain(desired_size),

crates/gpui/src/elements/list.rs ๐Ÿ”—

@@ -33,6 +33,7 @@ struct StateInner {
     logical_scroll_top: Option<ListOffset>,
     orientation: Orientation,
     overdraw: f32,
+    #[allow(clippy::type_complexity)]
     scroll_handler: Option<Box<dyn FnMut(Range<usize>, &mut EventContext)>>,
 }
 
@@ -311,19 +312,17 @@ impl Element for List {
         drop(cursor);
         state.items = new_items;
 
-        match event {
-            Event::ScrollWheel(ScrollWheelEvent {
-                position,
-                delta,
-                precise,
-            }) => {
-                if bounds.contains_point(*position) {
-                    if state.scroll(scroll_top, bounds.height(), *delta, *precise, cx) {
-                        handled = true;
-                    }
-                }
+        if let Event::ScrollWheel(ScrollWheelEvent {
+            position,
+            delta,
+            precise,
+        }) = event
+        {
+            if bounds.contains_point(*position)
+                && state.scroll(scroll_top, bounds.height(), *delta, *precise, cx)
+            {
+                handled = true;
             }
-            _ => {}
         }
 
         handled

crates/gpui/src/elements/mouse_event_handler.rs ๐Ÿ”—

@@ -129,7 +129,7 @@ impl Element for MouseEventHandler {
 
         cx.scene.push_mouse_region(MouseRegion::from_handlers(
             cx.current_view_id(),
-            Some(self.discriminant.clone()),
+            Some(self.discriminant),
             hit_bounds,
             self.handlers.clone(),
         ));

crates/gpui/src/elements/overlay.rs ๐Ÿ”—

@@ -74,7 +74,7 @@ impl Element for Overlay {
         size: &mut Self::LayoutState,
         cx: &mut PaintContext,
     ) {
-        let mut bounds = RectF::new(self.abs_position.unwrap_or(bounds.origin()), *size);
+        let mut bounds = RectF::new(self.abs_position.unwrap_or_else(|| bounds.origin()), *size);
         cx.scene.push_stacking_context(None);
 
         if self.hoverable {

crates/gpui/src/elements/stack.rs ๐Ÿ”—

@@ -8,15 +8,14 @@ use crate::{
     SizeConstraint,
 };
 
+#[derive(Default)]
 pub struct Stack {
     children: Vec<ElementBox>,
 }
 
 impl Stack {
     pub fn new() -> Self {
-        Stack {
-            children: Vec::new(),
-        }
+        Self::default()
     }
 }
 

crates/gpui/src/elements/text.rs ๐Ÿ”—

@@ -100,7 +100,7 @@ impl Element for Text {
             chunks,
             &self.style,
             cx.text_layout_cache,
-            &cx.font_cache,
+            cx.font_cache,
             usize::MAX,
             self.text.matches('\n').count() + 1,
         );

crates/gpui/src/elements/uniform_list.rs ๐Ÿ”—

@@ -45,6 +45,7 @@ pub struct LayoutState {
 pub struct UniformList {
     state: UniformListState,
     item_count: usize,
+    #[allow(clippy::type_complexity)]
     append_items: Box<dyn Fn(Range<usize>, &mut Vec<ElementBox>, &mut LayoutContext)>,
     padding_top: f32,
     padding_bottom: f32,
@@ -310,19 +311,17 @@ impl Element for UniformList {
             handled = item.dispatch_event(event, cx) || handled;
         }
 
-        match event {
-            Event::ScrollWheel(ScrollWheelEvent {
-                position,
-                delta,
-                precise,
-            }) => {
-                if bounds.contains_point(*position) {
-                    if self.scroll(*position, *delta, *precise, layout.scroll_max, cx) {
-                        handled = true;
-                    }
-                }
+        if let Event::ScrollWheel(ScrollWheelEvent {
+            position,
+            delta,
+            precise,
+        }) = event
+        {
+            if bounds.contains_point(*position)
+                && self.scroll(*position, *delta, *precise, layout.scroll_max, cx)
+            {
+                handled = true;
             }
-            _ => {}
         }
 
         handled

crates/gpui/src/executor.rs ๐Ÿ”—

@@ -332,7 +332,7 @@ impl Deterministic {
 
     pub fn now(&self) -> std::time::Instant {
         let state = self.state.lock();
-        state.now.clone()
+        state.now
     }
 
     pub fn advance_clock(&self, duration: Duration) {
@@ -681,6 +681,12 @@ impl Background {
     }
 }
 
+impl Default for Background {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
 pub struct Scope<'a> {
     executor: Arc<Background>,
     futures: Vec<Pin<Box<dyn Future<Output = ()> + Send + 'static>>>,

crates/gpui/src/font_cache.rs ๐Ÿ”—

@@ -117,7 +117,7 @@ impl FontCache {
                 .font_selections
                 .entry(family_id)
                 .or_default()
-                .insert(properties.clone(), font_id);
+                .insert(*properties, font_id);
             Ok(font_id)
         }
     }
@@ -257,10 +257,10 @@ mod tests {
         let arial = fonts.load_family(&["Arial"]).unwrap();
         let arial_regular = fonts.select_font(arial, &Properties::new()).unwrap();
         let arial_italic = fonts
-            .select_font(arial, &Properties::new().style(Style::Italic))
+            .select_font(arial, Properties::new().style(Style::Italic))
             .unwrap();
         let arial_bold = fonts
-            .select_font(arial, &Properties::new().weight(Weight::BOLD))
+            .select_font(arial, Properties::new().weight(Weight::BOLD))
             .unwrap();
         assert_ne!(arial_regular, arial_italic);
         assert_ne!(arial_regular, arial_bold);

crates/gpui/src/fonts.rs ๐Ÿ”—

@@ -332,8 +332,7 @@ impl<'de> Deserialize<'de> for TextStyle {
     where
         D: serde::Deserializer<'de>,
     {
-        Ok(Self::from_json(TextStyleJson::deserialize(deserializer)?)
-            .map_err(|e| de::Error::custom(e))?)
+        Self::from_json(TextStyleJson::deserialize(deserializer)?).map_err(de::Error::custom)
     }
 }
 

crates/gpui/src/geometry.rs ๐Ÿ”—

@@ -19,6 +19,12 @@ enum PathVertexKind {
     Quadratic,
 }
 
+impl Default for PathBuilder {
+    fn default() -> Self {
+        PathBuilder::new()
+    }
+}
+
 impl PathBuilder {
     pub fn new() -> Self {
         Self {
@@ -58,10 +64,7 @@ impl PathBuilder {
 
     pub fn build(mut self, color: Color, clip_bounds: Option<RectF>) -> Path {
         if let Some(clip_bounds) = clip_bounds {
-            self.bounds = self
-                .bounds
-                .intersection(clip_bounds)
-                .unwrap_or(RectF::default());
+            self.bounds = self.bounds.intersection(clip_bounds).unwrap_or_default();
         }
         Path {
             bounds: self.bounds,

crates/gpui/src/keymap.rs ๐Ÿ”—

@@ -202,7 +202,7 @@ impl Keymap {
         for (ix, binding) in bindings.iter().enumerate() {
             binding_indices_by_action_type
                 .entry(binding.action.as_any().type_id())
-                .or_insert_with(|| SmallVec::new())
+                .or_insert_with(SmallVec::new)
                 .push(ix);
         }
         Self {
@@ -211,10 +211,7 @@ impl Keymap {
         }
     }
 
-    fn bindings_for_action_type<'a>(
-        &'a self,
-        action_type: TypeId,
-    ) -> impl Iterator<Item = &'a Binding> {
+    fn bindings_for_action_type(&self, action_type: TypeId) -> impl Iterator<Item = &'_ Binding> {
         self.binding_indices_by_action_type
             .get(&action_type)
             .map(SmallVec::as_slice)
@@ -253,7 +250,7 @@ impl Binding {
 
         let keystrokes = keystrokes
             .split_whitespace()
-            .map(|key| Keystroke::parse(key))
+            .map(Keystroke::parse)
             .collect::<Result<_>>()?;
 
         Ok(Self {
@@ -281,7 +278,7 @@ impl Keystroke {
         let mut function = false;
         let mut key = None;
 
-        let mut components = source.split("-").peekable();
+        let mut components = source.split('-').peekable();
         while let Some(component) = components.next() {
             match component {
                 "ctrl" => ctrl = true,
@@ -379,12 +376,12 @@ impl ContextPredicate {
         let kind = node.kind();
 
         match kind {
-            "source" => Self::from_node(node.child(0).ok_or(anyhow!(parse_error))?, source),
+            "source" => Self::from_node(node.child(0).ok_or_else(|| anyhow!(parse_error))?, source),
             "identifier" => Ok(Self::Identifier(node.utf8_text(source)?.into())),
             "not" => {
                 let child = Self::from_node(
                     node.child_by_field_name("expression")
-                        .ok_or(anyhow!(parse_error))?,
+                        .ok_or_else(|| anyhow!(parse_error))?,
                     source,
                 )?;
                 Ok(Self::Not(Box::new(child)))
@@ -392,12 +389,12 @@ impl ContextPredicate {
             "and" | "or" => {
                 let left = Box::new(Self::from_node(
                     node.child_by_field_name("left")
-                        .ok_or(anyhow!(parse_error))?,
+                        .ok_or_else(|| anyhow!(parse_error))?,
                     source,
                 )?);
                 let right = Box::new(Self::from_node(
                     node.child_by_field_name("right")
-                        .ok_or(anyhow!(parse_error))?,
+                        .ok_or_else(|| anyhow!(parse_error))?,
                     source,
                 )?);
                 if kind == "and" {
@@ -409,12 +406,12 @@ impl ContextPredicate {
             "equal" | "not_equal" => {
                 let left = node
                     .child_by_field_name("left")
-                    .ok_or(anyhow!(parse_error))?
+                    .ok_or_else(|| anyhow!(parse_error))?
                     .utf8_text(source)?
                     .into();
                 let right = node
                     .child_by_field_name("right")
-                    .ok_or(anyhow!(parse_error))?
+                    .ok_or_else(|| anyhow!(parse_error))?
                     .utf8_text(source)?
                     .into();
                 if kind == "equal" {
@@ -425,7 +422,7 @@ impl ContextPredicate {
             }
             "parenthesized" => Self::from_node(
                 node.child_by_field_name("expression")
-                    .ok_or(anyhow!(parse_error))?,
+                    .ok_or_else(|| anyhow!(parse_error))?,
                 source,
             ),
             _ => Err(anyhow!(parse_error)),
@@ -604,7 +601,7 @@ mod tests {
         Ok(())
     }
 
-    fn downcast<'a, A: Action>(action: &'a Option<Box<dyn Action>>) -> Option<&'a A> {
+    fn downcast<A: Action>(action: &Option<Box<dyn Action>>) -> Option<&A> {
         action
             .as_ref()
             .and_then(|action| action.as_any().downcast_ref())

crates/gpui/src/platform.rs ๐Ÿ”—

@@ -74,7 +74,7 @@ pub(crate) trait ForegroundPlatform {
     fn on_quit(&self, callback: Box<dyn FnMut()>);
     fn on_event(&self, callback: Box<dyn FnMut(Event) -> bool>);
     fn on_open_urls(&self, callback: Box<dyn FnMut(Vec<String>)>);
-    fn run(&self, on_finish_launching: Box<dyn FnOnce() -> ()>);
+    fn run(&self, on_finish_launching: Box<dyn FnOnce()>);
 
     fn on_menu_command(&self, callback: Box<dyn FnMut(&dyn Action)>);
     fn on_validate_menu_command(&self, callback: Box<dyn FnMut(&dyn Action) -> bool>);

crates/gpui/src/platform/mac/event.rs ๐Ÿ”—

@@ -223,7 +223,7 @@ unsafe fn parse_keystroke(native_event: id) -> Keystroke {
     let cmd = modifiers.contains(NSEventModifierFlags::NSCommandKeyMask);
     let function = modifiers.contains(NSEventModifierFlags::NSFunctionKeyMask)
         && first_char.map_or(true, |ch| {
-            ch < NSUpArrowFunctionKey || ch > NSModeSwitchFunctionKey
+            !(NSUpArrowFunctionKey..=NSModeSwitchFunctionKey).contains(&ch)
         });
 
     #[allow(non_upper_case_globals)]

crates/gpui/src/platform/mac/fonts.rs ๐Ÿ”—

@@ -53,6 +53,12 @@ impl FontSystem {
     }
 }
 
+impl Default for FontSystem {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
 impl platform::FontSystem for FontSystem {
     fn add_fonts(&self, fonts: &[Arc<Vec<u8>>]) -> anyhow::Result<()> {
         self.0.write().add_fonts(fonts)
@@ -402,7 +408,7 @@ impl FontSystemState {
     fn wrap_line(&self, text: &str, font_id: FontId, font_size: f32, width: f32) -> Vec<usize> {
         let mut string = CFMutableAttributedString::new();
         string.replace_str(&CFString::new(text), CFRange::init(0, 0));
-        let cf_range = CFRange::init(0 as isize, text.encode_utf16().count() as isize);
+        let cf_range = CFRange::init(0, text.encode_utf16().count() as isize);
         let font = &self.fonts[font_id.0];
         unsafe {
             string.set_attribute(
@@ -505,14 +511,14 @@ mod tests {
         };
         let menlo_italic = RunStyle {
             font_id: fonts
-                .select_font(&menlo, &Properties::new().style(Style::Italic))
+                .select_font(&menlo, Properties::new().style(Style::Italic))
                 .unwrap(),
             color: Default::default(),
             underline: Default::default(),
         };
         let menlo_bold = RunStyle {
             font_id: fonts
-                .select_font(&menlo, &Properties::new().weight(Weight::BOLD))
+                .select_font(&menlo, Properties::new().weight(Weight::BOLD))
                 .unwrap(),
             color: Default::default(),
             underline: Default::default(),
@@ -599,7 +605,7 @@ mod tests {
             let name = format!("/Users/as-cii/Desktop/twog-{}.png", i);
             let path = Path::new(&name);
             let file = File::create(path).unwrap();
-            let ref mut w = BufWriter::new(file);
+            let w = &mut BufWriter::new(file);
 
             let mut encoder = png::Encoder::new(w, bounds.width() as u32, bounds.height() as u32);
             encoder.set_color(png::ColorType::Grayscale);

crates/gpui/src/platform/mac/platform.rs ๐Ÿ”—

@@ -50,7 +50,7 @@ use time::UtcOffset;
 #[allow(non_upper_case_globals)]
 const NSUTF8StringEncoding: NSUInteger = 4;
 
-const MAC_PLATFORM_IVAR: &'static str = "platform";
+const MAC_PLATFORM_IVAR: &str = "platform";
 static mut APP_CLASS: *const Class = ptr::null();
 static mut APP_DELEGATE_CLASS: *const Class = ptr::null();
 
@@ -118,7 +118,7 @@ pub struct MacForegroundPlatformState {
     validate_menu_command: Option<Box<dyn FnMut(&dyn Action) -> bool>>,
     will_open_menu: Option<Box<dyn FnMut()>>,
     open_urls: Option<Box<dyn FnMut(Vec<String>)>>,
-    finish_launching: Option<Box<dyn FnOnce() -> ()>>,
+    finish_launching: Option<Box<dyn FnOnce()>>,
     menu_actions: Vec<Box<dyn Action>>,
 }
 
@@ -277,7 +277,7 @@ impl platform::ForegroundPlatform for MacForegroundPlatform {
         self.0.borrow_mut().open_urls = Some(callback);
     }
 
-    fn run(&self, on_finish_launching: Box<dyn FnOnce() -> ()>) {
+    fn run(&self, on_finish_launching: Box<dyn FnOnce()>) {
         self.0.borrow_mut().finish_launching = Some(on_finish_launching);
 
         unsafe {
@@ -533,7 +533,7 @@ impl platform::Platform for MacPlatform {
     fn read_from_clipboard(&self) -> Option<ClipboardItem> {
         unsafe {
             if let Some(text_bytes) = self.read_from_pasteboard(NSPasteboardTypeString) {
-                let text = String::from_utf8_lossy(&text_bytes).to_string();
+                let text = String::from_utf8_lossy(text_bytes).to_string();
                 let hash_bytes = self
                     .read_from_pasteboard(self.text_hash_pasteboard_type)
                     .and_then(|bytes| bytes.try_into().ok())

crates/gpui/src/platform/mac/renderer.rs ๐Ÿ”—

@@ -14,8 +14,7 @@ use metal::{MTLPixelFormat, MTLResourceOptions, NSRange};
 use shaders::ToFloat2 as _;
 use std::{collections::HashMap, ffi::c_void, iter::Peekable, mem, sync::Arc, vec};
 
-const SHADERS_METALLIB: &'static [u8] =
-    include_bytes!(concat!(env!("OUT_DIR"), "/shaders.metallib"));
+const SHADERS_METALLIB: &[u8] = include_bytes!(concat!(env!("OUT_DIR"), "/shaders.metallib"));
 const INSTANCE_BUFFER_SIZE: usize = 8192 * 1024; // This is an arbitrary decision. There's probably a more optimal value.
 
 pub struct Renderer {
@@ -385,10 +384,10 @@ impl Renderer {
         drawable_size: Vector2F,
         command_encoder: &metal::RenderCommandEncoderRef,
     ) {
-        let clip_bounds = (layer.clip_bounds().unwrap_or(RectF::new(
-            vec2f(0., 0.),
-            drawable_size / scene.scale_factor(),
-        )) * scene.scale_factor())
+        let clip_bounds = (layer
+            .clip_bounds()
+            .unwrap_or_else(|| RectF::new(vec2f(0., 0.), drawable_size / scene.scale_factor()))
+            * scene.scale_factor())
         .round();
         command_encoder.set_scissor_rect(metal::MTLScissorRect {
             x: clip_bounds.origin_x() as NSUInteger,
@@ -438,8 +437,7 @@ impl Renderer {
         );
 
         let buffer_contents = unsafe {
-            (self.instances.contents() as *mut u8).offset(*offset as isize)
-                as *mut shaders::GPUIShadow
+            (self.instances.contents() as *mut u8).add(*offset) as *mut shaders::GPUIShadow
         };
         for (ix, shadow) in shadows.iter().enumerate() {
             let shape_bounds = shadow.bounds * scale_factor;
@@ -451,7 +449,7 @@ impl Renderer {
                 color: shadow.color.to_uchar4(),
             };
             unsafe {
-                *(buffer_contents.offset(ix as isize)) = shader_shadow;
+                *(buffer_contents.add(ix)) = shader_shadow;
             }
         }
 
@@ -503,8 +501,7 @@ impl Renderer {
         );
 
         let buffer_contents = unsafe {
-            (self.instances.contents() as *mut u8).offset(*offset as isize)
-                as *mut shaders::GPUIQuad
+            (self.instances.contents() as *mut u8).add(*offset) as *mut shaders::GPUIQuad
         };
         for (ix, quad) in quads.iter().enumerate() {
             let bounds = quad.bounds * scale_factor;
@@ -514,7 +511,7 @@ impl Renderer {
                 size: bounds.size().round().to_float2(),
                 background_color: quad
                     .background
-                    .unwrap_or(Color::transparent_black())
+                    .unwrap_or_else(Color::transparent_black)
                     .to_uchar4(),
                 border_top: border_width * (quad.border.top as usize as f32),
                 border_right: border_width * (quad.border.right as usize as f32),
@@ -524,7 +521,7 @@ impl Renderer {
                 corner_radius: quad.corner_radius * scale_factor,
             };
             unsafe {
-                *(buffer_contents.offset(ix as isize)) = shader_quad;
+                *(buffer_contents.add(ix)) = shader_quad;
             }
         }
 
@@ -641,9 +638,8 @@ impl Renderer {
             );
 
             unsafe {
-                let buffer_contents = (self.instances.contents() as *mut u8)
-                    .offset(*offset as isize)
-                    as *mut shaders::GPUISprite;
+                let buffer_contents =
+                    (self.instances.contents() as *mut u8).add(*offset) as *mut shaders::GPUISprite;
                 std::ptr::copy_nonoverlapping(sprites.as_ptr(), buffer_contents, sprites.len());
             }
 
@@ -757,9 +753,8 @@ impl Renderer {
             );
 
             unsafe {
-                let buffer_contents = (self.instances.contents() as *mut u8)
-                    .offset(*offset as isize)
-                    as *mut shaders::GPUIImage;
+                let buffer_contents =
+                    (self.instances.contents() as *mut u8).add(*offset) as *mut shaders::GPUIImage;
                 std::ptr::copy_nonoverlapping(images.as_ptr(), buffer_contents, images.len());
             }
 
@@ -821,10 +816,9 @@ impl Renderer {
             }
 
             unsafe {
-                let buffer_contents = (self.instances.contents() as *mut u8)
-                    .offset(*offset as isize)
-                    as *mut shaders::GPUISprite;
-                *buffer_contents.offset(atlas_sprite_count as isize) = sprite.shader_data;
+                let buffer_contents =
+                    (self.instances.contents() as *mut u8).add(*offset) as *mut shaders::GPUISprite;
+                *buffer_contents.add(atlas_sprite_count) = sprite.shader_data;
             }
 
             atlas_sprite_count += 1;
@@ -917,8 +911,7 @@ impl Renderer {
         );
 
         let buffer_contents = unsafe {
-            (self.instances.contents() as *mut u8).offset(*offset as isize)
-                as *mut shaders::GPUIUnderline
+            (self.instances.contents() as *mut u8).add(*offset) as *mut shaders::GPUIUnderline
         };
         for (ix, underline) in underlines.iter().enumerate() {
             let origin = underline.origin * scale_factor;
@@ -935,7 +928,7 @@ impl Renderer {
                 squiggly: underline.squiggly as u8,
             };
             unsafe {
-                *(buffer_contents.offset(ix as isize)) = shader_underline;
+                *(buffer_contents.add(ix)) = shader_underline;
             }
         }
 

crates/gpui/src/platform/mac/window.rs ๐Ÿ”—

@@ -48,7 +48,7 @@ use std::{
     time::Duration,
 };
 
-const WINDOW_STATE_IVAR: &'static str = "windowState";
+const WINDOW_STATE_IVAR: &str = "windowState";
 
 static mut WINDOW_CLASS: *const Class = ptr::null();
 static mut VIEW_CLASS: *const Class = ptr::null();
@@ -72,7 +72,7 @@ impl NSRange {
         self.location != NSNotFound as NSUInteger
     }
 
-    fn to_range(&self) -> Option<Range<usize>> {
+    fn to_range(self) -> Option<Range<usize>> {
         if self.is_valid() {
             let start = self.location as usize;
             let end = start + self.length as usize;
@@ -513,7 +513,7 @@ impl platform::Window for Window {
             };
             let _: () = msg_send![alert, setAlertStyle: alert_style];
             let _: () = msg_send![alert, setMessageText: ns_string(msg)];
-            for (ix, answer) in answers.into_iter().enumerate() {
+            for (ix, answer) in answers.iter().enumerate() {
                 let button: id = msg_send![alert, addButtonWithTitle: ns_string(answer)];
                 let _: () = msg_send![button, setTag: ix as NSInteger];
             }
@@ -721,14 +721,14 @@ extern "C" fn yes(_: &Object, _: Sel) -> BOOL {
 extern "C" fn dealloc_window(this: &Object, _: Sel) {
     unsafe {
         drop_window_state(this);
-        let () = msg_send![super(this, class!(NSWindow)), dealloc];
+        let _: () = msg_send![super(this, class!(NSWindow)), dealloc];
     }
 }
 
 extern "C" fn dealloc_view(this: &Object, _: Sel) {
     unsafe {
         drop_window_state(this);
-        let () = msg_send![super(this, class!(NSView)), dealloc];
+        let _: () = msg_send![super(this, class!(NSView)), dealloc];
     }
 }
 
@@ -912,7 +912,7 @@ extern "C" fn cancel_operation(this: &Object, _sel: Sel, _sender: id) {
 
 extern "C" fn send_event(this: &Object, _: Sel, native_event: id) {
     unsafe {
-        let () = msg_send![super(this, class!(NSWindow)), sendEvent: native_event];
+        let _: () = msg_send![super(this, class!(NSWindow)), sendEvent: native_event];
         get_window_state(this).borrow_mut().performed_key_equivalent = false;
     }
 }
@@ -991,7 +991,7 @@ extern "C" fn close_window(this: &Object, _: Sel) {
             callback();
         }
 
-        let () = msg_send![super(this, class!(NSWindow)), close];
+        let _: () = msg_send![super(this, class!(NSWindow)), close];
     }
 }
 
@@ -1157,17 +1157,22 @@ extern "C" fn insert_text(this: &Object, _: Sel, text: id, replacement_range: NS
                 .flatten()
                 .is_some();
 
-        if is_composing || text.chars().count() > 1 || pending_key_down.is_none() {
-            with_input_handler(this, |input_handler| {
-                input_handler.replace_text_in_range(replacement_range, text)
-            });
-        } else {
-            let mut pending_key_down = pending_key_down.unwrap();
-            pending_key_down.1 = Some(InsertText {
-                replacement_range,
-                text: text.to_string(),
-            });
-            window_state.borrow_mut().pending_key_down = Some(pending_key_down);
+        match pending_key_down {
+            None | Some(_) if is_composing || text.chars().count() > 1 => {
+                with_input_handler(this, |input_handler| {
+                    input_handler.replace_text_in_range(replacement_range, text)
+                });
+            }
+
+            Some(mut pending_key_down) => {
+                pending_key_down.1 = Some(InsertText {
+                    replacement_range,
+                    text: text.to_string(),
+                });
+                window_state.borrow_mut().pending_key_down = Some(pending_key_down);
+            }
+
+            _ => unreachable!(),
         }
     }
 }

crates/gpui/src/platform/test.rs ๐Ÿ”—

@@ -74,7 +74,7 @@ impl super::ForegroundPlatform for ForegroundPlatform {
 
     fn on_open_urls(&self, _: Box<dyn FnMut(Vec<String>)>) {}
 
-    fn run(&self, _on_finish_launching: Box<dyn FnOnce() -> ()>) {
+    fn run(&self, _on_finish_launching: Box<dyn FnOnce()>) {
         unimplemented!()
     }
 

crates/gpui/src/presenter.rs ๐Ÿ”—

@@ -89,8 +89,8 @@ impl Presenter {
     ) {
         cx.start_frame();
         for view_id in &invalidation.removed {
-            invalidation.updated.remove(&view_id);
-            self.rendered_views.remove(&view_id);
+            invalidation.updated.remove(view_id);
+            self.rendered_views.remove(view_id);
         }
         for view_id in &invalidation.updated {
             self.rendered_views.insert(
@@ -285,7 +285,7 @@ impl Presenter {
                     {
                         dragged_region = Some((
                             clicked_region.clone(),
-                            MouseRegionEvent::Drag(*prev_drag_position, e.clone()),
+                            MouseRegionEvent::Drag(*prev_drag_position, *e),
                         ));
                         *prev_drag_position = *position;
                     }
@@ -366,7 +366,7 @@ impl Presenter {
             },
         ) = event
         {
-            if let None = pressed_button {
+            if pressed_button.is_none() {
                 let mut style_to_assign = CursorStyle::Arrow;
                 for region in self.cursor_regions.iter().rev() {
                     if region.bounds.contains_point(*position) {
@@ -385,23 +385,17 @@ impl Presenter {
                         if let Some(region_id) = region.id() {
                             if !self.hovered_region_ids.contains(&region_id) {
                                 invalidated_views.push(region.view_id);
-                                hover_regions.push((
-                                    region.clone(),
-                                    MouseRegionEvent::Hover(true, e.clone()),
-                                ));
+                                hover_regions
+                                    .push((region.clone(), MouseRegionEvent::Hover(true, *e)));
                                 self.hovered_region_ids.insert(region_id);
                             }
                         }
-                    } else {
-                        if let Some(region_id) = region.id() {
-                            if self.hovered_region_ids.contains(&region_id) {
-                                invalidated_views.push(region.view_id);
-                                hover_regions.push((
-                                    region.clone(),
-                                    MouseRegionEvent::Hover(false, e.clone()),
-                                ));
-                                self.hovered_region_ids.remove(&region_id);
-                            }
+                    } else if let Some(region_id) = region.id() {
+                        if self.hovered_region_ids.contains(&region_id) {
+                            invalidated_views.push(region.view_id);
+                            hover_regions
+                                .push((region.clone(), MouseRegionEvent::Hover(false, *e)));
+                            self.hovered_region_ids.remove(&region_id);
                         }
                     }
                 }
@@ -625,7 +619,7 @@ impl<'a> PaintContext<'a> {
     #[inline]
     pub fn paint_layer<F>(&mut self, clip_bounds: Option<RectF>, f: F)
     where
-        F: FnOnce(&mut Self) -> (),
+        F: FnOnce(&mut Self),
     {
         self.scene.push_layer(clip_bounds);
         f(self);

crates/gpui/src/scene/mouse_region.rs ๐Ÿ”—

@@ -107,6 +107,7 @@ pub struct MouseRegionId {
 
 #[derive(Clone, Default)]
 pub struct HandlerSet {
+    #[allow(clippy::type_complexity)]
     pub set: HashMap<
         (Discriminant<MouseRegionEvent>, Option<MouseButton>),
         Rc<dyn Fn(MouseRegionEvent, &mut EventContext)>,
@@ -115,6 +116,7 @@ pub struct HandlerSet {
 
 impl HandlerSet {
     pub fn handle_all() -> Self {
+        #[allow(clippy::type_complexity)]
         let mut set: HashMap<
             (Discriminant<MouseRegionEvent>, Option<MouseButton>),
             Rc<dyn Fn(MouseRegionEvent, &mut EventContext)>,

crates/gpui/src/text_layout.rs ๐Ÿ”—

@@ -66,7 +66,7 @@ impl TextLayoutCache {
         let mut curr_frame = RwLockUpgradableReadGuard::upgrade(curr_frame);
         if let Some((key, layout)) = self.prev_frame.lock().remove_entry(key) {
             curr_frame.insert(key, layout.clone());
-            Line::new(layout.clone(), runs)
+            Line::new(layout, runs)
         } else {
             let layout = Arc::new(self.fonts.layout_line(text, font_size, runs));
             let key = CacheKeyValue {
@@ -81,7 +81,7 @@ impl TextLayoutCache {
 }
 
 trait CacheKey {
-    fn key<'a>(&'a self) -> CacheKeyRef<'a>;
+    fn key(&self) -> CacheKeyRef;
 }
 
 impl<'a> PartialEq for (dyn CacheKey + 'a) {
@@ -98,7 +98,7 @@ impl<'a> Hash for (dyn CacheKey + 'a) {
     }
 }
 
-#[derive(Eq, PartialEq)]
+#[derive(Eq)]
 struct CacheKeyValue {
     text: String,
     font_size: OrderedFloat<f32>,
@@ -106,15 +106,21 @@ struct CacheKeyValue {
 }
 
 impl CacheKey for CacheKeyValue {
-    fn key<'a>(&'a self) -> CacheKeyRef<'a> {
+    fn key(&self) -> CacheKeyRef {
         CacheKeyRef {
-            text: &self.text.as_str(),
+            text: self.text.as_str(),
             font_size: self.font_size,
             runs: self.runs.as_slice(),
         }
     }
 }
 
+impl PartialEq for CacheKeyValue {
+    fn eq(&self, other: &Self) -> bool {
+        self.key().eq(&other.key())
+    }
+}
+
 impl Hash for CacheKeyValue {
     fn hash<H: Hasher>(&self, state: &mut H) {
         self.key().hash(state);
@@ -135,7 +141,7 @@ struct CacheKeyRef<'a> {
 }
 
 impl<'a> CacheKey for CacheKeyRef<'a> {
-    fn key<'b>(&'b self) -> CacheKeyRef<'b> {
+    fn key(&self) -> CacheKeyRef {
         *self
     }
 }
@@ -242,6 +248,10 @@ impl Line {
         self.layout.len
     }
 
+    pub fn is_empty(&self) -> bool {
+        self.layout.len == 0
+    }
+
     pub fn index_for_x(&self, x: f32) -> Option<usize> {
         if x >= self.layout.width {
             None
@@ -300,7 +310,7 @@ impl Line {
                                 ),
                                 Underline {
                                     color: Some(run_underline.color.unwrap_or(*run_color)),
-                                    thickness: run_underline.thickness.into(),
+                                    thickness: run_underline.thickness,
                                     squiggly: run_underline.squiggly,
                                 },
                             ));
@@ -484,7 +494,7 @@ impl LineWrapper {
         let mut prev_c = '\0';
         let mut char_indices = line.char_indices();
         iter::from_fn(move || {
-            while let Some((ix, c)) = char_indices.next() {
+            for (ix, c) in char_indices.by_ref() {
                 if c == '\n' {
                     continue;
                 }
@@ -746,7 +756,7 @@ mod tests {
         let mut wrapper = LineWrapper::new(font_id, 16., font_system);
         assert_eq!(
             wrapper
-                .wrap_shaped_line(&text, &line, 72.0)
+                .wrap_shaped_line(text, &line, 72.0)
                 .collect::<Vec<_>>(),
             &[
                 ShapedBoundary {

crates/gpui_macros/src/gpui_macros.rs ๐Ÿ”—

@@ -25,7 +25,7 @@ pub fn test(args: TokenStream, function: TokenStream) -> TokenStream {
             NestedMeta::Meta(Meta::NameValue(meta)) => {
                 let key_name = meta.path.get_ident().map(|i| i.to_string());
                 let result = (|| {
-                    match key_name.as_ref().map(String::as_str) {
+                    match key_name.as_deref() {
                         Some("retries") => max_retries = parse_int(&meta.lit)?,
                         Some("iterations") => num_iterations = parse_int(&meta.lit)?,
                         Some("seed") => starting_seed = parse_int(&meta.lit)?,

crates/language/src/buffer.rs ๐Ÿ”—

@@ -442,12 +442,11 @@ impl Buffer {
     }
 
     fn build(buffer: TextBuffer, file: Option<Arc<dyn File>>) -> Self {
-        let saved_mtime;
-        if let Some(file) = file.as_ref() {
-            saved_mtime = file.mtime();
+        let saved_mtime = if let Some(file) = file.as_ref() {
+            file.mtime()
         } else {
-            saved_mtime = UNIX_EPOCH;
-        }
+            UNIX_EPOCH
+        };
 
         Self {
             saved_mtime,
@@ -737,9 +736,7 @@ impl Buffer {
                             this.parsing_in_background = false;
                             this.did_finish_parsing(new_tree, parsed_version, cx);
 
-                            if parse_again && this.reparse(cx) {
-                                return;
-                            }
+                            if parse_again && this.reparse(cx) {}
                         });
                     })
                     .detach();
@@ -933,10 +930,12 @@ impl Buffer {
                                 indent_sizes.entry(row).or_insert_with(|| {
                                     let mut size = snapshot.indent_size_for_line(row);
                                     if size.kind == new_indent.kind {
-                                        if delta > 0 {
-                                            size.len = size.len + delta as u32;
-                                        } else if delta < 0 {
-                                            size.len = size.len.saturating_sub(-delta as u32);
+                                        match delta.cmp(&0) {
+                                            Ordering::Greater => size.len += delta as u32,
+                                            Ordering::Less => {
+                                                size.len = size.len.saturating_sub(-delta as u32)
+                                            }
+                                            Ordering::Equal => {}
                                         }
                                     }
                                     size
@@ -961,7 +960,7 @@ impl Buffer {
         let edits: Vec<_> = indent_sizes
             .into_iter()
             .filter_map(|(row, indent_size)| {
-                let current_size = indent_size_for_line(&self, row);
+                let current_size = indent_size_for_line(self, row);
                 Self::edit_for_indent_size_adjustment(row, current_size, indent_size)
             })
             .collect();
@@ -978,21 +977,23 @@ impl Buffer {
             return None;
         }
 
-        if new_size.len > current_size.len {
-            let point = Point::new(row, 0);
-            Some((
-                point..point,
-                iter::repeat(new_size.char())
-                    .take((new_size.len - current_size.len) as usize)
-                    .collect::<String>(),
-            ))
-        } else if new_size.len < current_size.len {
-            Some((
+        match new_size.len.cmp(&current_size.len) {
+            Ordering::Greater => {
+                let point = Point::new(row, 0);
+                Some((
+                    point..point,
+                    iter::repeat(new_size.char())
+                        .take((new_size.len - current_size.len) as usize)
+                        .collect::<String>(),
+                ))
+            }
+
+            Ordering::Less => Some((
                 Point::new(row, 0)..Point::new(row, current_size.len - new_size.len),
                 String::new(),
-            ))
-        } else {
-            None
+            )),
+
+            Ordering::Equal => None,
         }
     }
 
@@ -1599,7 +1600,7 @@ impl Deref for Buffer {
 
 impl BufferSnapshot {
     pub fn indent_size_for_line(&self, row: u32) -> IndentSize {
-        indent_size_for_line(&self, row)
+        indent_size_for_line(self, row)
     }
 
     pub fn single_indent_size(&self, cx: &AppContext) -> IndentSize {
@@ -1643,10 +1644,10 @@ impl BufferSnapshot {
         result
     }
 
-    fn suggest_autoindents<'a>(
-        &'a self,
+    fn suggest_autoindents(
+        &self,
         row_range: Range<u32>,
-    ) -> Option<impl Iterator<Item = Option<IndentSuggestion>> + 'a> {
+    ) -> Option<impl Iterator<Item = Option<IndentSuggestion>> + '_> {
         let language = self.language.as_ref()?;
         let grammar = language.grammar.as_ref()?;
         let config = &language.config;
@@ -1675,7 +1676,7 @@ impl BufferSnapshot {
                     start.get_or_insert(Point::from_ts_point(capture.node.start_position()));
                     end.get_or_insert(Point::from_ts_point(capture.node.end_position()));
                 } else if Some(capture.index) == end_capture_ix {
-                    end = Some(Point::from_ts_point(capture.node.start_position().into()));
+                    end = Some(Point::from_ts_point(capture.node.start_position()));
                 }
             }
 
@@ -1733,15 +1734,17 @@ impl BufferSnapshot {
             let mut outdent_to_row = u32::MAX;
 
             while let Some((indent_row, delta)) = indent_changes.peek() {
-                if *indent_row == row {
-                    match delta {
+                match indent_row.cmp(&row) {
+                    Ordering::Equal => match delta {
                         Ordering::Less => outdent_from_prev_row = true,
                         Ordering::Greater => indent_from_prev_row = true,
                         _ => {}
-                    }
-                } else if *indent_row > row {
-                    break;
+                    },
+
+                    Ordering::Greater => break,
+                    Ordering::Less => {}
                 }
+
                 indent_changes.next();
             }
 
@@ -1805,11 +1808,7 @@ impl BufferSnapshot {
         None
     }
 
-    pub fn chunks<'a, T: ToOffset>(
-        &'a self,
-        range: Range<T>,
-        language_aware: bool,
-    ) -> BufferChunks<'a> {
+    pub fn chunks<T: ToOffset>(&self, range: Range<T>, language_aware: bool) -> BufferChunks {
         let range = range.start.to_offset(self)..range.end.to_offset(self);
 
         let mut tree = None;
@@ -1843,7 +1842,7 @@ impl BufferSnapshot {
         )
     }
 
-    pub fn for_each_line<'a>(&'a self, range: Range<Point>, mut callback: impl FnMut(u32, &str)) {
+    pub fn for_each_line(&self, range: Range<Point>, mut callback: impl FnMut(u32, &str)) {
         let mut line = String::new();
         let mut row = range.start.row;
         for chunk in self
@@ -1969,7 +1968,7 @@ impl BufferSnapshot {
         position: T,
         theme: Option<&SyntaxTheme>,
     ) -> Option<Vec<OutlineItem<Anchor>>> {
-        let position = position.to_offset(&self);
+        let position = position.to_offset(self);
         let mut items =
             self.outline_items_containing(position.saturating_sub(1)..position + 1, theme)?;
         let mut prev_depth = None;
@@ -2050,7 +2049,7 @@ impl BufferSnapshot {
 
                     let mut offset = range.start;
                     chunks.seek(offset);
-                    while let Some(mut chunk) = chunks.next() {
+                    for mut chunk in chunks.by_ref() {
                         if chunk.text.len() > range.end - offset {
                             chunk.text = &chunk.text[0..(range.end - offset)];
                             offset = range.end;
@@ -2105,7 +2104,7 @@ impl BufferSnapshot {
         let range = range.start.to_offset(self).saturating_sub(1)..range.end.to_offset(self) + 1;
         let mut cursor = QueryCursorHandle::new();
         let matches = cursor.set_byte_range(range).matches(
-            &brackets_query,
+            brackets_query,
             tree.root_node(),
             TextProvider(self.as_rope()),
         );
@@ -2120,17 +2119,17 @@ impl BufferSnapshot {
             .min_by_key(|(open_range, close_range)| close_range.end - open_range.start)
     }
 
-    pub fn remote_selections_in_range<'a>(
-        &'a self,
+    #[allow(clippy::type_complexity)]
+    pub fn remote_selections_in_range(
+        &self,
         range: Range<Anchor>,
-    ) -> impl 'a
-           + Iterator<
+    ) -> impl Iterator<
         Item = (
             ReplicaId,
             bool,
-            impl 'a + Iterator<Item = &'a Selection<Anchor>>,
+            impl Iterator<Item = &Selection<Anchor>> + '_,
         ),
-    > {
+    > + '_ {
         self.remote_selections
             .iter()
             .filter(|(replica_id, set)| {
@@ -2165,8 +2164,7 @@ impl BufferSnapshot {
         T: 'a + Clone + ToOffset,
         O: 'a + FromAnchor,
     {
-        self.diagnostics
-            .range(search_range.clone(), self, true, reversed)
+        self.diagnostics.range(search_range, self, true, reversed)
     }
 
     pub fn diagnostic_groups(&self) -> Vec<DiagnosticGroup<Anchor>> {
@@ -2469,10 +2467,7 @@ impl<'a> Iterator for BufferChunks<'a> {
 
 impl QueryCursorHandle {
     pub(crate) fn new() -> Self {
-        let mut cursor = QUERY_CURSORS
-            .lock()
-            .pop()
-            .unwrap_or_else(|| QueryCursor::new());
+        let mut cursor = QUERY_CURSORS.lock().pop().unwrap_or_else(QueryCursor::new);
         cursor.set_match_limit(64);
         QueryCursorHandle(Some(cursor))
     }
@@ -2614,7 +2609,7 @@ pub fn contiguous_ranges(
     values: impl Iterator<Item = u32>,
     max_len: usize,
 ) -> impl Iterator<Item = Range<u32>> {
-    let mut values = values.into_iter();
+    let mut values = values;
     let mut current_range: Option<Range<u32>> = None;
     std::iter::from_fn(move || loop {
         if let Some(value) = values.next() {

crates/language/src/diagnostic_set.rs ๐Ÿ”—

@@ -8,7 +8,7 @@ use std::{
 use sum_tree::{self, Bias, SumTree};
 use text::{Anchor, FromAnchor, PointUtf16, ToOffset};
 
-#[derive(Clone, Debug)]
+#[derive(Clone, Debug, Default)]
 pub struct DiagnosticSet {
     diagnostics: SumTree<DiagnosticEntry<Anchor>>,
 }
@@ -167,24 +167,15 @@ impl DiagnosticSet {
             .map(|entry| entry.resolve(buffer))
     }
 }
-
-impl Default for DiagnosticSet {
-    fn default() -> Self {
-        Self {
-            diagnostics: Default::default(),
-        }
-    }
-}
-
 impl sum_tree::Item for DiagnosticEntry<Anchor> {
     type Summary = Summary;
 
     fn summary(&self) -> Self::Summary {
         Summary {
-            start: self.range.start.clone(),
-            end: self.range.end.clone(),
-            min_start: self.range.start.clone(),
-            max_end: self.range.end.clone(),
+            start: self.range.start,
+            end: self.range.end,
+            min_start: self.range.start,
+            max_end: self.range.end,
             count: 1,
         }
     }
@@ -217,13 +208,13 @@ impl sum_tree::Summary for Summary {
 
     fn add_summary(&mut self, other: &Self, buffer: &Self::Context) {
         if other.min_start.cmp(&self.min_start, buffer).is_lt() {
-            self.min_start = other.min_start.clone();
+            self.min_start = other.min_start;
         }
         if other.max_end.cmp(&self.max_end, buffer).is_gt() {
-            self.max_end = other.max_end.clone();
+            self.max_end = other.max_end;
         }
-        self.start = other.start.clone();
-        self.end = other.end.clone();
+        self.start = other.start;
+        self.end = other.end;
         self.count += other.count;
     }
 }

crates/language/src/highlight_map.rs ๐Ÿ”—

@@ -56,10 +56,7 @@ impl HighlightId {
     }
 
     pub fn style(&self, theme: &SyntaxTheme) -> Option<HighlightStyle> {
-        theme
-            .highlights
-            .get(self.0 as usize)
-            .map(|entry| entry.1.clone())
+        theme.highlights.get(self.0 as usize).map(|entry| entry.1)
     }
 
     #[cfg(any(test, feature = "test-support"))]

crates/language/src/language.rs ๐Ÿ”—

@@ -308,6 +308,7 @@ pub struct LanguageRegistry {
     lsp_binary_statuses_tx: async_broadcast::Sender<(Arc<Language>, LanguageServerBinaryStatus)>,
     lsp_binary_statuses_rx: async_broadcast::Receiver<(Arc<Language>, LanguageServerBinaryStatus)>,
     login_shell_env_loaded: Shared<Task<()>>,
+    #[allow(clippy::type_complexity)]
     lsp_binary_paths: Mutex<
         HashMap<
             LanguageServerName,
@@ -342,7 +343,7 @@ impl LanguageRegistry {
         if let Some(theme) = self.theme.read().clone() {
             language.set_theme(&theme.editor.syntax);
         }
-        self.languages.write().push(language.clone());
+        self.languages.write().push(language);
         *self.subscription.write().0.borrow_mut() = ();
     }
 
@@ -409,7 +410,7 @@ impl LanguageRegistry {
     ) -> Option<Task<Result<lsp::LanguageServer>>> {
         #[cfg(any(test, feature = "test-support"))]
         if language.fake_adapter.is_some() {
-            let language = language.clone();
+            let language = language;
             return Some(cx.spawn(|cx| async move {
                 let (servers_tx, fake_adapter) = language.fake_adapter.as_ref().unwrap();
                 let (server, mut fake_server) = lsp::LanguageServer::fake(
@@ -474,7 +475,7 @@ impl LanguageRegistry {
             let server = lsp::LanguageServer::new(
                 server_id,
                 &server_binary_path,
-                &server_args,
+                server_args,
                 &root_path,
                 cx,
             )?;

crates/language/src/proto.rs ๐Ÿ”—

@@ -408,10 +408,12 @@ pub async fn deserialize_completion(
     Ok(Completion {
         old_range: old_start..old_end,
         new_text: completion.new_text,
-        label: label.unwrap_or(CodeLabel::plain(
-            lsp_completion.label.clone(),
-            lsp_completion.filter_text.as_deref(),
-        )),
+        label: label.unwrap_or_else(|| {
+            CodeLabel::plain(
+                lsp_completion.label.clone(),
+                lsp_completion.filter_text.as_deref(),
+            )
+        }),
         lsp_completion,
     })
 }
@@ -465,7 +467,7 @@ pub fn deserialize_transaction(transaction: proto::Transaction) -> Result<Transa
             .into_iter()
             .map(deserialize_local_timestamp)
             .collect(),
-        start: deserialize_version(transaction.start.into()),
+        start: deserialize_version(transaction.start),
     })
 }
 

crates/language/src/tests.rs ๐Ÿ”—

@@ -107,7 +107,7 @@ fn test_edit_events(cx: &mut gpui::MutableAppContext) {
             let buffer_1_events = buffer_1_events.clone();
             cx.subscribe(&buffer1, move |_, _, event, _| match event.clone() {
                 Event::Operation(op) => buffer1_ops.borrow_mut().push(op),
-                event @ _ => buffer_1_events.borrow_mut().push(event),
+                event => buffer_1_events.borrow_mut().push(event),
             })
             .detach();
             let buffer_2_events = buffer_2_events.clone();
@@ -190,7 +190,7 @@ async fn test_apply_diff(cx: &mut gpui::TestAppContext) {
     buffer.update(cx, |buffer, cx| {
         buffer.apply_diff(diff, cx).unwrap();
         assert_eq!(buffer.text(), text);
-        assert_eq!(anchor.to_point(&buffer), Point::new(2, 3));
+        assert_eq!(anchor.to_point(buffer), Point::new(2, 3));
     });
 
     let text = "a\n1\n\nccc\ndd2dd\nffffff\n";
@@ -198,7 +198,7 @@ async fn test_apply_diff(cx: &mut gpui::TestAppContext) {
     buffer.update(cx, |buffer, cx| {
         buffer.apply_diff(diff, cx).unwrap();
         assert_eq!(buffer.text(), text);
-        assert_eq!(anchor.to_point(&buffer), Point::new(4, 4));
+        assert_eq!(anchor.to_point(buffer), Point::new(4, 4));
     });
 }
 
@@ -209,11 +209,9 @@ async fn test_reparse(cx: &mut gpui::TestAppContext) {
         cx.add_model(|cx| Buffer::new(0, text, cx).with_language(Arc::new(rust_lang()), cx));
 
     // Wait for the initial text to parse
-    buffer
-        .condition(&cx, |buffer, _| !buffer.is_parsing())
-        .await;
+    buffer.condition(cx, |buffer, _| !buffer.is_parsing()).await;
     assert_eq!(
-        get_tree_sexp(&buffer, &cx),
+        get_tree_sexp(&buffer, cx),
         concat!(
             "(source_file (function_item name: (identifier) ",
             "parameters: (parameters) ",
@@ -230,11 +228,11 @@ async fn test_reparse(cx: &mut gpui::TestAppContext) {
     buffer.update(cx, |buf, cx| {
         buf.start_transaction();
 
-        let offset = buf.text().find(")").unwrap();
+        let offset = buf.text().find(')').unwrap();
         buf.edit([(offset..offset, "b: C")], None, cx);
         assert!(!buf.is_parsing());
 
-        let offset = buf.text().find("}").unwrap();
+        let offset = buf.text().find('}').unwrap();
         buf.edit([(offset..offset, " d; ")], None, cx);
         assert!(!buf.is_parsing());
 
@@ -242,11 +240,9 @@ async fn test_reparse(cx: &mut gpui::TestAppContext) {
         assert_eq!(buf.text(), "fn a(b: C) { d; }");
         assert!(buf.is_parsing());
     });
-    buffer
-        .condition(&cx, |buffer, _| !buffer.is_parsing())
-        .await;
+    buffer.condition(cx, |buffer, _| !buffer.is_parsing()).await;
     assert_eq!(
-        get_tree_sexp(&buffer, &cx),
+        get_tree_sexp(&buffer, cx),
         concat!(
             "(source_file (function_item name: (identifier) ",
             "parameters: (parameters (parameter pattern: (identifier) type: (type_identifier))) ",
@@ -259,13 +255,13 @@ async fn test_reparse(cx: &mut gpui::TestAppContext) {
     // * turn field expression into a method call
     // * add a turbofish to the method call
     buffer.update(cx, |buf, cx| {
-        let offset = buf.text().find(";").unwrap();
+        let offset = buf.text().find(';').unwrap();
         buf.edit([(offset..offset, ".e")], None, cx);
         assert_eq!(buf.text(), "fn a(b: C) { d.e; }");
         assert!(buf.is_parsing());
     });
     buffer.update(cx, |buf, cx| {
-        let offset = buf.text().find(";").unwrap();
+        let offset = buf.text().find(';').unwrap();
         buf.edit([(offset..offset, "(f)")], None, cx);
         assert_eq!(buf.text(), "fn a(b: C) { d.e(f); }");
         assert!(buf.is_parsing());
@@ -276,11 +272,9 @@ async fn test_reparse(cx: &mut gpui::TestAppContext) {
         assert_eq!(buf.text(), "fn a(b: C) { d.e::<G>(f); }");
         assert!(buf.is_parsing());
     });
-    buffer
-        .condition(&cx, |buffer, _| !buffer.is_parsing())
-        .await;
+    buffer.condition(cx, |buffer, _| !buffer.is_parsing()).await;
     assert_eq!(
-        get_tree_sexp(&buffer, &cx),
+        get_tree_sexp(&buffer, cx),
         concat!(
             "(source_file (function_item name: (identifier) ",
             "parameters: (parameters (parameter pattern: (identifier) type: (type_identifier))) ",
@@ -297,11 +291,9 @@ async fn test_reparse(cx: &mut gpui::TestAppContext) {
         assert_eq!(buf.text(), "fn a() {}");
         assert!(buf.is_parsing());
     });
-    buffer
-        .condition(&cx, |buffer, _| !buffer.is_parsing())
-        .await;
+    buffer.condition(cx, |buffer, _| !buffer.is_parsing()).await;
     assert_eq!(
-        get_tree_sexp(&buffer, &cx),
+        get_tree_sexp(&buffer, cx),
         concat!(
             "(source_file (function_item name: (identifier) ",
             "parameters: (parameters) ",
@@ -314,11 +306,9 @@ async fn test_reparse(cx: &mut gpui::TestAppContext) {
         assert_eq!(buf.text(), "fn a(b: C) { d.e::<G>(f); }");
         assert!(buf.is_parsing());
     });
-    buffer
-        .condition(&cx, |buffer, _| !buffer.is_parsing())
-        .await;
+    buffer.condition(cx, |buffer, _| !buffer.is_parsing()).await;
     assert_eq!(
-        get_tree_sexp(&buffer, &cx),
+        get_tree_sexp(&buffer, cx),
         concat!(
             "(source_file (function_item name: (identifier) ",
             "parameters: (parameters (parameter pattern: (identifier) type: (type_identifier))) ",
@@ -340,21 +330,17 @@ async fn test_resetting_language(cx: &mut gpui::TestAppContext) {
     });
 
     // Wait for the initial text to parse
-    buffer
-        .condition(&cx, |buffer, _| !buffer.is_parsing())
-        .await;
+    buffer.condition(cx, |buffer, _| !buffer.is_parsing()).await;
     assert_eq!(
-        get_tree_sexp(&buffer, &cx),
+        get_tree_sexp(&buffer, cx),
         "(source_file (expression_statement (block)))"
     );
 
     buffer.update(cx, |buffer, cx| {
         buffer.set_language(Some(Arc::new(json_lang())), cx)
     });
-    buffer
-        .condition(&cx, |buffer, _| !buffer.is_parsing())
-        .await;
-    assert_eq!(get_tree_sexp(&buffer, &cx), "(document (object))");
+    buffer.condition(cx, |buffer, _| !buffer.is_parsing()).await;
+    assert_eq!(get_tree_sexp(&buffer, cx), "(document (object))");
 }
 
 #[gpui::test]
@@ -417,7 +403,7 @@ async fn test_outline(cx: &mut gpui::TestAppContext) {
 
     // Without space, we only match on names
     assert_eq!(
-        search(&outline, "oon", &cx).await,
+        search(&outline, "oon", cx).await,
         &[
             ("mod module", vec![]),                    // included as the parent of a match
             ("enum LoginState", vec![]),               // included as the parent of a match
@@ -427,18 +413,18 @@ async fn test_outline(cx: &mut gpui::TestAppContext) {
     );
 
     assert_eq!(
-        search(&outline, "dp p", &cx).await,
+        search(&outline, "dp p", cx).await,
         &[
             ("impl Drop for Person", vec![5, 8, 9, 14]),
             ("fn drop", vec![]),
         ]
     );
     assert_eq!(
-        search(&outline, "dpn", &cx).await,
+        search(&outline, "dpn", cx).await,
         &[("impl Drop for Person", vec![5, 14, 19])]
     );
     assert_eq!(
-        search(&outline, "impl ", &cx).await,
+        search(&outline, "impl ", cx).await,
         &[
             ("impl Eq for Person", vec![0, 1, 2, 3, 4]),
             ("impl Drop for Person", vec![0, 1, 2, 3, 4]),
@@ -530,9 +516,9 @@ async fn test_symbols_containing(cx: &mut gpui::TestAppContext) {
         ]
     );
 
-    fn symbols_containing<'a>(
+    fn symbols_containing(
         position: Point,
-        snapshot: &'a BufferSnapshot,
+        snapshot: &BufferSnapshot,
     ) -> Vec<(String, Range<Point>)> {
         snapshot
             .symbols_containing(position, None)
@@ -799,7 +785,7 @@ fn test_autoindent_does_not_adjust_lines_with_unchanged_suggestion(cx: &mut Muta
                 Ok(())
             }
             "
-            .replace("|", "") // included in the string to preserve trailing whites
+            .replace('|', "") // included in the string to preserve trailing whites
             .unindent()
         );
 
@@ -971,7 +957,7 @@ fn test_autoindent_block_mode(cx: &mut MutableAppContext) {
         buffer.undo(cx);
         buffer.edit([(Point::new(2, 0)..Point::new(2, 0), "        ")], None, cx);
         buffer.edit(
-            [(Point::new(2, 8)..Point::new(2, 8), inserted_text.clone())],
+            [(Point::new(2, 8)..Point::new(2, 8), inserted_text)],
             Some(AutoindentMode::Block {
                 original_indent_columns: vec![0],
             }),
@@ -1098,7 +1084,7 @@ fn test_random_collaboration(cx: &mut MutableAppContext, mut rng: StdRng) {
                 if let Event::Operation(op) = event {
                     network
                         .borrow_mut()
-                        .broadcast(buffer.replica_id(), vec![proto::serialize_operation(&op)]);
+                        .broadcast(buffer.replica_id(), vec![proto::serialize_operation(op)]);
                 }
             })
             .detach();
@@ -1202,7 +1188,7 @@ fn test_random_collaboration(cx: &mut MutableAppContext, mut rng: StdRng) {
                         if let Event::Operation(op) = event {
                             network.borrow_mut().broadcast(
                                 buffer.replica_id(),
-                                vec![proto::serialize_operation(&op)],
+                                vec![proto::serialize_operation(op)],
                             );
                         }
                     })

crates/lsp/src/lsp.rs ๐Ÿ”—

@@ -27,8 +27,8 @@ use std::{
 use std::{path::Path, process::Stdio};
 use util::{ResultExt, TryFutureExt};
 
-const JSON_RPC_VERSION: &'static str = "2.0";
-const CONTENT_LEN_HEADER: &'static str = "Content-Length: ";
+const JSON_RPC_VERSION: &str = "2.0";
+const CONTENT_LEN_HEADER: &str = "Content-Length: ";
 
 type NotificationHandler = Box<dyn Send + FnMut(Option<usize>, &str, AsyncAppContext)>;
 type ResponseHandler = Box<dyn Send + FnOnce(Result<&str, Error>)>;
@@ -42,6 +42,7 @@ pub struct LanguageServer {
     notification_handlers: Arc<Mutex<HashMap<&'static str, NotificationHandler>>>,
     response_handlers: Arc<Mutex<HashMap<usize, ResponseHandler>>>,
     executor: Arc<executor::Background>,
+    #[allow(clippy::type_complexity)]
     io_tasks: Mutex<Option<(Task<Option<()>>, Task<Option<()>>)>>,
     output_done_rx: Mutex<Option<barrier::Receiver>>,
     root_path: PathBuf,
@@ -112,7 +113,7 @@ impl LanguageServer {
         let working_dir = if root_path.is_dir() {
             root_path
         } else {
-            root_path.parent().unwrap_or(Path::new("/"))
+            root_path.parent().unwrap_or_else(|| Path::new("/"))
         };
         let mut server = process::Command::new(binary_path)
             .current_dir(working_dir)
@@ -251,7 +252,7 @@ impl LanguageServer {
             capabilities: Default::default(),
             next_id: Default::default(),
             outbound_tx,
-            executor: cx.background().clone(),
+            executor: cx.background(),
             io_tasks: Mutex::new(Some((input_task, output_task))),
             output_done_rx: Mutex::new(Some(output_done_rx)),
             root_path: root_path.to_path_buf(),
@@ -641,7 +642,7 @@ impl LanguageServer {
                 stdin_reader,
                 None,
                 Path::new("/"),
-                cx.clone(),
+                cx,
                 move |msg| {
                     notifications_tx
                         .try_send((msg.method.to_string(), msg.params.get().to_string()))
@@ -651,7 +652,7 @@ impl LanguageServer {
             notifications_rx,
         };
         fake.handle_request::<request::Initialize, _, _>({
-            let capabilities = capabilities.clone();
+            let capabilities = capabilities;
             move |_, _| {
                 let capabilities = capabilities.clone();
                 let name = name.clone();
@@ -662,7 +663,6 @@ impl LanguageServer {
                             name,
                             ..Default::default()
                         }),
-                        ..Default::default()
                     })
                 }
             }
@@ -697,7 +697,7 @@ impl FakeLanguageServer {
 
         loop {
             let (method, params) = self.notifications_rx.next().await?;
-            if &method == T::METHOD {
+            if method == T::METHOD {
                 return Some(serde_json::from_str::<T::Params>(&params).unwrap());
             } else {
                 log::info!("skipping message in fake language server {:?}", params);

crates/outline/src/outline.rs ๐Ÿ”—

@@ -115,8 +115,8 @@ impl OutlineView {
             self.active_editor.update(cx, |active_editor, cx| {
                 let snapshot = active_editor.snapshot(cx).display_snapshot;
                 let buffer_snapshot = &snapshot.buffer_snapshot;
-                let start = outline_item.range.start.to_point(&buffer_snapshot);
-                let end = outline_item.range.end.to_point(&buffer_snapshot);
+                let start = outline_item.range.start.to_point(buffer_snapshot);
+                let end = outline_item.range.end.to_point(buffer_snapshot);
                 let display_rows = start.to_display_point(&snapshot).row()
                     ..end.to_display_point(&snapshot).row() + 1;
                 active_editor.highlight_rows(Some(display_rows));
@@ -183,8 +183,8 @@ impl PickerDelegate for OutlineView {
                 .map(|(ix, item)| {
                     let range = item.range.to_offset(&buffer);
                     let distance_to_closest_endpoint = cmp::min(
-                        (range.start as isize - cursor_offset as isize).abs() as usize,
-                        (range.end as isize - cursor_offset as isize).abs() as usize,
+                        (range.start as isize - cursor_offset as isize).abs(),
+                        (range.end as isize - cursor_offset as isize).abs(),
                     );
                     let depth = if range.contains(&cursor_offset) {
                         Some(item.depth)

crates/plugin/src/lib.rs ๐Ÿ”—

@@ -29,7 +29,7 @@ impl __Buffer {
 pub extern "C" fn __alloc_buffer(len: u32) -> u32 {
     let vec = vec![0; len as usize];
     let buffer = unsafe { __Buffer::from_vec(vec) };
-    return buffer.ptr;
+    buffer.ptr
 }
 
 /// Frees a given buffer, requires the size.

crates/plugin_runtime/build.rs ๐Ÿ”—

@@ -17,8 +17,7 @@ fn main() {
 
     // Clear out and recreate the plugin bin directory
     let _ = std::fs::remove_dir_all(base.join("bin"));
-    let _ =
-        std::fs::create_dir_all(base.join("bin")).expect("Could not make plugins bin directory");
+    std::fs::create_dir_all(base.join("bin")).expect("Could not make plugins bin directory");
 
     // Compile the plugins using the same profile as the current Zed build
     let (profile_flags, profile_target) = match std::env::var("PROFILE").unwrap().as_str() {
@@ -43,7 +42,7 @@ fn main() {
 
     // Get the target architecture for pre-cross-compilation of plugins
     // and create and engine with the appropriate config
-    let target_triple = std::env::var("TARGET").unwrap().to_string();
+    let target_triple = std::env::var("TARGET").unwrap();
     println!("cargo:rerun-if-env-changed=TARGET");
     let engine = create_default_engine(&target_triple);
 
@@ -77,7 +76,7 @@ fn create_default_engine(target_triple: &str) -> Engine {
     let mut config = Config::default();
     config
         .target(target_triple)
-        .expect(&format!("Could not set target to `{}`", target_triple));
+        .unwrap_or_else(|_| panic!("Could not set target to `{}`", target_triple));
     config.async_support(true);
     config.consume_fuel(true);
     Engine::new(&config).expect("Could not create precompilation engine")

crates/plugin_runtime/src/lib.rs ๐Ÿ”—

@@ -69,13 +69,13 @@ mod tests {
             let unsorted = vec![1, 3, 4, 2, 5];
             let sorted = vec![1, 2, 3, 4, 5];
 
-            assert_eq!(runtime.call(&plugin.noop, ()).await.unwrap(), ());
+            runtime.call(&plugin.noop, ()).await.unwrap();
             assert_eq!(runtime.call(&plugin.constant, ()).await.unwrap(), 27);
             assert_eq!(runtime.call(&plugin.identity, 58).await.unwrap(), 58);
             assert_eq!(runtime.call(&plugin.add, (3, 4)).await.unwrap(), 7);
             assert_eq!(runtime.call(&plugin.swap, (1, 2)).await.unwrap(), (2, 1));
             assert_eq!(runtime.call(&plugin.sort, unsorted).await.unwrap(), sorted);
-            assert_eq!(runtime.call(&plugin.print, "Hi!".into()).await.unwrap(), ());
+            runtime.call(&plugin.print, "Hi!".into()).await.unwrap();
             assert_eq!(runtime.call(&plugin.and_back, 1).await.unwrap(), 8);
             assert_eq!(runtime.call(&plugin.imports, 1).await.unwrap(), 8);
             assert_eq!(runtime.call(&plugin.half_async, 4).await.unwrap(), 2);

crates/plugin_runtime/src/plugin.rs ๐Ÿ”—

@@ -135,7 +135,7 @@ impl PluginBuilder {
                 // TODO: use try block once avaliable
                 let result: Result<(WasiBuffer, Memory, _), Trap> = (|| {
                     // grab a handle to the memory
-                    let mut plugin_memory = match caller.get_export("memory") {
+                    let plugin_memory = match caller.get_export("memory") {
                         Some(Extern::Memory(mem)) => mem,
                         _ => return Err(Trap::new("Could not grab slice of plugin memory"))?,
                     };
@@ -144,9 +144,9 @@ impl PluginBuilder {
 
                     // get the args passed from Guest
                     let args =
-                        Plugin::buffer_to_bytes(&mut plugin_memory, caller.as_context(), &buffer)?;
+                        Plugin::buffer_to_bytes(&plugin_memory, caller.as_context(), &buffer)?;
 
-                    let args: A = Plugin::deserialize_to_type(&args)?;
+                    let args: A = Plugin::deserialize_to_type(args)?;
 
                     // Call the Host-side function
                     let result = function(args);
@@ -214,7 +214,7 @@ impl PluginBuilder {
                 // TODO: use try block once avaliable
                 let result: Result<(WasiBuffer, Memory, Vec<u8>), Trap> = (|| {
                     // grab a handle to the memory
-                    let mut plugin_memory = match caller.get_export("memory") {
+                    let plugin_memory = match caller.get_export("memory") {
                         Some(Extern::Memory(mem)) => mem,
                         _ => return Err(Trap::new("Could not grab slice of plugin memory"))?,
                     };
@@ -222,7 +222,7 @@ impl PluginBuilder {
                     let buffer = WasiBuffer::from_u64(packed_buffer);
 
                     // get the args passed from Guest
-                    let args = Plugin::buffer_to_type(&mut plugin_memory, &mut caller, &buffer)?;
+                    let args = Plugin::buffer_to_type(&plugin_memory, &mut caller, &buffer)?;
 
                     // Call the Host-side function
                     let result: R = function(args);
@@ -258,7 +258,7 @@ impl PluginBuilder {
 
     /// Initializes a [`Plugin`] from a given compiled Wasm module.
     /// Both binary (`.wasm`) and text (`.wat`) module formats are supported.
-    pub async fn init<'a>(self, binary: PluginBinary<'a>) -> Result<Plugin, Error> {
+    pub async fn init(self, binary: PluginBinary<'_>) -> Result<Plugin, Error> {
         Plugin::init(binary, self).await
     }
 }
@@ -324,7 +324,7 @@ impl Plugin {
         println!();
     }
 
-    async fn init<'a>(binary: PluginBinary<'a>, plugin: PluginBuilder) -> Result<Self, Error> {
+    async fn init(binary: PluginBinary<'_>, plugin: PluginBuilder) -> Result<Self, Error> {
         // initialize the WebAssembly System Interface context
         let engine = plugin.engine;
         let mut linker = plugin.linker;
@@ -576,7 +576,7 @@ impl Plugin {
             .await?;
 
         Self::buffer_to_type(
-            &mut plugin_memory,
+            &plugin_memory,
             &mut self.store,
             &WasiBuffer::from_u64(result_buffer),
         )

crates/project/src/fs.rs ๐Ÿ”—

@@ -460,7 +460,7 @@ impl FakeFs {
                     }
                 }
                 Null => {
-                    self.create_dir(&path).await.unwrap();
+                    self.create_dir(path).await.unwrap();
                 }
                 String(contents) => {
                     self.insert_file(&path, contents).await;

crates/project/src/lsp_command.rs ๐Ÿ”—

@@ -1027,7 +1027,7 @@ impl LspCommand for GetHover {
                 lsp::HoverContents::Array(marked_strings) => {
                     let content: Vec<HoverBlock> = marked_strings
                         .into_iter()
-                        .filter_map(|marked_string| HoverBlock::try_new(marked_string))
+                        .filter_map(HoverBlock::try_new)
                         .collect();
                     if content.is_empty() {
                         None
@@ -1049,9 +1049,7 @@ impl LspCommand for GetHover {
                             }
                             Event::Start(Tag::CodeBlock(CodeBlockKind::Fenced(new_language))) => {
                                 if !current_text.is_empty() {
-                                    let text = std::mem::replace(&mut current_text, String::new())
-                                        .trim()
-                                        .to_string();
+                                    let text = std::mem::take(&mut current_text).trim().to_string();
                                     contents.push(HoverBlock { text, language });
                                 }
 
@@ -1067,9 +1065,7 @@ impl LspCommand for GetHover {
                             | Event::End(Tag::BlockQuote)
                             | Event::HardBreak => {
                                 if !current_text.is_empty() {
-                                    let text = std::mem::replace(&mut current_text, String::new())
-                                        .trim()
-                                        .to_string();
+                                    let text = std::mem::take(&mut current_text).trim().to_string();
                                     contents.push(HoverBlock { text, language });
                                 }
                                 language = None;

crates/project/src/project.rs ๐Ÿ”—

@@ -114,10 +114,12 @@ pub struct Project {
     _subscriptions: Vec<gpui::Subscription>,
     opened_buffer: (Rc<RefCell<watch::Sender<()>>>, watch::Receiver<()>),
     shared_buffers: HashMap<PeerId, HashSet<u64>>,
+    #[allow(clippy::type_complexity)]
     loading_buffers: HashMap<
         ProjectPath,
         postage::watch::Receiver<Option<Result<ModelHandle<Buffer>, Arc<anyhow::Error>>>>,
     >,
+    #[allow(clippy::type_complexity)]
     loading_local_worktrees:
         HashMap<Arc<Path>, Shared<Task<Result<ModelHandle<Worktree>, Arc<anyhow::Error>>>>>,
     opened_buffers: HashMap<u64, OpenBuffer>,
@@ -993,7 +995,7 @@ impl Project {
                     .iter()
                     .filter_map(|worktree| {
                         worktree
-                            .upgrade(&cx)
+                            .upgrade(cx)
                             .map(|worktree| worktree.read(cx).as_local().unwrap().metadata_proto())
                     })
                     .collect()
@@ -1080,7 +1082,7 @@ impl Project {
         self.worktrees
             .iter()
             .filter_map(|worktree| {
-                let worktree = worktree.upgrade(&cx)?.read(cx);
+                let worktree = worktree.upgrade(cx)?.read(cx);
                 if worktree.is_visible() {
                     Some(format!(
                         "project-path-online:{}",
@@ -1121,7 +1123,7 @@ impl Project {
     }
 
     pub fn contains_paths(&self, paths: &[PathBuf], cx: &AppContext) -> bool {
-        paths.iter().all(|path| self.contains_path(&path, cx))
+        paths.iter().all(|path| self.contains_path(path, cx))
     }
 
     pub fn contains_path(&self, path: &Path, cx: &AppContext) -> bool {
@@ -1395,11 +1397,8 @@ impl Project {
             }
 
             for open_buffer in self.opened_buffers.values_mut() {
-                match open_buffer {
-                    OpenBuffer::Strong(buffer) => {
-                        *open_buffer = OpenBuffer::Weak(buffer.downgrade());
-                    }
-                    _ => {}
+                if let OpenBuffer::Strong(buffer) = open_buffer {
+                    *open_buffer = OpenBuffer::Weak(buffer.downgrade());
                 }
             }
 
@@ -1493,7 +1492,7 @@ impl Project {
 
         let buffer = cx.add_model(|cx| {
             Buffer::new(self.replica_id(), text, cx)
-                .with_language(language.unwrap_or(language::PLAIN_TEXT.clone()), cx)
+                .with_language(language.unwrap_or_else(|| language::PLAIN_TEXT.clone()), cx)
         });
         self.register_buffer(&buffer, cx)?;
         Ok(buffer)
@@ -1791,7 +1790,7 @@ impl Project {
                         server
                             .notify::<lsp::notification::DidCloseTextDocument>(
                                 lsp::DidCloseTextDocumentParams {
-                                    text_document: lsp::TextDocumentIdentifier::new(uri.clone()),
+                                    text_document: lsp::TextDocumentIdentifier::new(uri),
                                 },
                             )
                             .log_err();
@@ -1825,7 +1824,7 @@ impl Project {
                         language_server = self
                             .language_server_ids
                             .get(&(worktree_id, adapter.name.clone()))
-                            .and_then(|id| self.language_servers.get(&id))
+                            .and_then(|id| self.language_servers.get(id))
                             .and_then(|server_state| {
                                 if let LanguageServerState::Running { server, .. } = server_state {
                                     Some(server.clone())
@@ -1838,7 +1837,7 @@ impl Project {
 
                 if let Some(local_worktree) = file.worktree.read(cx).as_local() {
                     if let Some(diagnostics) = local_worktree.diagnostics_for_path(file.path()) {
-                        self.update_buffer_diagnostics(&buffer_handle, diagnostics, None, cx)
+                        self.update_buffer_diagnostics(buffer_handle, diagnostics, None, cx)
                             .log_err();
                     }
                 }
@@ -1853,8 +1852,7 @@ impl Project {
                                     0,
                                     initial_snapshot.text(),
                                 ),
-                            }
-                            .clone(),
+                            },
                         )
                         .log_err();
                     buffer_handle.update(cx, |buffer, cx| {
@@ -1864,7 +1862,7 @@ impl Project {
                                 .completion_provider
                                 .as_ref()
                                 .and_then(|provider| provider.trigger_characters.clone())
-                                .unwrap_or(Vec::new()),
+                                .unwrap_or_default(),
                             cx,
                         )
                     });
@@ -1910,7 +1908,7 @@ impl Project {
                     let request = self.client.request(proto::UpdateBuffer {
                         project_id,
                         buffer_id: buffer.read(cx).remote_id(),
-                        operations: vec![language::proto::serialize_operation(&operation)],
+                        operations: vec![language::proto::serialize_operation(operation)],
                     });
                     cx.background().spawn(request).detach_and_log_err(cx);
                 } else if let Some(project_id) = self.remote_id() {
@@ -2014,7 +2012,7 @@ impl Project {
             .filter_map(move |((language_server_worktree_id, _), id)| {
                 if *language_server_worktree_id == worktree_id {
                     if let Some(LanguageServerState::Running { adapter, server }) =
-                        self.language_servers.get(&id)
+                        self.language_servers.get(id)
                     {
                         return Some((adapter, server));
                     }
@@ -2151,7 +2149,7 @@ impl Project {
                                 let this = this.downgrade();
                                 let adapter = adapter.clone();
                                 move |mut params, cx| {
-                                    let this = this.clone();
+                                    let this = this;
                                     let adapter = adapter.clone();
                                     cx.spawn(|mut cx| async move {
                                         adapter.process_diagnostics(&mut params).await;
@@ -2371,7 +2369,7 @@ impl Project {
                                                 .and_then(|provider| {
                                                     provider.trigger_characters.clone()
                                                 })
-                                                .unwrap_or(Vec::new()),
+                                                .unwrap_or_default(),
                                             cx,
                                         )
                                     });
@@ -2502,10 +2500,8 @@ impl Project {
                         .cloned()
                     {
                         for orphaned_worktree in orphaned_worktrees {
-                            this.language_server_ids.insert(
-                                (orphaned_worktree, server_name.clone()),
-                                new_server_id.clone(),
-                            );
+                            this.language_server_ids
+                                .insert((orphaned_worktree, server_name.clone()), new_server_id);
                         }
                     }
                 });
@@ -2528,9 +2524,7 @@ impl Project {
                 return;
             }
         };
-        let progress = match progress.value {
-            lsp::ProgressParamsValue::WorkDone(value) => value,
-        };
+        let lsp::ProgressParamsValue::WorkDone(progress) = progress.value;
         let language_server_status =
             if let Some(status) = self.language_server_statuses.get_mut(&server_id) {
                 status
@@ -2543,7 +2537,7 @@ impl Project {
         }
 
         let is_disk_based_diagnostics_progress =
-            Some(token.as_ref()) == disk_based_diagnostics_progress_token.as_ref().map(|x| &**x);
+            Some(token.as_ref()) == disk_based_diagnostics_progress_token.as_deref();
 
         match progress {
             lsp::WorkDoneProgress::Begin(report) => {
@@ -2796,7 +2790,7 @@ impl Project {
             } else {
                 let group_id = post_inc(&mut self.next_diagnostic_group_id);
                 let is_disk_based =
-                    source.map_or(false, |source| disk_based_sources.contains(&source));
+                    source.map_or(false, |source| disk_based_sources.contains(source));
 
                 sources_by_group_id.insert(group_id, source);
                 primary_diagnostic_group_ids
@@ -3194,7 +3188,7 @@ impl Project {
         if let Some(lsp_edits) = lsp_edits {
             let edits = this
                 .update(cx, |this, cx| {
-                    this.edits_from_lsp(&buffer, lsp_edits, None, cx)
+                    this.edits_from_lsp(buffer, lsp_edits, None, cx)
                 })
                 .await?;
             buffer.update(cx, |buffer, cx| {
@@ -3366,7 +3360,7 @@ impl Project {
                             if let Some((worktree, rel_path)) =
                                 this.find_local_worktree(&abs_path, cx)
                             {
-                                worktree_id = (&worktree.read(cx)).id();
+                                worktree_id = worktree.read(cx).id();
                                 path = rel_path;
                             } else {
                                 path = relativize_path(&worktree_abs_path, &abs_path);
@@ -3613,7 +3607,7 @@ impl Project {
                                     .clone();
                                 (
                                     snapshot.anchor_before(start)..snapshot.anchor_after(end),
-                                    text.clone(),
+                                    text,
                                 )
                             }
                             Some(lsp::CompletionTextEdit::InsertAndReplace(_)) => {
@@ -3791,7 +3785,7 @@ impl Project {
 
             let lsp_range = range_to_lsp(range.to_point_utf16(buffer));
             cx.foreground().spawn(async move {
-                if !lang_server.capabilities().code_action_provider.is_some() {
+                if lang_server.capabilities().code_action_provider.is_none() {
                     return Ok(Default::default());
                 }
 
@@ -4120,6 +4114,7 @@ impl Project {
         )
     }
 
+    #[allow(clippy::type_complexity)]
     pub fn search(
         &self,
         query: SearchQuery,
@@ -4341,7 +4336,7 @@ impl Project {
             ) {
                 let lsp_params = request.to_lsp(&file.abs_path(cx), cx);
                 return cx.spawn(|this, cx| async move {
-                    if !request.check_capabilities(&language_server.capabilities()) {
+                    if !request.check_capabilities(language_server.capabilities()) {
                         return Ok(Default::default());
                     }
 
@@ -4375,7 +4370,7 @@ impl Project {
     ) -> Task<Result<(ModelHandle<Worktree>, PathBuf)>> {
         let abs_path = abs_path.as_ref();
         if let Some((tree, relative_path)) = self.find_local_worktree(abs_path, cx) {
-            Task::ready(Ok((tree.clone(), relative_path.into())))
+            Task::ready(Ok((tree, relative_path)))
         } else {
             let worktree = self.create_local_worktree(abs_path, visible, cx);
             cx.foreground()
@@ -4455,7 +4450,7 @@ impl Project {
 
                         Ok(worktree)
                     }
-                    .map_err(|err| Arc::new(err))
+                    .map_err(Arc::new)
                 })
                 .shared()
             })
@@ -4487,9 +4482,9 @@ impl Project {
     }
 
     fn add_worktree(&mut self, worktree: &ModelHandle<Worktree>, cx: &mut ModelContext<Self>) {
-        cx.observe(&worktree, |_, _, cx| cx.notify()).detach();
+        cx.observe(worktree, |_, _, cx| cx.notify()).detach();
         if worktree.read(cx).is_local() {
-            cx.subscribe(&worktree, |this, worktree, _, cx| {
+            cx.subscribe(worktree, |this, worktree, _, cx| {
                 this.update_local_worktree_buffers(worktree, cx);
             })
             .detach();
@@ -4508,7 +4503,7 @@ impl Project {
         }
 
         self.metadata_changed(true, cx);
-        cx.observe_release(&worktree, |this, worktree, cx| {
+        cx.observe_release(worktree, |this, worktree, cx| {
             this.remove_worktree(worktree.id(), cx);
             cx.notify();
         })
@@ -4610,9 +4605,9 @@ impl Project {
         }
     }
 
-    pub fn language_servers_running_disk_based_diagnostics<'a>(
-        &'a self,
-    ) -> impl 'a + Iterator<Item = usize> {
+    pub fn language_servers_running_disk_based_diagnostics(
+        &self,
+    ) -> impl Iterator<Item = usize> + '_ {
         self.language_server_statuses
             .iter()
             .filter_map(|(id, status)| {
@@ -4762,7 +4757,7 @@ impl Project {
                 .remove(&peer_id)
                 .ok_or_else(|| anyhow!("unknown peer {:?}", peer_id))?
                 .replica_id;
-            for (_, buffer) in &this.opened_buffers {
+            for buffer in this.opened_buffers.values() {
                 if let Some(buffer) = buffer.upgrade(cx) {
                     buffer.update(cx, |buffer, cx| buffer.remove_peer(replica_id, cx));
                 }
@@ -5088,7 +5083,7 @@ impl Project {
             let ops = payload
                 .operations
                 .into_iter()
-                .map(|op| language::proto::deserialize_operation(op))
+                .map(language::proto::deserialize_operation)
                 .collect::<Result<Vec<_>, _>>()?;
             let is_remote = this.is_remote();
             match this.opened_buffers.entry(buffer_id) {
@@ -5125,7 +5120,7 @@ impl Project {
             let worktree = this
                 .worktree_for_id(WorktreeId::from_proto(file.worktree_id), cx)
                 .ok_or_else(|| anyhow!("no such worktree"))?;
-            let file = File::from_proto(file, worktree.clone(), cx)?;
+            let file = File::from_proto(file, worktree, cx)?;
             let buffer = this
                 .opened_buffers
                 .get_mut(&buffer_id)
@@ -5791,6 +5786,7 @@ impl Project {
         })
     }
 
+    #[allow(clippy::type_complexity)]
     fn edits_from_lsp(
         &mut self,
         buffer: &ModelHandle<Buffer>,
@@ -5837,7 +5833,7 @@ impl Project {
                         new_text.push('\n');
                     }
                     range.end = next_range.end;
-                    new_text.push_str(&next_text);
+                    new_text.push_str(next_text);
                     lsp_edits.next();
                 }
 
@@ -5872,7 +5868,7 @@ impl Project {
                             ChangeTag::Insert => {
                                 if moved_since_edit {
                                     let anchor = snapshot.anchor_after(offset);
-                                    edits.push((anchor.clone()..anchor, value.to_string()));
+                                    edits.push((anchor..anchor, value.to_string()));
                                 } else {
                                     edits.last_mut().unwrap().1.push_str(value);
                                 }
@@ -5882,7 +5878,7 @@ impl Project {
                     }
                 } else if range.end == range.start {
                     let anchor = snapshot.anchor_after(range.start);
-                    edits.push((anchor.clone()..anchor, new_text));
+                    edits.push((anchor..anchor, new_text));
                 } else {
                     let edit_start = snapshot.anchor_after(range.start);
                     let edit_end = snapshot.anchor_before(range.end);
@@ -5944,7 +5940,7 @@ impl Project {
 
             if let Some(server_id) = self.language_server_ids.get(&key) {
                 if let Some(LanguageServerState::Running { adapter, server }) =
-                    self.language_servers.get(&server_id)
+                    self.language_servers.get(server_id)
                 {
                     return Some((adapter, server));
                 }

crates/project/src/project_tests.rs ๐Ÿ”—

@@ -499,7 +499,7 @@ async fn test_single_file_worktrees_diagnostics(cx: &mut gpui::TestAppContext) {
     });
 
     buffer_a.read_with(cx, |buffer, _| {
-        let chunks = chunks_with_diagnostics(&buffer, 0..buffer.len());
+        let chunks = chunks_with_diagnostics(buffer, 0..buffer.len());
         assert_eq!(
             chunks
                 .iter()
@@ -513,7 +513,7 @@ async fn test_single_file_worktrees_diagnostics(cx: &mut gpui::TestAppContext) {
         );
     });
     buffer_b.read_with(cx, |buffer, _| {
-        let chunks = chunks_with_diagnostics(&buffer, 0..buffer.len());
+        let chunks = chunks_with_diagnostics(buffer, 0..buffer.len());
         assert_eq!(
             chunks
                 .iter()
@@ -579,7 +579,7 @@ async fn test_hidden_worktrees_diagnostics(cx: &mut gpui::TestAppContext) {
         .await
         .unwrap();
     buffer.read_with(cx, |buffer, _| {
-        let chunks = chunks_with_diagnostics(&buffer, 0..buffer.len());
+        let chunks = chunks_with_diagnostics(buffer, 0..buffer.len());
         assert_eq!(
             chunks
                 .iter()
@@ -1262,7 +1262,7 @@ async fn test_empty_diagnostic_ranges(cx: &mut gpui::TestAppContext) {
     // At the end of a line, an empty range is extended backward to include
     // the preceding character.
     buffer.read_with(cx, |buffer, _| {
-        let chunks = chunks_with_diagnostics(&buffer, 0..buffer.len());
+        let chunks = chunks_with_diagnostics(buffer, 0..buffer.len());
         assert_eq!(
             chunks
                 .iter()
@@ -1511,7 +1511,7 @@ async fn test_edits_from_lsp_with_edits_on_adjacent_lines(cx: &mut gpui::TestApp
             .into_iter()
             .map(|(range, text)| {
                 (
-                    range.start.to_point(&buffer)..range.end.to_point(&buffer),
+                    range.start.to_point(buffer)..range.end.to_point(buffer),
                     text,
                 )
             })
@@ -1614,7 +1614,7 @@ async fn test_invalid_edits_from_lsp(cx: &mut gpui::TestAppContext) {
             .into_iter()
             .map(|(range, text)| {
                 (
-                    range.start.to_point(&buffer)..range.end.to_point(&buffer),
+                    range.start.to_point(buffer)..range.end.to_point(buffer),
                     text,
                 )
             })
@@ -2139,7 +2139,7 @@ async fn test_rescan_and_remote_updates(
             let tree = project.worktrees(cx).next().unwrap();
             tree.read(cx)
                 .entry_for_path(path)
-                .expect(&format!("no entry for path {}", path))
+                .unwrap_or_else(|| panic!("no entry for path {}", path))
                 .id
         })
     };
@@ -2149,9 +2149,9 @@ async fn test_rescan_and_remote_updates(
     let buffer4 = buffer_for_path("b/c/file4", cx).await;
     let buffer5 = buffer_for_path("b/c/file5", cx).await;
 
-    let file2_id = id_for_path("a/file2", &cx);
-    let file3_id = id_for_path("a/file3", &cx);
-    let file4_id = id_for_path("b/c/file4", &cx);
+    let file2_id = id_for_path("a/file2", cx);
+    let file3_id = id_for_path("a/file3", cx);
+    let file4_id = id_for_path("b/c/file4", cx);
 
     // Create a remote copy of this worktree.
     let tree = project.read_with(cx, |project, cx| project.worktrees(cx).next().unwrap());
@@ -2183,12 +2183,12 @@ async fn test_rescan_and_remote_updates(
     });
 
     // Rename and delete files and directories.
-    tree.flush_fs_events(&cx).await;
+    tree.flush_fs_events(cx).await;
     std::fs::rename(dir.path().join("a/file3"), dir.path().join("b/c/file3")).unwrap();
     std::fs::remove_file(dir.path().join("b/c/file5")).unwrap();
     std::fs::rename(dir.path().join("b/c"), dir.path().join("d")).unwrap();
     std::fs::rename(dir.path().join("a/file2"), dir.path().join("a/file2.new")).unwrap();
-    tree.flush_fs_events(&cx).await;
+    tree.flush_fs_events(cx).await;
 
     let expected_paths = vec![
         "a",
@@ -2209,9 +2209,9 @@ async fn test_rescan_and_remote_updates(
             expected_paths
         );
 
-        assert_eq!(id_for_path("a/file2.new", &cx), file2_id);
-        assert_eq!(id_for_path("d/file3", &cx), file3_id);
-        assert_eq!(id_for_path("d/file4", &cx), file4_id);
+        assert_eq!(id_for_path("a/file2.new", cx), file2_id);
+        assert_eq!(id_for_path("d/file3", cx), file3_id);
+        assert_eq!(id_for_path("d/file4", cx), file4_id);
 
         assert_eq!(
             buffer2.read(app).file().unwrap().path().as_ref(),
@@ -2689,7 +2689,7 @@ async fn test_grouped_diagnostics(cx: &mut gpui::TestAppContext) {
                 message: "error 2 hint 2".to_string(),
                 related_information: Some(vec![lsp::DiagnosticRelatedInformation {
                     location: lsp::Location {
-                        uri: buffer_uri.clone(),
+                        uri: buffer_uri,
                         range: lsp::Range::new(lsp::Position::new(2, 8), lsp::Position::new(2, 17)),
                     },
                     message: "original diagnostic".to_string(),

crates/project/src/search.rs ๐Ÿ”—

@@ -53,7 +53,7 @@ impl SearchQuery {
             query = word_query
         }
 
-        let multiline = query.contains("\n") || query.contains("\\n");
+        let multiline = query.contains('\n') || query.contains("\\n");
         let regex = RegexBuilder::new(&query)
             .case_insensitive(!case_sensitive)
             .multi_line(multiline)

crates/project/src/worktree.rs ๐Ÿ”—

@@ -57,6 +57,7 @@ lazy_static! {
 #[derive(Copy, Clone, PartialEq, Eq, Debug, Hash, PartialOrd, Ord)]
 pub struct WorktreeId(usize);
 
+#[allow(clippy::large_enum_variant)]
 pub enum Worktree {
     Local(LocalWorktree),
     Remote(RemoteWorktree),
@@ -157,7 +158,7 @@ impl Worktree {
         cx: &mut AsyncAppContext,
     ) -> Result<ModelHandle<Self>> {
         let (tree, scan_states_tx) =
-            LocalWorktree::new(client, path, visible, fs.clone(), next_entry_id, cx).await?;
+            LocalWorktree::create(client, path, visible, fs.clone(), next_entry_id, cx).await?;
         tree.update(cx, |tree, cx| {
             let tree = tree.as_local_mut().unwrap();
             let abs_path = tree.abs_path().clone();
@@ -229,7 +230,7 @@ impl Worktree {
         cx.spawn(|mut cx| {
             let this = worktree_handle.downgrade();
             async move {
-                while let Some(_) = snapshot_updated_rx.recv().await {
+                while (snapshot_updated_rx.recv().await).is_some() {
                     if let Some(this) = this.upgrade(&cx) {
                         this.update(&mut cx, |this, cx| {
                             this.poll_snapshot(cx);
@@ -322,15 +323,15 @@ impl Worktree {
         }
     }
 
-    pub fn diagnostic_summaries<'a>(
-        &'a self,
-    ) -> impl Iterator<Item = (Arc<Path>, DiagnosticSummary)> + 'a {
+    pub fn diagnostic_summaries(
+        &self,
+    ) -> impl Iterator<Item = (Arc<Path>, DiagnosticSummary)> + '_ {
         match self {
             Worktree::Local(worktree) => &worktree.diagnostic_summaries,
             Worktree::Remote(worktree) => &worktree.diagnostic_summaries,
         }
         .iter()
-        .map(|(path, summary)| (path.0.clone(), summary.clone()))
+        .map(|(path, summary)| (path.0.clone(), *summary))
     }
 
     fn poll_snapshot(&mut self, cx: &mut ModelContext<Self>) {
@@ -342,7 +343,7 @@ impl Worktree {
 }
 
 impl LocalWorktree {
-    async fn new(
+    async fn create(
         client: Arc<Client>,
         path: impl Into<Arc<Path>>,
         visible: bool,
@@ -386,7 +387,7 @@ impl LocalWorktree {
             };
             if let Some(metadata) = metadata {
                 let entry = Entry::new(
-                    path.into(),
+                    path,
                     &metadata,
                     &snapshot.next_entry_id,
                     snapshot.root_char_bag,
@@ -651,7 +652,7 @@ impl LocalWorktree {
         let abs_path = self.absolutize(&entry.path);
         let delete = cx.background().spawn({
             let fs = self.fs.clone();
-            let abs_path = abs_path.clone();
+            let abs_path = abs_path;
             async move {
                 if entry.is_file() {
                     fs.remove_file(&abs_path, Default::default()).await
@@ -848,7 +849,7 @@ impl LocalWorktree {
             let rpc = self.client.clone();
             let worktree_id = cx.model_id() as u64;
             let maintain_remote_snapshot = cx.background().spawn({
-                let rpc = rpc.clone();
+                let rpc = rpc;
                 let diagnostic_summaries = self.diagnostic_summaries.clone();
                 async move {
                     let mut prev_snapshot = match snapshots_rx.recv().await {
@@ -1002,10 +1003,9 @@ impl RemoteWorktree {
             warning_count: summary.warning_count as usize,
         };
         if summary.is_empty() {
-            self.diagnostic_summaries.remove(&PathKey(path.clone()));
+            self.diagnostic_summaries.remove(&PathKey(path));
         } else {
-            self.diagnostic_summaries
-                .insert(PathKey(path.clone()), summary);
+            self.diagnostic_summaries.insert(PathKey(path), summary);
         }
     }
 
@@ -1513,7 +1513,7 @@ impl LocalSnapshot {
 
         let mut ignore_stack = IgnoreStack::none();
         for (parent_abs_path, ignore) in new_ignores.into_iter().rev() {
-            if ignore_stack.is_abs_path_ignored(&parent_abs_path, true) {
+            if ignore_stack.is_abs_path_ignored(parent_abs_path, true) {
                 ignore_stack = IgnoreStack::all();
                 break;
             } else if let Some(ignore) = ignore {
@@ -1530,8 +1530,8 @@ impl LocalSnapshot {
 }
 
 async fn build_gitignore(abs_path: &Path, fs: &dyn Fs) -> Result<Gitignore> {
-    let contents = fs.load(&abs_path).await?;
-    let parent = abs_path.parent().unwrap_or(Path::new("/"));
+    let contents = fs.load(abs_path).await?;
+    let parent = abs_path.parent().unwrap_or_else(|| Path::new("/"));
     let mut builder = GitignoreBuilder::new(parent);
     for line in contents.lines() {
         builder.add_line(Some(abs_path.into()), line)?;
@@ -1769,7 +1769,7 @@ impl language::LocalFile for File {
                 .send(proto::BufferReloaded {
                     project_id,
                     buffer_id,
-                    version: serialize_version(&version),
+                    version: serialize_version(version),
                     mtime: Some(mtime.into()),
                     fingerprint,
                     line_ending: serialize_line_ending(line_ending) as i32,
@@ -2285,7 +2285,7 @@ impl BackgroundScanner {
             snapshot.scan_id += 1;
             for event in &events {
                 if let Ok(path) = event.path.strip_prefix(&root_canonical_path) {
-                    snapshot.remove_path(&path);
+                    snapshot.remove_path(path);
                 }
             }
 
@@ -2528,13 +2528,13 @@ impl WorktreeHandle for ModelHandle<Worktree> {
             fs.create_file(&root_path.join(filename), Default::default())
                 .await
                 .unwrap();
-            tree.condition(&cx, |tree, _| tree.entry_for_path(filename).is_some())
+            tree.condition(cx, |tree, _| tree.entry_for_path(filename).is_some())
                 .await;
 
             fs.remove_file(&root_path.join(filename), Default::default())
                 .await
                 .unwrap();
-            tree.condition(&cx, |tree, _| tree.entry_for_path(filename).is_none())
+            tree.condition(cx, |tree, _| tree.entry_for_path(filename).is_none())
                 .await;
 
             cx.read(|cx| tree.read(cx).as_local().unwrap().scan_complete())
@@ -2726,7 +2726,7 @@ impl<'a> TryFrom<(&'a CharBag, proto::Entry)> for Entry {
             let kind = if entry.is_dir {
                 EntryKind::Dir
             } else {
-                let mut char_bag = root_char_bag.clone();
+                let mut char_bag = *root_char_bag;
                 char_bag.extend(
                     String::from_utf8_lossy(&entry.path)
                         .chars()
@@ -2738,7 +2738,7 @@ impl<'a> TryFrom<(&'a CharBag, proto::Entry)> for Entry {
             Ok(Entry {
                 id: ProjectEntryId::from_proto(entry.id),
                 kind,
-                path: path.clone(),
+                path,
                 inode: entry.inode,
                 mtime: mtime.into(),
                 is_symlink: entry.is_symlink,
@@ -2955,7 +2955,7 @@ mod tests {
         .unwrap();
         cx.read(|cx| tree.read(cx).as_local().unwrap().scan_complete())
             .await;
-        tree.flush_fs_events(&cx).await;
+        tree.flush_fs_events(cx).await;
         cx.read(|cx| {
             let tree = tree.read(cx);
             assert!(
@@ -2979,7 +2979,7 @@ mod tests {
         std::fs::write(dir.join("tracked-dir/tracked-file2"), "").unwrap();
         std::fs::write(dir.join("tracked-dir/ancestor-ignored-file2"), "").unwrap();
         std::fs::write(dir.join("ignored-dir/ignored-file2"), "").unwrap();
-        tree.flush_fs_events(&cx).await;
+        tree.flush_fs_events(cx).await;
         cx.read(|cx| {
             let tree = tree.read(cx);
             assert!(
@@ -3026,7 +3026,7 @@ mod tests {
         .unwrap();
         cx.read(|cx| tree.read(cx).as_local().unwrap().scan_complete())
             .await;
-        tree.flush_fs_events(&cx).await;
+        tree.flush_fs_events(cx).await;
 
         tree.update(cx, |tree, cx| {
             tree.as_local().unwrap().write_file(
@@ -3052,8 +3052,8 @@ mod tests {
         tree.read_with(cx, |tree, _| {
             let tracked = tree.entry_for_path("tracked-dir/file.txt").unwrap();
             let ignored = tree.entry_for_path("ignored-dir/file.txt").unwrap();
-            assert_eq!(tracked.is_ignored, false);
-            assert_eq!(ignored.is_ignored, true);
+            assert!(!tracked.is_ignored);
+            assert!(ignored.is_ignored);
         });
     }
 
@@ -3226,9 +3226,9 @@ mod tests {
 
             let mut ignore_contents = String::new();
             for path_to_ignore in files_to_ignore.chain(dirs_to_ignore) {
-                write!(
+                writeln!(
                     ignore_contents,
-                    "{}\n",
+                    "{}",
                     path_to_ignore
                         .strip_prefix(&ignore_dir_path)?
                         .to_str()
@@ -3363,7 +3363,7 @@ mod tests {
                 .collect::<Vec<_>>();
             assert_eq!(dfs_paths_via_traversal, dfs_paths_via_iter);
 
-            for (ignore_parent_abs_path, _) in &self.ignores_by_parent_abs_path {
+            for ignore_parent_abs_path in self.ignores_by_parent_abs_path.keys() {
                 let ignore_parent_path =
                     ignore_parent_abs_path.strip_prefix(&self.abs_path).unwrap();
                 assert!(self.entry_for_path(&ignore_parent_path).is_some());
@@ -3389,7 +3389,7 @@ mod tests {
                     paths.push((entry.path.as_ref(), entry.inode, entry.is_ignored));
                 }
             }
-            paths.sort_by(|a, b| a.0.cmp(&b.0));
+            paths.sort_by(|a, b| a.0.cmp(b.0));
             paths
         }
     }

crates/project_panel/src/project_panel.rs ๐Ÿ”—

@@ -186,15 +186,14 @@ impl ProjectPanel {
             });
 
             cx.observe_focus(&filename_editor, |this, _, is_focused, cx| {
-                if !is_focused {
-                    if this
+                if !is_focused
+                    && this
                         .edit_state
                         .as_ref()
                         .map_or(false, |state| state.processing_filename.is_none())
-                    {
-                        this.edit_state = None;
-                        this.update_visible_entries(None, cx);
-                    }
+                {
+                    this.edit_state = None;
+                    this.update_visible_entries(None, cx);
                 }
             })
             .detach();
@@ -209,7 +208,7 @@ impl ProjectPanel {
                 edit_state: None,
                 filename_editor,
                 clipboard_entry: None,
-                context_menu: cx.add_view(|cx| ContextMenu::new(cx)),
+                context_menu: cx.add_view(ContextMenu::new),
             };
             this.update_visible_entries(None, cx);
             this
@@ -380,13 +379,11 @@ impl ProjectPanel {
                 self.index_for_selection(selection).unwrap_or_default();
             if entry_ix > 0 {
                 entry_ix -= 1;
+            } else if worktree_ix > 0 {
+                worktree_ix -= 1;
+                entry_ix = self.visible_entries[worktree_ix].1.len() - 1;
             } else {
-                if worktree_ix > 0 {
-                    worktree_ix -= 1;
-                    entry_ix = self.visible_entries[worktree_ix].1.len() - 1;
-                } else {
-                    return;
-                }
+                return;
             }
 
             let (worktree_id, worktree_entries) = &self.visible_entries[worktree_ix];
@@ -734,17 +731,15 @@ impl ProjectPanel {
 
             self.clipboard_entry.take();
             if clipboard_entry.is_cut() {
-                self.project
-                    .update(cx, |project, cx| {
-                        project.rename_entry(clipboard_entry.entry_id(), new_path, cx)
-                    })
-                    .map(|task| task.detach_and_log_err(cx));
-            } else {
-                self.project
-                    .update(cx, |project, cx| {
-                        project.copy_entry(clipboard_entry.entry_id(), new_path, cx)
-                    })
-                    .map(|task| task.detach_and_log_err(cx));
+                if let Some(task) = self.project.update(cx, |project, cx| {
+                    project.rename_entry(clipboard_entry.entry_id(), new_path, cx)
+                }) {
+                    task.detach_and_log_err(cx)
+                }
+            } else if let Some(task) = self.project.update(cx, |project, cx| {
+                project.copy_entry(clipboard_entry.entry_id(), new_path, cx)
+            }) {
+                task.detach_and_log_err(cx)
             }
         }
         None
@@ -760,10 +755,9 @@ impl ProjectPanel {
     }
 
     fn index_for_selection(&self, selection: Selection) -> Option<(usize, usize, usize)> {
-        let mut worktree_index = 0;
         let mut entry_index = 0;
         let mut visible_entries_index = 0;
-        for (worktree_id, worktree_entries) in &self.visible_entries {
+        for (worktree_index, (worktree_id, worktree_entries)) in self.visible_entries.iter().enumerate() {
             if *worktree_id == selection.worktree_id {
                 for entry in worktree_entries {
                     if entry.id == selection.entry_id {
@@ -777,7 +771,6 @@ impl ProjectPanel {
             } else {
                 visible_entries_index += worktree_entries.len();
             }
-            worktree_index += 1;
         }
         None
     }
@@ -849,10 +842,10 @@ impl ProjectPanel {
                         is_ignored: false,
                     });
                 }
-                if expanded_dir_ids.binary_search(&entry.id).is_err() {
-                    if entry_iter.advance_to_sibling() {
-                        continue;
-                    }
+                if expanded_dir_ids.binary_search(&entry.id).is_err()
+                    && entry_iter.advance_to_sibling()
+                {
+                    continue;
                 }
                 entry_iter.advance();
             }
@@ -982,7 +975,7 @@ impl ProjectPanel {
                             if let Some(processing_filename) = &edit_state.processing_filename {
                                 details.is_processing = true;
                                 details.filename.clear();
-                                details.filename.push_str(&processing_filename);
+                                details.filename.push_str(processing_filename);
                             } else {
                                 if edit_state.is_new_entry {
                                     details.filename.clear();
@@ -1116,7 +1109,7 @@ impl View for ProjectPanel {
                         cx,
                         move |this, range, items, cx| {
                             let theme = cx.global::<Settings>().theme.clone();
-                            this.for_each_visible_entry(range.clone(), cx, |id, details, cx| {
+                            this.for_each_visible_entry(range, cx, |id, details, cx| {
                                 items.push(Self::render_entry(
                                     id,
                                     details,

crates/rpc/src/conn.rs ๐Ÿ”—

@@ -50,6 +50,7 @@ impl Connection {
             killed,
         );
 
+        #[allow(clippy::type_complexity)]
         fn channel(
             killed: Arc<AtomicBool>,
             executor: Arc<gpui::executor::Background>,
@@ -76,9 +77,7 @@ impl Connection {
 
                         // Writes to a half-open TCP connection will error.
                         if killed.load(SeqCst) {
-                            std::io::Result::Err(
-                                Error::new(ErrorKind::Other, "connection lost").into(),
-                            )?;
+                            std::io::Result::Err(Error::new(ErrorKind::Other, "connection lost"))?;
                         }
 
                         Ok(msg)
@@ -87,7 +86,7 @@ impl Connection {
             });
 
             let rx = rx.then({
-                let killed = killed.clone();
+                let killed = killed;
                 let executor = Arc::downgrade(&executor);
                 move |msg| {
                     let killed = killed.clone();

crates/rpc/src/peer.rs ๐Ÿ”—

@@ -94,6 +94,7 @@ pub struct ConnectionState {
     #[serde(skip)]
     outgoing_tx: mpsc::UnboundedSender<proto::Message>,
     next_message_id: Arc<AtomicU32>,
+    #[allow(clippy::type_complexity)]
     #[serde(skip)]
     response_channels:
         Arc<Mutex<Option<HashMap<u32, oneshot::Sender<(proto::Envelope, oneshot::Sender<()>)>>>>>,
@@ -139,7 +140,7 @@ impl Peer {
 
         let connection_id = ConnectionId(self.next_connection_id.fetch_add(1, SeqCst));
         let connection_state = ConnectionState {
-            outgoing_tx: outgoing_tx.clone(),
+            outgoing_tx,
             next_message_id: Default::default(),
             response_channels: Arc::new(Mutex::new(Some(Default::default()))),
         };

crates/rpc/src/proto.rs ๐Ÿ”—

@@ -265,7 +265,9 @@ entity_messages!(
 
 entity_messages!(channel_id, ChannelMessageSent);
 
-const MAX_BUFFER_LEN: usize = 1 * 1024 * 1024;
+const KIB: usize = 1024;
+const MIB: usize = KIB * 1024;
+const MAX_BUFFER_LEN: usize = MIB;
 
 /// A stream of protobuf messages.
 pub struct MessageStream<S> {
@@ -273,6 +275,7 @@ pub struct MessageStream<S> {
     encoding_buffer: Vec<u8>,
 }
 
+#[allow(clippy::large_enum_variant)]
 #[derive(Debug)]
 pub enum Message {
     Envelope(Envelope),
@@ -309,7 +312,7 @@ where
                 self.encoding_buffer.reserve(message.encoded_len());
                 message
                     .encode(&mut self.encoding_buffer)
-                    .map_err(|err| io::Error::from(err))?;
+                    .map_err(io::Error::from)?;
                 let buffer =
                     zstd::stream::encode_all(self.encoding_buffer.as_slice(), COMPRESSION_LEVEL)
                         .unwrap();
@@ -360,10 +363,10 @@ where
     }
 }
 
-impl Into<SystemTime> for Timestamp {
-    fn into(self) -> SystemTime {
+impl From<Timestamp> for SystemTime {
+    fn from(val: Timestamp) -> Self {
         UNIX_EPOCH
-            .checked_add(Duration::new(self.seconds, self.nanos))
+            .checked_add(Duration::new(val.seconds, val.nanos))
             .unwrap()
     }
 }
@@ -451,7 +454,7 @@ mod tests {
         .unwrap();
         assert!(sink.encoding_buffer.capacity() <= MAX_BUFFER_LEN);
 
-        let mut stream = MessageStream::new(rx.map(|msg| anyhow::Ok(msg)));
+        let mut stream = MessageStream::new(rx.map(anyhow::Ok));
         stream.read().await.unwrap();
         assert!(stream.encoding_buffer.capacity() <= MAX_BUFFER_LEN);
         stream.read().await.unwrap();

crates/search/src/buffer_search.rs ๐Ÿ”—

@@ -216,7 +216,7 @@ impl BufferSearchBar {
 
     fn dismiss(&mut self, _: &Dismiss, cx: &mut ViewContext<Self>) {
         self.dismissed = true;
-        for (editor, _) in &self.editors_with_matches {
+        for editor in self.editors_with_matches.keys() {
             if let Some(editor) = editor.upgrade(cx) {
                 editor.update(cx, |editor, cx| {
                     editor.clear_background_highlights::<Self>(cx)
@@ -450,14 +450,11 @@ impl BufferSearchBar {
         event: &editor::Event,
         cx: &mut ViewContext<Self>,
     ) {
-        match event {
-            editor::Event::BufferEdited { .. } => {
-                self.query_contains_error = false;
-                self.clear_matches(cx);
-                self.update_matches(true, cx);
-                cx.notify();
-            }
-            _ => {}
+        if let editor::Event::BufferEdited { .. } = event {
+            self.query_contains_error = false;
+            self.clear_matches(cx);
+            self.update_matches(true, cx);
+            cx.notify();
         }
     }
 
@@ -586,7 +583,7 @@ impl BufferSearchBar {
             let ranges = self.editors_with_matches.get(&editor.downgrade())?;
             let editor = editor.read(cx);
             active_match_index(
-                &ranges,
+                ranges,
                 &editor.selections.newest_anchor().head(),
                 &editor.buffer().read(cx).snapshot(cx),
             )
@@ -610,7 +607,7 @@ mod tests {
     #[gpui::test]
     async fn test_search_simple(cx: &mut TestAppContext) {
         let fonts = cx.font_cache();
-        let mut theme = gpui::fonts::with_font_cache(fonts.clone(), || theme::Theme::default());
+        let mut theme = gpui::fonts::with_font_cache(fonts.clone(), theme::Theme::default);
         theme.search.match_background = Color::red();
         cx.update(|cx| {
             let mut settings = Settings::test(cx);
@@ -649,7 +646,7 @@ mod tests {
         search_bar.update(cx, |search_bar, cx| {
             search_bar.set_query("us", cx);
         });
-        editor.next_notification(&cx).await;
+        editor.next_notification(cx).await;
         editor.update(cx, |editor, cx| {
             assert_eq!(
                 editor.all_background_highlights(cx),
@@ -670,7 +667,7 @@ mod tests {
         search_bar.update(cx, |search_bar, cx| {
             search_bar.toggle_search_option(SearchOption::CaseSensitive, cx);
         });
-        editor.next_notification(&cx).await;
+        editor.next_notification(cx).await;
         editor.update(cx, |editor, cx| {
             assert_eq!(
                 editor.all_background_highlights(cx),
@@ -686,7 +683,7 @@ mod tests {
         search_bar.update(cx, |search_bar, cx| {
             search_bar.set_query("or", cx);
         });
-        editor.next_notification(&cx).await;
+        editor.next_notification(cx).await;
         editor.update(cx, |editor, cx| {
             assert_eq!(
                 editor.all_background_highlights(cx),
@@ -727,7 +724,7 @@ mod tests {
         search_bar.update(cx, |search_bar, cx| {
             search_bar.toggle_search_option(SearchOption::WholeWord, cx);
         });
-        editor.next_notification(&cx).await;
+        editor.next_notification(cx).await;
         editor.update(cx, |editor, cx| {
             assert_eq!(
                 editor.all_background_highlights(cx),

crates/search/src/project_search.rs ๐Ÿ”—

@@ -367,7 +367,7 @@ impl ProjectSearchView {
         });
         // Subcribe to query_editor in order to reraise editor events for workspace item activation purposes
         cx.subscribe(&query_editor, |_, _, event, cx| {
-            cx.emit(ViewEvent::EditorEvent(event.clone()))
+            cx.emit(ViewEvent::EditorEvent(*event))
         })
         .detach();
 
@@ -384,7 +384,7 @@ impl ProjectSearchView {
                 this.update_match_index(cx);
             }
             // Reraise editor events for workspace item activation purposes
-            cx.emit(ViewEvent::EditorEvent(event.clone()));
+            cx.emit(ViewEvent::EditorEvent(*event));
         })
         .detach();
 
@@ -567,6 +567,12 @@ impl ProjectSearchView {
     }
 }
 
+impl Default for ProjectSearchBar {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
 impl ProjectSearchBar {
     pub fn new() -> Self {
         Self {
@@ -903,7 +909,7 @@ mod tests {
     #[gpui::test]
     async fn test_project_search(cx: &mut TestAppContext) {
         let fonts = cx.font_cache();
-        let mut theme = gpui::fonts::with_font_cache(fonts.clone(), || theme::Theme::default());
+        let mut theme = gpui::fonts::with_font_cache(fonts.clone(), theme::Theme::default);
         theme.search.match_background = Color::red();
         cx.update(|cx| {
             let mut settings = Settings::test(cx);
@@ -933,7 +939,7 @@ mod tests {
                 .update(cx, |query_editor, cx| query_editor.set_text("TWO", cx));
             search_view.search(cx);
         });
-        search_view.next_notification(&cx).await;
+        search_view.next_notification(cx).await;
         search_view.update(cx, |search_view, cx| {
             assert_eq!(
                 search_view

crates/search/src/search.rs ๐Ÿ”—

@@ -66,9 +66,9 @@ pub(crate) fn active_match_index(
         None
     } else {
         match ranges.binary_search_by(|probe| {
-            if probe.end.cmp(&cursor, &*buffer).is_lt() {
+            if probe.end.cmp(cursor, &*buffer).is_lt() {
                 Ordering::Less
-            } else if probe.start.cmp(&cursor, &*buffer).is_gt() {
+            } else if probe.start.cmp(cursor, &*buffer).is_gt() {
                 Ordering::Greater
             } else {
                 Ordering::Equal
@@ -86,7 +86,7 @@ pub(crate) fn match_index_for_direction(
     direction: Direction,
     buffer: &MultiBufferSnapshot,
 ) -> usize {
-    if ranges[index].start.cmp(&cursor, &buffer).is_gt() {
+    if ranges[index].start.cmp(cursor, buffer).is_gt() {
         if direction == Direction::Prev {
             if index == 0 {
                 index = ranges.len() - 1;
@@ -94,7 +94,7 @@ pub(crate) fn match_index_for_direction(
                 index -= 1;
             }
         }
-    } else if ranges[index].end.cmp(&cursor, &buffer).is_lt() {
+    } else if ranges[index].end.cmp(cursor, buffer).is_lt() {
         if direction == Direction::Next {
             index = 0;
         }

crates/settings/src/keymap_file.rs ๐Ÿ”—

@@ -49,37 +49,37 @@ impl KeymapFileContent {
     pub fn load(asset_path: &str, cx: &mut MutableAppContext) -> Result<()> {
         let content = Assets::get(asset_path).unwrap().data;
         let content_str = std::str::from_utf8(content.as_ref()).unwrap();
-        Ok(parse_json_with_comments::<Self>(content_str)?.add(cx)?)
+        parse_json_with_comments::<Self>(content_str)?.add_to_cx(cx)
     }
 
-    pub fn add(self, cx: &mut MutableAppContext) -> Result<()> {
+    pub fn add_to_cx(self, cx: &mut MutableAppContext) -> Result<()> {
         for KeymapBlock { context, bindings } in self.0 {
-            cx.add_bindings(
-                bindings
-                    .into_iter()
-                    .map(|(keystroke, action)| {
-                        let action = action.0.get();
+            let bindings = bindings
+                .into_iter()
+                .map(|(keystroke, action)| {
+                    let action = action.0.get();
 
-                        // This is a workaround for a limitation in serde: serde-rs/json#497
-                        // We want to deserialize the action data as a `RawValue` so that we can
-                        // deserialize the action itself dynamically directly from the JSON
-                        // string. But `RawValue` currently does not work inside of an untagged enum.
-                        let action = if action.starts_with('[') {
-                            let ActionWithData(name, data) = serde_json::from_str(action)?;
-                            cx.deserialize_action(&name, Some(data.get()))
-                        } else {
-                            let name = serde_json::from_str(action)?;
-                            cx.deserialize_action(name, None)
-                        }
-                        .with_context(|| {
-                            format!(
+                    // This is a workaround for a limitation in serde: serde-rs/json#497
+                    // We want to deserialize the action data as a `RawValue` so that we can
+                    // deserialize the action itself dynamically directly from the JSON
+                    // string. But `RawValue` currently does not work inside of an untagged enum.
+                    let action = if action.starts_with('[') {
+                        let ActionWithData(name, data) = serde_json::from_str(action)?;
+                        cx.deserialize_action(&name, Some(data.get()))
+                    } else {
+                        let name = serde_json::from_str(action)?;
+                        cx.deserialize_action(name, None)
+                    }
+                    .with_context(|| {
+                        format!(
                             "invalid binding value for keystroke {keystroke}, context {context:?}"
                         )
-                        })?;
-                        Binding::load(&keystroke, action, context.as_deref())
-                    })
-                    .collect::<Result<Vec<_>>>()?,
-            )
+                    })?;
+                    Binding::load(&keystroke, action, context.as_deref())
+                })
+                .collect::<Result<Vec<_>>>()?;
+
+            cx.add_bindings(bindings);
         }
         Ok(())
     }
@@ -98,7 +98,7 @@ pub fn keymap_file_json_schema(action_names: &[&'static str]) -> serde_json::Val
                     instance_type: Some(SingleOrVec::Single(Box::new(InstanceType::String))),
                     enum_values: Some(
                         action_names
-                            .into_iter()
+                            .iter()
                             .map(|name| Value::String(name.to_string()))
                             .collect(),
                     ),

crates/settings/src/settings.rs ๐Ÿ”—

@@ -200,7 +200,7 @@ impl Settings {
             }
         }
         if let Some(value) = &data.theme {
-            if let Some(theme) = theme_registry.get(&value.to_string()).log_err() {
+            if let Some(theme) = theme_registry.get(value).log_err() {
                 self.theme = theme;
             }
         }
@@ -301,7 +301,7 @@ impl Settings {
             language_overrides: Default::default(),
             lsp: Default::default(),
             projects_online_by_default: true,
-            theme: gpui::fonts::with_font_cache(cx.font_cache().clone(), || Default::default()),
+            theme: gpui::fonts::with_font_cache(cx.font_cache().clone(), Default::default),
         }
     }
 
@@ -309,7 +309,7 @@ impl Settings {
     pub fn test_async(cx: &mut gpui::TestAppContext) {
         cx.update(|cx| {
             let settings = Self::test(cx);
-            cx.set_global(settings.clone());
+            cx.set_global(settings);
         });
     }
 }
@@ -327,12 +327,7 @@ pub fn settings_file_json_schema(
     // Create a schema for a theme name.
     let theme_name_schema = SchemaObject {
         instance_type: Some(SingleOrVec::Single(Box::new(InstanceType::String))),
-        enum_values: Some(
-            theme_names
-                .into_iter()
-                .map(|name| Value::String(name))
-                .collect(),
-        ),
+        enum_values: Some(theme_names.into_iter().map(Value::String).collect()),
         ..Default::default()
     };
 

crates/snippet/src/snippet.rs ๐Ÿ”—

@@ -78,22 +78,22 @@ fn parse_tabstop<'a>(
 ) -> Result<&'a str> {
     let tabstop_start = text.len();
     let tabstop_index;
-    if source.chars().next() == Some('{') {
+    if source.starts_with('{') {
         let (index, rest) = parse_int(&source[1..])?;
         tabstop_index = index;
         source = rest;
 
-        if source.chars().next() == Some(':') {
+        if source.starts_with(':') {
             source = parse_snippet(&source[1..], true, text, tabstops)?;
         }
 
-        if source.chars().next() == Some('}') {
+        if source.starts_with('}') {
             source = &source[1..];
         } else {
             return Err(anyhow!("expected a closing brace"));
         }
     } else {
-        let (index, rest) = parse_int(&source)?;
+        let (index, rest) = parse_int(source)?;
         tabstop_index = index;
         source = rest;
     }

crates/sum_tree/src/cursor.rs ๐Ÿ”—

@@ -160,7 +160,7 @@ where
 
         let mut descending = false;
         while !self.stack.is_empty() {
-            if let Some(StackEntry { position, .. }) = self.stack.iter().rev().skip(1).next() {
+            if let Some(StackEntry { position, .. }) = self.stack.iter().rev().nth(1) {
                 self.position = position.clone();
             } else {
                 self.position = D::default();
@@ -224,7 +224,7 @@ where
             self.did_seek = true;
         }
 
-        while self.stack.len() > 0 {
+        while !self.stack.is_empty() {
             let new_subtree = {
                 let entry = self.stack.last_mut().unwrap();
                 match entry.tree.0.as_ref() {
@@ -409,7 +409,7 @@ where
                         .zip(&child_summaries[entry.index..])
                     {
                         let mut child_end = self.position.clone();
-                        child_end.add_summary(&child_summary, cx);
+                        child_end.add_summary(child_summary, cx);
 
                         let comparison = target.cmp(&child_end, cx);
                         if comparison == Ordering::Greater
@@ -503,7 +503,7 @@ impl<'a, T: Item> Iterator for Iter<'a, T> {
             descend = true;
         }
 
-        while self.stack.len() > 0 {
+        while !self.stack.is_empty() {
             let new_subtree = {
                 let entry = self.stack.last_mut().unwrap();
                 match entry.tree.0.as_ref() {

crates/sum_tree/src/sum_tree.rs ๐Ÿ”—

@@ -304,7 +304,7 @@ impl<T: Item> SumTree<T> {
     }
 
     pub fn push_tree(&mut self, other: Self, cx: &<T::Summary as Summary>::Context) {
-        if !other.0.is_leaf() || other.0.items().len() > 0 {
+        if !other.0.is_leaf() || !other.0.items().is_empty() {
             if self.0.height() < other.0.height() {
                 for tree in other.0.child_trees() {
                     self.push_tree(tree.clone(), cx);
@@ -610,10 +610,7 @@ pub enum Node<T: Item> {
 
 impl<T: Item> Node<T> {
     fn is_leaf(&self) -> bool {
-        match self {
-            Node::Leaf { .. } => true,
-            _ => false,
-        }
+        matches!(self, Node::Leaf { .. })
     }
 
     fn height(&self) -> u8 {
@@ -786,8 +783,7 @@ mod tests {
                 while item_ix < expected_filtered_items.len() {
                     log::info!("filter_cursor, item_ix: {}", item_ix);
                     let actual_item = filter_cursor.item().unwrap();
-                    let (reference_index, reference_item) =
-                        expected_filtered_items[item_ix].clone();
+                    let (reference_index, reference_item) = expected_filtered_items[item_ix];
                     assert_eq!(actual_item, &reference_item);
                     assert_eq!(filter_cursor.start().0, reference_index);
                     log::info!("next");

crates/sum_tree/src/tree_map.rs ๐Ÿ”—

@@ -73,7 +73,7 @@ impl<K: Clone + Debug + Default + Ord, V: Clone + Debug> TreeMap<K, V> {
         removed
     }
 
-    pub fn iter<'a>(&'a self) -> impl 'a + Iterator<Item = (&'a K, &'a V)> {
+    pub fn iter(&self) -> impl Iterator<Item = (&K, &V)> + '_ {
         self.0.iter().map(|entry| (&entry.key, &entry.value))
     }
 }
@@ -162,7 +162,7 @@ where
         self.0.get(key).is_some()
     }
 
-    pub fn iter<'a>(&'a self) -> impl 'a + Iterator<Item = &'a K> {
+    pub fn iter(&self) -> impl Iterator<Item = &K> + '_ {
         self.0.iter().map(|(k, _)| k)
     }
 }

crates/terminal/src/connected_el.rs ๐Ÿ”—

@@ -190,7 +190,7 @@ impl RelativeHighlightedRange {
         let end_x =
             origin.x() + self.range.end as f32 * layout.size.cell_width + layout.size.cell_width;
 
-        return HighlightedRangeLine { start_x, end_x };
+        HighlightedRangeLine { start_x, end_x }
     }
 }
 
@@ -273,7 +273,7 @@ impl TerminalEl {
                                     cur_rect = cur_rect.take().map(|rect| rect.extend());
                                 } else {
                                     cur_alac_color = Some(bg);
-                                    if let Some(_) = cur_rect {
+                                    if cur_rect.is_some() {
                                         rects.push(cur_rect.take().unwrap());
                                     }
                                     cur_rect = Some(LayoutRect::new(
@@ -402,7 +402,7 @@ impl TerminalEl {
 
         RunStyle {
             color: fg,
-            font_id: font_id,
+            font_id,
             underline,
         }
     }
@@ -416,9 +416,9 @@ impl TerminalEl {
         display_offset: usize,
         cx: &mut PaintContext,
     ) {
-        let mouse_down_connection = self.terminal.clone();
-        let click_connection = self.terminal.clone();
-        let drag_connection = self.terminal.clone();
+        let mouse_down_connection = self.terminal;
+        let click_connection = self.terminal;
+        let drag_connection = self.terminal;
         cx.scene.push_mouse_region(
             MouseRegion::new(view_id, None, visible_bounds)
                 .on_down(
@@ -500,7 +500,7 @@ impl TerminalEl {
             .terminal_overrides
             .font_family
             .as_ref()
-            .or_else(|| settings.terminal_defaults.font_family.as_ref())
+            .or(settings.terminal_defaults.font_family.as_ref())
             .and_then(|family_name| font_cache.load_family(&[family_name]).log_err())
             .unwrap_or(settings.buffer_font_family);
 
@@ -581,7 +581,7 @@ impl Element for TerminalEl {
 
         //Setup layout information
         let terminal_theme = settings.theme.terminal.clone(); //TODO: Try to minimize this clone.
-        let text_style = TerminalEl::make_text_style(font_cache, &settings);
+        let text_style = TerminalEl::make_text_style(font_cache, settings);
         let selection_color = settings.theme.editor.selection.selection;
         let dimensions = {
             let line_height = font_cache.line_height(text_style.font_size);
@@ -590,9 +590,9 @@ impl Element for TerminalEl {
         };
 
         let background_color = if self.modal {
-            terminal_theme.colors.modal_background.clone()
+            terminal_theme.colors.modal_background
         } else {
-            terminal_theme.colors.background.clone()
+            terminal_theme.colors.background
         };
 
         let (cells, selection, cursor, display_offset, cursor_text) = self
@@ -614,17 +614,17 @@ impl Element for TerminalEl {
                             //             && !ic.flags.contains(Flags::INVERSE))
                             // })
                             .map(|ic| IndexedCell {
-                                point: ic.point.clone(),
+                                point: ic.point,
                                 cell: ic.cell.clone(),
                             }),
                     );
 
                     (
                         cells,
-                        content.selection.clone(),
-                        content.cursor.clone(),
-                        content.display_offset.clone(),
-                        cursor_text.clone(),
+                        content.selection,
+                        content.cursor,
+                        content.display_offset,
+                        cursor_text,
                     )
                 })
             });
@@ -666,7 +666,7 @@ impl Element for TerminalEl {
                         dimensions.line_height,
                         terminal_theme.colors.cursor,
                         CursorShape::Block,
-                        Some(cursor_text.clone()),
+                        Some(cursor_text),
                     )
                 },
             )
@@ -721,7 +721,7 @@ impl Element for TerminalEl {
                 });
 
                 for rect in &layout.rects {
-                    rect.paint(origin, &layout, cx)
+                    rect.paint(origin, layout, cx)
                 }
             });
 
@@ -786,11 +786,11 @@ impl Element for TerminalEl {
                     let vertical_scroll =
                         (delta.y() / layout.size.line_height) * ALACRITTY_SCROLL_MULTIPLIER;
 
-                    self.terminal.upgrade(cx.app).map(|terminal| {
+                    if let Some(terminal) = self.terminal.upgrade(cx.app) {
                         terminal.update(cx.app, |term, _| {
                             term.scroll(Scroll::Delta(vertical_scroll.round() as i32))
                         });
-                    });
+                    }
 
                     cx.notify();
                 })

crates/terminal/src/connected_view.rs ๐Ÿ”—

@@ -82,7 +82,7 @@ impl ConnectedView {
             has_new_content: true,
             has_bell: false,
             modal,
-            context_menu: cx.add_view(|cx| ContextMenu::new(cx)),
+            context_menu: cx.add_view(ContextMenu::new),
         }
     }
 
@@ -127,9 +127,9 @@ impl ConnectedView {
 
     ///Attempt to paste the clipboard into the terminal
     fn paste(&mut self, _: &Paste, cx: &mut ViewContext<Self>) {
-        cx.read_from_clipboard().map(|item| {
+        if let Some(item) = cx.read_from_clipboard() {
             self.terminal.read(cx).paste(item.text());
-        });
+        }
     }
 
     ///Synthesize the keyboard event corresponding to 'up'

crates/terminal/src/mappings/colors.rs ๐Ÿ”—

@@ -110,7 +110,7 @@ pub fn get_color_at_index(index: &usize, colors: &TerminalColors) -> Color {
 ///
 ///This function does the reverse, calculating the r, g, and b components from a given index.
 fn rgb_for_index(i: &u8) -> (u8, u8, u8) {
-    debug_assert!(i >= &16 && i <= &231);
+    debug_assert!((&16..=&231).contains(&i));
     let i = i - 16;
     let r = (i - (i % 36)) / 36;
     let g = ((i % 36) - (i % 6)) / 6;

crates/terminal/src/mappings/keys.rs ๐Ÿ”—

@@ -48,7 +48,7 @@ pub fn might_convert(keystroke: &Keystroke) -> bool {
 }
 
 pub fn to_esc_str(keystroke: &Keystroke, mode: &TermMode) -> Option<String> {
-    let modifiers = Modifiers::new(&keystroke);
+    let modifiers = Modifiers::new(keystroke);
 
     // Manual Bindings including modifiers
     let manual_esc_str = match (keystroke.key.as_ref(), &modifiers) {
@@ -204,7 +204,7 @@ pub fn to_esc_str(keystroke: &Keystroke, mode: &TermMode) -> Option<String> {
 
     // Automated bindings applying modifiers
     if modifiers.any() {
-        let modifier_code = modifier_code(&keystroke);
+        let modifier_code = modifier_code(keystroke);
         let modified_esc_str = match keystroke.key.as_ref() {
             "up" => Some(format!("\x1b[1;{}A", modifier_code)),
             "down" => Some(format!("\x1b[1;{}B", modifier_code)),

crates/terminal/src/modal.rs ๐Ÿ”—

@@ -58,9 +58,7 @@ pub fn deploy_modal(workspace: &mut Workspace, _: &DeployModal, cx: &mut ViewCon
                 let terminal_handle = connected.read(cx).handle();
                 // Set the global immediately if terminal construction was successful,
                 // in case the user opens the command palette
-                cx.set_global::<Option<StoredTerminal>>(Some(StoredTerminal(
-                    terminal_handle.clone(),
-                )));
+                cx.set_global::<Option<StoredTerminal>>(Some(StoredTerminal(terminal_handle)));
             }
         }
     }

crates/terminal/src/terminal.rs ๐Ÿ”—

@@ -137,13 +137,13 @@ impl Default for TerminalSize {
     }
 }
 
-impl Into<WindowSize> for TerminalSize {
-    fn into(self) -> WindowSize {
+impl From<TerminalSize> for WindowSize {
+    fn from(val: TerminalSize) -> Self {
         WindowSize {
-            num_lines: self.num_lines() as u16,
-            num_cols: self.num_columns() as u16,
-            cell_width: self.cell_width() as u16,
-            cell_height: self.line_height() as u16,
+            num_lines: val.num_lines() as u16,
+            num_cols: val.num_columns() as u16,
+            cell_width: val.cell_width() as u16,
+            cell_height: val.line_height() as u16,
         }
     }
 }
@@ -269,7 +269,7 @@ impl TerminalBuilder {
             }
         };
 
-        let mut env = env.unwrap_or_else(|| HashMap::new());
+        let mut env = env.unwrap_or_default();
 
         //TODO: Properly set the current locale,
         env.insert("LC_ALL".to_string(), "en_US.UTF-8".to_string());
@@ -293,7 +293,7 @@ impl TerminalBuilder {
         let term = Arc::new(FairMutex::new(term));
 
         //Setup the pty...
-        let pty = match tty::new(&pty_config, initial_size.clone().into(), None) {
+        let pty = match tty::new(&pty_config, initial_size.into(), None) {
             Ok(pty) => pty,
             Err(error) => {
                 bail!(TerminalError {
@@ -321,7 +321,7 @@ impl TerminalBuilder {
         //And connect them together
         let event_loop = EventLoop::new(
             term.clone(),
-            ZedListener(events_tx.clone()),
+            ZedListener(events_tx),
             pty,
             pty_config.hold,
             false,
@@ -379,7 +379,7 @@ impl TerminalBuilder {
                         }
                     }
 
-                    if events.len() == 0 {
+                    if events.is_empty() {
                         smol::future::yield_now().await;
                         break 'outer;
                     } else {
@@ -459,11 +459,11 @@ impl Terminal {
             AlacTermEvent::ClipboardLoad(_, format) => self.notify_pty(format(
                 &cx.read_from_clipboard()
                     .map(|ci| ci.text().to_string())
-                    .unwrap_or("".to_string()),
+                    .unwrap_or_else(|| "".to_string()),
             )),
             AlacTermEvent::PtyWrite(out) => self.notify_pty(out.clone()),
             AlacTermEvent::TextAreaSizeRequest(format) => {
-                self.notify_pty(format(self.cur_size.clone().into()))
+                self.notify_pty(format(self.cur_size.into()))
             }
             AlacTermEvent::CursorBlinkingChange => {
                 //TODO whatever state we need to set to get the cursor blinking
@@ -500,24 +500,19 @@ impl Terminal {
     ) {
         // TODO: Handle is_self_focused in subscription on terminal view
         match event {
-            InternalEvent::TermEvent(term_event) => match term_event {
-                //Needs to lock
-                AlacTermEvent::ColorRequest(index, format) => {
+            InternalEvent::TermEvent(term_event) => {
+                if let AlacTermEvent::ColorRequest(index, format) = term_event {
                     let color = term.colors()[*index].unwrap_or_else(|| {
                         let term_style = &cx.global::<Settings>().theme.terminal;
                         to_alac_rgb(get_color_at_index(index, &term_style.colors))
                     });
                     self.notify_pty(format(color))
                 }
-                _ => {} //Other events are handled in the event loop
-            },
+            }
             InternalEvent::Resize(new_size) => {
-                self.cur_size = new_size.clone();
+                self.cur_size = *new_size;
 
-                self.pty_tx
-                    .0
-                    .send(Msg::Resize(new_size.clone().into()))
-                    .ok();
+                self.pty_tx.0.send(Msg::Resize((*new_size).into())).ok();
 
                 term.resize(*new_size);
             }
@@ -553,7 +548,7 @@ impl Terminal {
 
     ///Resize the terminal and the PTY.
     pub fn set_size(&mut self, new_size: TerminalSize) {
-        self.events.push(InternalEvent::Resize(new_size.into()))
+        self.events.push(InternalEvent::Resize(new_size))
     }
 
     pub fn clear(&mut self) {
@@ -574,7 +569,7 @@ impl Terminal {
     pub fn paste(&self, text: &str) {
         if self.last_mode.contains(TermMode::BRACKETED_PASTE) {
             self.notify_pty("\x1b[200~".to_string());
-            self.notify_pty(text.replace('\x1b', "").to_string());
+            self.notify_pty(text.replace('\x1b', ""));
             self.notify_pty("\x1b[201~".to_string());
         } else {
             self.notify_pty(text.replace("\r\n", "\r").replace('\n', "\r"));
@@ -597,7 +592,7 @@ impl Terminal {
         }
 
         // self.utilization = Self::estimate_utilization(term.take_last_processed_bytes());
-        self.last_mode = term.mode().clone();
+        self.last_mode = *term.mode();
 
         let content = term.renderable_content();
 
@@ -668,7 +663,7 @@ mod tests {
 mod alacritty_unix {
     use alacritty_terminal::config::Program;
     use gpui::anyhow::{bail, Result};
-    use libc;
+
     use std::ffi::CStr;
     use std::mem::MaybeUninit;
     use std::ptr;

crates/terminal/src/terminal_view.rs ๐Ÿ”—

@@ -99,7 +99,7 @@ impl TerminalView {
             Ok(terminal) => {
                 let terminal = cx.add_model(|cx| terminal.subscribe(cx));
                 let view = cx.add_view(|cx| ConnectedView::from_terminal(terminal, modal, cx));
-                cx.subscribe(&view, |_this, _content, event, cx| cx.emit(event.clone()))
+                cx.subscribe(&view, |_this, _content, event, cx| cx.emit(*event))
                     .detach();
                 TerminalContent::Connected(view)
             }
@@ -206,7 +206,7 @@ impl View for ErrorView {
             )
             .with_child(Text::new(program_text, style.clone()).contained().boxed())
             .with_child(Text::new(directory_text, style.clone()).contained().boxed())
-            .with_child(Text::new(error_text, style.clone()).contained().boxed())
+            .with_child(Text::new(error_text, style).contained().boxed())
             .aligned()
             .boxed()
     }
@@ -333,7 +333,7 @@ pub fn get_working_directory(
                 .filter(|dir| dir.is_dir())
         }
     };
-    res.or_else(|| home_dir())
+    res.or_else(home_dir)
 }
 
 ///Get's the first project's home directory, or the home directory

crates/text/src/anchor.rs ๐Ÿ”—

@@ -33,7 +33,7 @@ impl Anchor {
         } else {
             buffer
                 .fragment_id_for_anchor(self)
-                .cmp(&buffer.fragment_id_for_anchor(other))
+                .cmp(buffer.fragment_id_for_anchor(other))
         };
 
         fragment_id_comparison
@@ -43,17 +43,17 @@ impl Anchor {
 
     pub fn min(&self, other: &Self, buffer: &BufferSnapshot) -> Self {
         if self.cmp(other, buffer).is_le() {
-            self.clone()
+            *self
         } else {
-            other.clone()
+            *other
         }
     }
 
     pub fn max(&self, other: &Self, buffer: &BufferSnapshot) -> Self {
         if self.cmp(other, buffer).is_ge() {
-            self.clone()
+            *self
         } else {
-            other.clone()
+            *other
         }
     }
 
@@ -67,7 +67,7 @@ impl Anchor {
 
     pub fn bias_left(&self, buffer: &BufferSnapshot) -> Anchor {
         if self.bias == Bias::Left {
-            self.clone()
+            *self
         } else {
             buffer.anchor_before(self)
         }
@@ -75,13 +75,13 @@ impl Anchor {
 
     pub fn bias_right(&self, buffer: &BufferSnapshot) -> Anchor {
         if self.bias == Bias::Right {
-            self.clone()
+            *self
         } else {
             buffer.anchor_after(self)
         }
     }
 
-    pub fn summary<'a, D>(&self, content: &'a BufferSnapshot) -> D
+    pub fn summary<D>(&self, content: &BufferSnapshot) -> D
     where
         D: TextDimension,
     {
@@ -100,7 +100,7 @@ where
     T: ToOffset,
 {
     fn to_offset(&self, snapshot: &BufferSnapshot) -> Range<usize> {
-        self.start.to_offset(snapshot)..self.end.to_offset(&snapshot)
+        self.start.to_offset(snapshot)..self.end.to_offset(snapshot)
     }
 
     fn to_point(&self, snapshot: &BufferSnapshot) -> Range<Point> {
@@ -122,7 +122,7 @@ impl AnchorRangeExt for Range<Anchor> {
     fn cmp(&self, other: &Range<Anchor>, buffer: &BufferSnapshot) -> Result<Ordering> {
         Ok(match self.start.cmp(&other.start, buffer) {
             Ordering::Equal => other.end.cmp(&self.end, buffer),
-            ord @ _ => ord,
+            ord => ord,
         })
     }
 }

crates/text/src/locator.rs ๐Ÿ”—

@@ -41,6 +41,10 @@ impl Locator {
     pub fn len(&self) -> usize {
         self.0.len()
     }
+
+    pub fn is_empty(&self) -> bool {
+        self.len() == 0
+    }
 }
 
 impl Default for Locator {

crates/text/src/operation_queue.rs ๐Ÿ”—

@@ -26,6 +26,12 @@ impl OperationKey {
     }
 }
 
+impl<T: Operation> Default for OperationQueue<T> {
+    fn default() -> Self {
+        OperationQueue::new()
+    }
+}
+
 impl<T: Operation> OperationQueue<T> {
     pub fn new() -> Self {
         OperationQueue(SumTree::new())
@@ -35,6 +41,10 @@ impl<T: Operation> OperationQueue<T> {
         self.0.summary().len
     }
 
+    pub fn is_empty(&self) -> bool {
+        self.len() == 0
+    }
+
     pub fn insert(&mut self, mut ops: Vec<T>) {
         ops.sort_by_key(|op| op.lamport_timestamp());
         ops.dedup_by_key(|op| op.lamport_timestamp());

crates/text/src/patch.rs ๐Ÿ”—

@@ -548,7 +548,7 @@ mod tests {
         let composed = patches[0].compose(&patches[1]);
         log::info!("composed patch: {:?}", &composed);
 
-        let mut actual_chars = initial_chars.clone();
+        let mut actual_chars = initial_chars;
         for edit in composed.0 {
             actual_chars.splice(
                 edit.new.start as usize..edit.new.start as usize + edit.old.len(),
@@ -570,7 +570,7 @@ mod tests {
         apply_patch(&mut expected, &old, &inserted);
         apply_patch(&mut expected, &new, &inserted);
 
-        let mut actual = original.clone();
+        let mut actual = original;
         apply_patch(&mut actual, &composed, &expected);
         assert_eq!(
             actual.into_iter().collect::<String>(),

crates/text/src/point.rs ๐Ÿ”—

@@ -23,7 +23,7 @@ impl Point {
         Point::new(0, 0)
     }
 
-    pub fn from_str(s: &str) -> Self {
+    pub fn parse_str(s: &str) -> Self {
         let mut point = Self::zero();
         for (row, line) in s.split('\n').enumerate() {
             point.row = row as u32;

crates/text/src/rope.rs ๐Ÿ”—

@@ -123,6 +123,10 @@ impl Rope {
         self.chunks.extent(&())
     }
 
+    pub fn is_empty(&self) -> bool {
+        self.len() == 0
+    }
+
     pub fn max_point(&self) -> Point {
         self.chunks.extent(&())
     }
@@ -152,7 +156,7 @@ impl Rope {
         Bytes::new(self, range)
     }
 
-    pub fn chunks<'a>(&'a self) -> Chunks<'a> {
+    pub fn chunks(&self) -> Chunks {
         self.chunks_in_range(0..self.len())
     }
 
@@ -896,7 +900,7 @@ impl sum_tree::Summary for TextSummary {
     }
 }
 
-impl<'a> std::ops::Add<Self> for TextSummary {
+impl std::ops::Add<Self> for TextSummary {
     type Output = Self;
 
     fn add(mut self, rhs: Self) -> Self::Output {
@@ -946,7 +950,7 @@ pub trait TextDimension: 'static + for<'a> Dimension<'a, ChunkSummary> {
     fn add_assign(&mut self, other: &Self);
 }
 
-impl<'a, D1: TextDimension, D2: TextDimension> TextDimension for (D1, D2) {
+impl<D1: TextDimension, D2: TextDimension> TextDimension for (D1, D2) {
     fn from_text_summary(summary: &TextSummary) -> Self {
         (
             D1::from_text_summary(summary),

crates/text/src/tests.rs ๐Ÿ”—

@@ -42,7 +42,7 @@ fn test_random_edits(mut rng: StdRng) {
     let mut reference_string = RandomCharIter::new(&mut rng)
         .take(reference_string_len)
         .collect::<String>();
-    let mut buffer = Buffer::new(0, 0, reference_string.clone().into());
+    let mut buffer = Buffer::new(0, 0, reference_string.clone());
     LineEnding::normalize(&mut reference_string);
 
     buffer.history.group_interval = Duration::from_millis(rng.gen_range(0..=200));
@@ -56,7 +56,7 @@ fn test_random_edits(mut rng: StdRng) {
     for _i in 0..operations {
         let (edits, _) = buffer.randomly_edit(&mut rng, 5);
         for (old_range, new_text) in edits.iter().rev() {
-            reference_string.replace_range(old_range.clone(), &new_text);
+            reference_string.replace_range(old_range.clone(), new_text);
         }
 
         assert_eq!(buffer.text(), reference_string);
@@ -677,9 +677,9 @@ fn test_concurrent_edits() {
     buffer1.apply_op(buf2_op.clone()).unwrap();
     buffer1.apply_op(buf3_op.clone()).unwrap();
     buffer2.apply_op(buf1_op.clone()).unwrap();
-    buffer2.apply_op(buf3_op.clone()).unwrap();
-    buffer3.apply_op(buf1_op.clone()).unwrap();
-    buffer3.apply_op(buf2_op.clone()).unwrap();
+    buffer2.apply_op(buf3_op).unwrap();
+    buffer3.apply_op(buf1_op).unwrap();
+    buffer3.apply_op(buf2_op).unwrap();
 
     assert_eq!(buffer1.text(), "a12c34e56");
     assert_eq!(buffer2.text(), "a12c34e56");
@@ -704,7 +704,7 @@ fn test_random_concurrent_edits(mut rng: StdRng) {
     let mut network = Network::new(rng.clone());
 
     for i in 0..peers {
-        let mut buffer = Buffer::new(i as ReplicaId, 0, base_text.clone().into());
+        let mut buffer = Buffer::new(i as ReplicaId, 0, base_text.clone());
         buffer.history.group_interval = Duration::from_millis(rng.gen_range(0..=200));
         buffers.push(buffer);
         replica_ids.push(i as u16);

crates/text/src/text.rs ๐Ÿ”—

@@ -530,7 +530,7 @@ impl Buffer {
         let mut version = clock::Global::new();
 
         let visible_text = Rope::from(history.base_text.as_ref());
-        if visible_text.len() > 0 {
+        if !visible_text.is_empty() {
             let insertion_timestamp = InsertionTimestamp {
                 replica_id: 0,
                 local: 1,
@@ -860,7 +860,7 @@ impl Buffer {
             return;
         }
 
-        let edits = ranges.into_iter().zip(new_text.into_iter());
+        let edits = ranges.iter().zip(new_text.iter());
         let mut edits_patch = Patch::default();
         let mut insertion_slices = Vec::new();
         let cx = Some(version.clone());
@@ -1242,6 +1242,7 @@ impl Buffer {
         }
     }
 
+    #[allow(clippy::needless_collect)]
     pub fn undo_to_transaction(&mut self, transaction_id: TransactionId) -> Vec<Operation> {
         let transactions = self
             .history
@@ -1249,6 +1250,7 @@ impl Buffer {
             .iter()
             .map(|entry| entry.transaction.clone())
             .collect::<Vec<_>>();
+
         transactions
             .into_iter()
             .map(|transaction| self.undo_or_redo(transaction).unwrap())
@@ -1270,6 +1272,7 @@ impl Buffer {
         }
     }
 
+    #[allow(clippy::needless_collect)]
     pub fn redo_to_transaction(&mut self, transaction_id: TransactionId) -> Vec<Operation> {
         let transactions = self
             .history
@@ -1277,6 +1280,7 @@ impl Buffer {
             .iter()
             .map(|entry| entry.transaction.clone())
             .collect::<Vec<_>>();
+
         transactions
             .into_iter()
             .map(|transaction| self.undo_or_redo(transaction).unwrap())
@@ -1293,7 +1297,7 @@ impl Buffer {
             id: self.local_clock.tick(),
             version: self.version(),
             counts,
-            transaction_version: transaction.start.clone(),
+            transaction_version: transaction.start,
         };
         self.apply_undo(&undo)?;
         let operation = Operation::Undo {
@@ -1490,6 +1494,7 @@ impl Buffer {
         start..end
     }
 
+    #[allow(clippy::type_complexity)]
     pub fn randomly_edit<T>(
         &mut self,
         rng: &mut T,
@@ -1574,6 +1579,10 @@ impl BufferSnapshot {
         self.visible_text.len()
     }
 
+    pub fn is_empty(&self) -> bool {
+        self.len() == 0
+    }
+
     pub fn chars(&self) -> impl Iterator<Item = char> + '_ {
         self.chars_at(0)
     }
@@ -1609,8 +1618,8 @@ impl BufferSnapshot {
             .filter(|&len| {
                 let left = self
                     .chars_for_range(offset - len..offset)
-                    .flat_map(|c| char::to_lowercase(c));
-                let right = needle[..len].chars().flat_map(|c| char::to_lowercase(c));
+                    .flat_map(char::to_lowercase);
+                let right = needle[..len].chars().flat_map(char::to_lowercase);
                 left.eq(right)
             })
             .last()
@@ -1684,15 +1693,12 @@ impl BufferSnapshot {
         &self.version
     }
 
-    pub fn chars_at<'a, T: ToOffset>(&'a self, position: T) -> impl Iterator<Item = char> + 'a {
+    pub fn chars_at<T: ToOffset>(&self, position: T) -> impl Iterator<Item = char> + '_ {
         let offset = position.to_offset(self);
         self.visible_text.chars_at(offset)
     }
 
-    pub fn reversed_chars_at<'a, T: ToOffset>(
-        &'a self,
-        position: T,
-    ) -> impl Iterator<Item = char> + 'a {
+    pub fn reversed_chars_at<T: ToOffset>(&self, position: T) -> impl Iterator<Item = char> + '_ {
         let offset = position.to_offset(self);
         self.visible_text.reversed_chars_at(offset)
     }
@@ -1702,13 +1708,13 @@ impl BufferSnapshot {
         self.visible_text.reversed_chunks_in_range(range)
     }
 
-    pub fn bytes_in_range<'a, T: ToOffset>(&'a self, range: Range<T>) -> rope::Bytes<'a> {
+    pub fn bytes_in_range<T: ToOffset>(&self, range: Range<T>) -> rope::Bytes<'_> {
         let start = range.start.to_offset(self);
         let end = range.end.to_offset(self);
         self.visible_text.bytes_in_range(start..end)
     }
 
-    pub fn text_for_range<'a, T: ToOffset>(&'a self, range: Range<T>) -> Chunks<'a> {
+    pub fn text_for_range<T: ToOffset>(&self, range: Range<T>) -> Chunks<'_> {
         let start = range.start.to_offset(self);
         let end = range.end.to_offset(self);
         self.visible_text.chunks_in_range(start..end)
@@ -1729,7 +1735,7 @@ impl BufferSnapshot {
             .all(|chunk| chunk.matches(|c: char| !c.is_whitespace()).next().is_none())
     }
 
-    pub fn text_summary_for_range<'a, D, O: ToOffset>(&'a self, range: Range<O>) -> D
+    pub fn text_summary_for_range<D, O: ToOffset>(&self, range: Range<O>) -> D
     where
         D: TextDimension,
     {
@@ -1788,7 +1794,7 @@ impl BufferSnapshot {
         })
     }
 
-    fn summary_for_anchor<'a, D>(&'a self, anchor: &Anchor) -> D
+    fn summary_for_anchor<D>(&self, anchor: &Anchor) -> D
     where
         D: TextDimension,
     {
@@ -2048,7 +2054,7 @@ impl<'a, D: TextDimension + Ord, F: FnMut(&FragmentSummary) -> bool> Iterator fo
                 break;
             }
 
-            if !fragment.was_visible(&self.since, &self.undos) && fragment.visible {
+            if !fragment.was_visible(self.since, self.undos) && fragment.visible {
                 let mut visible_end = cursor.end(&None).visible;
                 if fragment.id == *self.range.end.0 {
                     visible_end = cmp::min(
@@ -2070,7 +2076,7 @@ impl<'a, D: TextDimension + Ord, F: FnMut(&FragmentSummary) -> bool> Iterator fo
                 }
 
                 self.new_end = new_end;
-            } else if fragment.was_visible(&self.since, &self.undos) && !fragment.visible {
+            } else if fragment.was_visible(self.since, self.undos) && !fragment.visible {
                 let mut deleted_end = cursor.end(&None).deleted;
                 if fragment.id == *self.range.end.0 {
                     deleted_end = cmp::min(
@@ -2354,10 +2360,7 @@ impl Operation {
     }
 
     pub fn is_edit(&self) -> bool {
-        match self {
-            Operation::Edit { .. } => true,
-            _ => false,
-        }
+        matches!(self, Operation::Edit { .. })
     }
 }
 
@@ -2423,7 +2426,7 @@ impl LineEnding {
 }
 
 pub trait ToOffset {
-    fn to_offset<'a>(&self, snapshot: &BufferSnapshot) -> usize;
+    fn to_offset(&self, snapshot: &BufferSnapshot) -> usize;
 }
 
 impl ToOffset for Point {
@@ -2464,7 +2467,7 @@ impl<'a, T: ToOffset> ToOffset for &'a T {
 }
 
 pub trait ToPoint {
-    fn to_point<'a>(&self, snapshot: &BufferSnapshot) -> Point;
+    fn to_point(&self, snapshot: &BufferSnapshot) -> Point;
 }
 
 impl ToPoint for Anchor {
@@ -2492,7 +2495,7 @@ impl ToPoint for Point {
 }
 
 pub trait ToPointUtf16 {
-    fn to_point_utf16<'a>(&self, snapshot: &BufferSnapshot) -> PointUtf16;
+    fn to_point_utf16(&self, snapshot: &BufferSnapshot) -> PointUtf16;
 }
 
 impl ToPointUtf16 for Anchor {
@@ -2520,7 +2523,7 @@ impl ToPointUtf16 for Point {
 }
 
 pub trait ToOffsetUtf16 {
-    fn to_offset_utf16<'a>(&self, snapshot: &BufferSnapshot) -> OffsetUtf16;
+    fn to_offset_utf16(&self, snapshot: &BufferSnapshot) -> OffsetUtf16;
 }
 
 impl ToOffsetUtf16 for Anchor {

crates/theme_selector/src/theme_selector.rs ๐Ÿ”—

@@ -44,7 +44,7 @@ impl ThemeSelector {
         theme_names.sort_unstable_by(|a, b| {
             a.ends_with("dark")
                 .cmp(&b.ends_with("dark"))
-                .then_with(|| a.cmp(&b))
+                .then_with(|| a.cmp(b))
         });
         let matches = theme_names
             .iter()

crates/util/src/lib.rs ๐Ÿ”—

@@ -128,7 +128,9 @@ struct Defer<F: FnOnce()>(Option<F>);
 
 impl<F: FnOnce()> Drop for Defer<F> {
     fn drop(&mut self) {
-        self.0.take().map(|f| f());
+        if let Some(f) = self.0.take() {
+            f()
+        }
     }
 }
 

crates/util/src/test/marked_text.rs ๐Ÿ”—

@@ -195,19 +195,19 @@ pub fn generate_marked_text(
             match range.start.cmp(&range.end) {
                 Ordering::Less => {
                     marked_text.insert_str(range.end, "ห‡ยป");
-                    marked_text.insert_str(range.start, "ยซ");
+                    marked_text.insert(range.start, 'ยซ');
                 }
                 Ordering::Equal => {
-                    marked_text.insert_str(range.start, "ห‡");
+                    marked_text.insert(range.start, 'ห‡');
                 }
                 Ordering::Greater => {
-                    marked_text.insert_str(range.start, "ยป");
+                    marked_text.insert(range.start, 'ยป');
                     marked_text.insert_str(range.end, "ยซห‡");
                 }
             }
         } else {
-            marked_text.insert_str(range.end, "ยป");
-            marked_text.insert_str(range.start, "ยซ");
+            marked_text.insert(range.end, 'ยป');
+            marked_text.insert(range.start, 'ยซ');
         }
     }
     marked_text

crates/vim/src/motion.rs ๐Ÿ”—

@@ -126,10 +126,10 @@ fn motion(motion: Motion, cx: &mut MutableAppContext) {
 impl Motion {
     pub fn linewise(self) -> bool {
         use Motion::*;
-        match self {
-            Down | Up | StartOfDocument | EndOfDocument | CurrentLine => true,
-            _ => false,
-        }
+        matches!(
+            self,
+            Down | Up | StartOfDocument | EndOfDocument | CurrentLine
+        )
     }
 
     pub fn inclusive(self) -> bool {
@@ -282,8 +282,7 @@ fn next_word_end(
     // we have backtraced already
     if !map
         .chars_at(point)
-        .skip(1)
-        .next()
+        .nth(1)
         .map(|c| c == '\n')
         .unwrap_or(true)
     {

crates/vim/src/normal.rs ๐Ÿ”—

@@ -254,7 +254,7 @@ fn paste(_: &mut Workspace, _: &Paste, cx: &mut ViewContext<Workspace>) {
                                     }
                                     // Drop selection at the start of the next line
                                     let selection_point = Point::new(point.row + 1, 0);
-                                    new_selections.push(selection.map(|_| selection_point.clone()));
+                                    new_selections.push(selection.map(|_| selection_point));
                                     point
                                 } else {
                                     let mut point = selection.end;

crates/vim/src/normal/change.rs ๐Ÿ”—

@@ -28,7 +28,7 @@ pub fn change_over(vim: &mut Vim, motion: Motion, cx: &mut MutableAppContext) {
                 });
             });
             copy_selections_content(editor, motion.linewise(), cx);
-            editor.insert(&"", cx);
+            editor.insert("", cx);
         });
     });
     vim.switch_mode(Mode::Insert, false, cx)
@@ -67,7 +67,7 @@ fn change_word(
                     });
                 });
                 copy_selections_content(editor, false, cx);
-                editor.insert(&"", cx);
+                editor.insert("", cx);
             });
         });
         vim.switch_mode(Mode::Insert, false, cx);

crates/vim/src/normal/delete.rs ๐Ÿ”—

@@ -16,7 +16,7 @@ pub fn delete_over(vim: &mut Vim, motion: Motion, cx: &mut MutableAppContext) {
                 });
             });
             copy_selections_content(editor, motion.linewise(), cx);
-            editor.insert(&"", cx);
+            editor.insert("", cx);
 
             // Fixup cursor position after the deletion
             editor.set_clip_at_line_ends(true, cx);

crates/vim/src/state.rs ๐Ÿ”—

@@ -54,10 +54,7 @@ impl VimState {
     }
 
     pub fn clip_at_line_end(&self) -> bool {
-        match self.mode {
-            Mode::Insert | Mode::Visual { .. } => false,
-            _ => true,
-        }
+        !matches!(self.mode, Mode::Insert | Mode::Visual { .. })
     }
 
     pub fn empty_selections_only(&self) -> bool {
@@ -99,6 +96,6 @@ impl Operator {
 
         context
             .map
-            .insert("vim_operator".to_string(), operator_context.to_string());
+            .insert("vim_operator".to_string(), operator_context);
     }
 }

crates/vim/src/vim_test_context.rs ๐Ÿ”—

@@ -45,7 +45,7 @@ impl<'a> VimTestContext<'a> {
         workspace.update(cx, |workspace, cx| {
             workspace.active_pane().update(cx, |pane, cx| {
                 pane.toolbar().update(cx, |toolbar, cx| {
-                    let buffer_search_bar = cx.add_view(|cx| BufferSearchBar::new(cx));
+                    let buffer_search_bar = cx.add_view(BufferSearchBar::new);
                     toolbar.add_item(buffer_search_bar, cx);
                     let project_search_bar = cx.add_view(|_| ProjectSearchBar::new());
                     toolbar.add_item(project_search_bar, cx);

crates/vim/src/visual.rs ๐Ÿ”—

@@ -103,7 +103,7 @@ pub fn delete(_: &mut Workspace, _: &VisualDelete, cx: &mut ViewContext<Workspac
                 s.move_with(|map, selection| {
                     if line_mode {
                         original_columns
-                            .insert(selection.id, selection.head().to_point(&map).column);
+                            .insert(selection.id, selection.head().to_point(map).column);
                     } else if !selection.reversed {
                         // Head is at the end of the selection. Adjust the end position to
                         // to include the character under the cursor.
@@ -230,15 +230,15 @@ pub fn paste(_: &mut Workspace, _: &VisualPaste, cx: &mut ViewContext<Workspace>
 
                                 let new_position = if linewise {
                                     edits.push((range.start..range.start, "\n"));
-                                    let mut new_position = range.start.clone();
+                                    let mut new_position = range.start;
                                     new_position.column = 0;
                                     new_position.row += 1;
                                     new_position
                                 } else {
-                                    range.start.clone()
+                                    range.start
                                 };
 
-                                new_selections.push(selection.map(|_| new_position.clone()));
+                                new_selections.push(selection.map(|_| new_position));
 
                                 if linewise && to_insert.ends_with('\n') {
                                     edits.push((

crates/workspace/src/pane.rs ๐Ÿ”—

@@ -189,7 +189,7 @@ pub struct NavigationEntry {
 impl Pane {
     pub fn new(cx: &mut ViewContext<Self>) -> Self {
         let handle = cx.weak_handle();
-        let context_menu = cx.add_view(|cx| ContextMenu::new(cx));
+        let context_menu = cx.add_view(ContextMenu::new);
         Self {
             items: Vec::new(),
             is_active: true,
@@ -389,7 +389,7 @@ impl Pane {
         let existing_item = pane.update(cx, |pane, cx| {
             for (ix, item) in pane.items.iter().enumerate() {
                 if item.project_path(cx).is_some()
-                    && item.project_entry_ids(cx).as_slice() == &[project_entry_id]
+                    && item.project_entry_ids(cx).as_slice() == [project_entry_id]
                 {
                     let item = item.boxed_clone();
                     pane.activate_item(ix, true, focus_item, true, cx);
@@ -450,7 +450,7 @@ impl Pane {
         self.items.iter()
     }
 
-    pub fn items_of_type<'a, T: View>(&'a self) -> impl 'a + Iterator<Item = ViewHandle<T>> {
+    pub fn items_of_type<T: View>(&self) -> impl '_ + Iterator<Item = ViewHandle<T>> {
         self.items
             .iter()
             .filter_map(|item| item.to_any().downcast())
@@ -466,7 +466,7 @@ impl Pane {
         cx: &AppContext,
     ) -> Option<Box<dyn ItemHandle>> {
         self.items.iter().find_map(|item| {
-            if item.is_singleton(cx) && item.project_entry_ids(cx).as_slice() == &[entry_id] {
+            if item.is_singleton(cx) && item.project_entry_ids(cx).as_slice() == [entry_id] {
                 Some(item.boxed_clone())
             } else {
                 None
@@ -532,7 +532,7 @@ impl Pane {
         let mut index = self.active_item_index;
         if index > 0 {
             index -= 1;
-        } else if self.items.len() > 0 {
+        } else if !self.items.is_empty() {
             index = self.items.len() - 1;
         }
         self.activate_item(index, true, true, false, cx);
@@ -653,7 +653,7 @@ impl Pane {
                             {
                                 let other_project_entry_ids = item.project_entry_ids(cx);
                                 project_entry_ids
-                                    .retain(|id| !other_project_entry_ids.contains(&id));
+                                    .retain(|id| !other_project_entry_ids.contains(id));
                             }
                         }
                     });
@@ -662,12 +662,11 @@ impl Pane {
                         .any(|id| saved_project_entry_ids.insert(*id))
                 };
 
-                if should_save {
-                    if !Self::save_item(project.clone(), &pane, item_ix, &item, true, &mut cx)
+                if should_save
+                    && !Self::save_item(project.clone(), &pane, item_ix, &*item, true, &mut cx)
                         .await?
-                    {
-                        break;
-                    }
+                {
+                    break;
                 }
 
                 // Remove the item from the pane.
@@ -728,14 +727,13 @@ impl Pane {
         project: ModelHandle<Project>,
         pane: &ViewHandle<Pane>,
         item_ix: usize,
-        item: &Box<dyn ItemHandle>,
+        item: &dyn ItemHandle,
         should_prompt_for_save: bool,
         cx: &mut AsyncAppContext,
     ) -> Result<bool> {
-        const CONFLICT_MESSAGE: &'static str =
+        const CONFLICT_MESSAGE: &str =
             "This file has changed on disk since you started editing it. Do you want to overwrite it?";
-        const DIRTY_MESSAGE: &'static str =
-            "This file contains unsaved edits. Do you want to save it?";
+        const DIRTY_MESSAGE: &str = "This file contains unsaved edits. Do you want to save it?";
 
         let (has_conflict, is_dirty, can_save, is_singleton) = cx.read(|cx| {
             (
@@ -765,7 +763,7 @@ impl Pane {
                 matches!(
                     cx.global::<Settings>().autosave,
                     Autosave::OnFocusChange | Autosave::OnWindowChange
-                ) && Self::can_autosave_item(item.as_ref(), cx)
+                ) && Self::can_autosave_item(&*item, cx)
             });
             let should_save = if should_prompt_for_save && !will_autosave {
                 let mut answer = pane.update(cx, |pane, cx| {
@@ -794,7 +792,7 @@ impl Pane {
                             let worktree = project.visible_worktrees(cx).next()?;
                             Some(worktree.read(cx).as_local()?.abs_path().to_path_buf())
                         })
-                        .unwrap_or(Path::new("").into());
+                        .unwrap_or_else(|| Path::new("").into());
 
                     let mut abs_path = cx.update(|cx| cx.prompt_for_new_path(&start_abs_path));
                     if let Some(abs_path) = abs_path.next().await.flatten() {

crates/workspace/src/sidebar.rs ๐Ÿ”—

@@ -38,7 +38,7 @@ where
     }
 
     fn is_focused(&self, cx: &AppContext) -> bool {
-        ViewHandle::is_focused(&self, cx) || self.read(cx).contains_focused_view(cx)
+        ViewHandle::is_focused(self, cx) || self.read(cx).contains_focused_view(cx)
     }
 
     fn to_any(&self) -> AnyViewHandle {
@@ -46,9 +46,9 @@ where
     }
 }
 
-impl Into<AnyViewHandle> for &dyn SidebarItemHandle {
-    fn into(self) -> AnyViewHandle {
-        self.to_any()
+impl From<&dyn SidebarItemHandle> for AnyViewHandle {
+    fn from(val: &dyn SidebarItemHandle) -> Self {
+        val.to_any()
     }
 }
 
@@ -284,11 +284,14 @@ impl View for SidebarButtons {
             Side::Left => theme.group_left,
             Side::Right => theme.group_right,
         };
+
+        #[allow(clippy::needless_collect)]
         let items = sidebar
             .items
             .iter()
             .map(|item| (item.icon_path, item.tooltip.clone(), item.view.clone()))
             .collect::<Vec<_>>();
+
         Flex::row()
             .with_children(items.into_iter().enumerate().map(
                 |(ix, (icon_path, tooltip, item_view))| {

crates/workspace/src/status_bar.rs ๐Ÿ”—

@@ -126,8 +126,8 @@ impl<T: StatusItemView> StatusItemViewHandle for ViewHandle<T> {
     }
 }
 
-impl Into<AnyViewHandle> for &dyn StatusItemViewHandle {
-    fn into(self) -> AnyViewHandle {
-        self.to_any()
+impl From<&dyn StatusItemViewHandle> for AnyViewHandle {
+    fn from(val: &dyn StatusItemViewHandle) -> Self {
+        val.to_any()
     }
 }

crates/workspace/src/toolbar.rs ๐Ÿ”—

@@ -133,12 +133,10 @@ impl View for Toolbar {
                     .with_child(nav_button(
                         "icons/arrow_right_16.svg",
                         button_style,
-                        tooltip_style.clone(),
+                        tooltip_style,
                         enable_go_forward,
                         spacing,
-                        super::GoForward {
-                            pane: Some(pane.clone()),
-                        },
+                        super::GoForward { pane: Some(pane) },
                         super::GoForward { pane: None },
                         "Go Forward",
                         cx,
@@ -156,6 +154,7 @@ impl View for Toolbar {
     }
 }
 
+#[allow(clippy::too_many_arguments)]
 fn nav_button<A: Action + Clone>(
     svg_path: &'static str,
     style: theme::Interactive<theme::IconButton>,
@@ -280,8 +279,8 @@ impl<T: ToolbarItemView> ToolbarItemViewHandle for ViewHandle<T> {
     }
 }
 
-impl Into<AnyViewHandle> for &dyn ToolbarItemViewHandle {
-    fn into(self) -> AnyViewHandle {
-        self.to_any()
+impl From<&dyn ToolbarItemViewHandle> for AnyViewHandle {
+    fn from(val: &dyn ToolbarItemViewHandle) -> Self {
+        val.to_any()
     }
 }

crates/workspace/src/waiting_room.rs ๐Ÿ”—

@@ -116,7 +116,7 @@ impl WaitingRoom {
                                         workspace
                                     });
                                 }
-                                Err(error @ _) => {
+                                Err(error) => {
                                     let login = &contact.user.github_login;
                                     let message = match error {
                                         project::JoinProjectError::HostDeclined => {

crates/workspace/src/workspace.rs ๐Ÿ”—

@@ -588,7 +588,9 @@ impl<T: Item> ItemHandle for ViewHandle<T> {
 
             if T::is_edit_event(event) {
                 if let Autosave::AfterDelay { milliseconds } = cx.global::<Settings>().autosave {
-                    let prev_autosave = pending_autosave.take().unwrap_or(Task::ready(Some(())));
+                    let prev_autosave = pending_autosave
+                        .take()
+                        .unwrap_or_else(|| Task::ready(Some(())));
                     let (cancel_tx, mut cancel_rx) = oneshot::channel::<()>();
                     let prev_cancel_tx = mem::replace(&mut cancel_pending_autosave, cancel_tx);
                     let project = workspace.project.downgrade();
@@ -695,15 +697,15 @@ impl<T: Item> ItemHandle for ViewHandle<T> {
     }
 }
 
-impl Into<AnyViewHandle> for Box<dyn ItemHandle> {
-    fn into(self) -> AnyViewHandle {
-        self.to_any()
+impl From<Box<dyn ItemHandle>> for AnyViewHandle {
+    fn from(val: Box<dyn ItemHandle>) -> Self {
+        val.to_any()
     }
 }
 
-impl Into<AnyViewHandle> for &Box<dyn ItemHandle> {
-    fn into(self) -> AnyViewHandle {
-        self.to_any()
+impl From<&Box<dyn ItemHandle>> for AnyViewHandle {
+    fn from(val: &Box<dyn ItemHandle>) -> Self {
+        val.to_any()
     }
 }
 
@@ -742,9 +744,9 @@ impl<T: Notification> NotificationHandle for ViewHandle<T> {
     }
 }
 
-impl Into<AnyViewHandle> for &dyn NotificationHandle {
-    fn into(self) -> AnyViewHandle {
-        self.to_any()
+impl From<&dyn NotificationHandle> for AnyViewHandle {
+    fn from(val: &dyn NotificationHandle) -> Self {
+        val.to_any()
     }
 }
 
@@ -769,7 +771,7 @@ impl AppState {
             user_store,
             project_store,
             initialize_workspace: |_, _, _| {},
-            build_window_options: || Default::default(),
+            build_window_options: Default::default,
         })
     }
 }
@@ -848,7 +850,7 @@ impl Workspace {
         })
         .detach();
 
-        let pane = cx.add_view(|cx| Pane::new(cx));
+        let pane = cx.add_view(Pane::new);
         let pane_id = pane.id();
         cx.subscribe(&pane, move |this, _, event, cx| {
             this.handle_pane_event(pane_id, event, cx)
@@ -860,8 +862,8 @@ impl Workspace {
         let fs = project.read(cx).fs().clone();
         let user_store = project.read(cx).user_store();
         let client = project.read(cx).client();
-        let mut current_user = user_store.read(cx).watch_current_user().clone();
-        let mut connection_status = client.status().clone();
+        let mut current_user = user_store.read(cx).watch_current_user();
+        let mut connection_status = client.status();
         let _observe_current_user = cx.spawn_weak(|this, mut cx| async move {
             current_user.recv().await;
             connection_status.recv().await;
@@ -1073,7 +1075,7 @@ impl Workspace {
                             project.clone(),
                             &pane,
                             ix,
-                            &item,
+                            &*item,
                             should_prompt_to_save,
                             &mut cx,
                         )
@@ -1088,6 +1090,7 @@ impl Workspace {
         })
     }
 
+    #[allow(clippy::type_complexity)]
     pub fn open_paths(
         &mut self,
         mut abs_paths: Vec<PathBuf>,
@@ -1150,10 +1153,8 @@ impl Workspace {
                 let results = this
                     .update(&mut cx, |this, cx| this.open_paths(paths, true, cx))
                     .await;
-                for result in results {
-                    if let Some(result) = result {
-                        result.log_err();
-                    }
+                for result in results.into_iter().flatten() {
+                    result.log_err();
                 }
             }
         })
@@ -1316,7 +1317,7 @@ impl Workspace {
         if let Some(item) = self.active_item(cx) {
             if !force_name_change && item.can_save(cx) {
                 if item.has_conflict(cx.as_ref()) {
-                    const CONFLICT_MESSAGE: &'static str = "This file has changed on disk since you started editing it. Do you want to overwrite it?";
+                    const CONFLICT_MESSAGE: &str = "This file has changed on disk since you started editing it. Do you want to overwrite it?";
 
                     let mut answer = cx.prompt(
                         PromptLevel::Warning,
@@ -1424,7 +1425,7 @@ impl Workspace {
     }
 
     fn add_pane(&mut self, cx: &mut ViewContext<Self>) -> ViewHandle<Pane> {
-        let pane = cx.add_view(|cx| Pane::new(cx));
+        let pane = cx.add_view(Pane::new);
         let pane_id = pane.id();
         cx.subscribe(&pane, move |this, _, event, cx| {
             this.handle_pane_event(pane_id, event, cx)
@@ -1519,11 +1520,9 @@ impl Workspace {
 
     pub fn activate_item(&mut self, item: &dyn ItemHandle, cx: &mut ViewContext<Self>) -> bool {
         let result = self.panes.iter().find_map(|pane| {
-            if let Some(ix) = pane.read(cx).index_for_item(item) {
-                Some((pane.clone(), ix))
-            } else {
-                None
-            }
+            pane.read(cx)
+                .index_for_item(item)
+                .map(|ix| (pane.clone(), ix))
         });
         if let Some((pane, ix)) = result {
             pane.update(cx, |pane, cx| pane.activate_item(ix, true, true, false, cx));
@@ -1749,7 +1748,7 @@ impl Workspace {
         let collaborators = self.project.read(cx).collaborators();
         let next_leader_id = if let Some(leader_id) = self.leader_for_pane(&self.active_pane) {
             let mut collaborators = collaborators.keys().copied();
-            while let Some(peer_id) = collaborators.next() {
+            for peer_id in collaborators.by_ref() {
                 if peer_id == leader_id {
                     break;
                 }
@@ -1779,7 +1778,7 @@ impl Workspace {
     ) -> Option<PeerId> {
         for (leader_id, states_by_pane) in &mut self.follower_states_by_leader {
             let leader_id = *leader_id;
-            if let Some(state) = states_by_pane.remove(&pane) {
+            if let Some(state) = states_by_pane.remove(pane) {
                 for (_, item) in state.items_by_leader_view_id {
                     if let FollowerItem::Loaded(item) = item {
                         item.set_leader_replica_id(None, cx);
@@ -2253,7 +2252,6 @@ impl Workspace {
                 .values()
                 .map(|b| b.0)
                 .collect::<Vec<_>>()
-                .clone()
         });
 
         let mut item_tasks_by_pane = HashMap::default();
@@ -2367,13 +2365,11 @@ impl Workspace {
     fn leader_updated(&mut self, leader_id: PeerId, cx: &mut ViewContext<Self>) -> Option<()> {
         let mut items_to_add = Vec::new();
         for (pane, state) in self.follower_states_by_leader.get(&leader_id)? {
-            if let Some(active_item) = state
+            if let Some(FollowerItem::Loaded(item)) = state
                 .active_view_id
                 .and_then(|id| state.items_by_leader_view_id.get(&id))
             {
-                if let FollowerItem::Loaded(item) = active_item {
-                    items_to_add.push((pane.clone(), item.boxed_clone()));
-                }
+                items_to_add.push((pane.clone(), item.boxed_clone()));
             }
         }
 
@@ -2626,6 +2622,7 @@ pub fn activate_workspace_for_project(
     None
 }
 
+#[allow(clippy::type_complexity)]
 pub fn open_paths(
     abs_paths: &[PathBuf],
     app_state: &Arc<AppState>,
@@ -2914,7 +2911,7 @@ mod tests {
         let item1 = cx.add_view(&workspace, |_| TestItem::new());
         workspace.update(cx, |w, cx| w.add_item(Box::new(item1.clone()), cx));
         let task = workspace.update(cx, |w, cx| w.prepare_to_close(cx));
-        assert_eq!(task.await.unwrap(), true);
+        assert!(task.await.unwrap());
 
         // When there are dirty untitled items, prompt to save each one. If the user
         // cancels any prompt, then abort.
@@ -2938,7 +2935,7 @@ mod tests {
         cx.simulate_prompt_answer(window_id, 2 /* cancel */);
         cx.foreground().run_until_parked();
         assert!(!cx.has_pending_prompt(window_id));
-        assert_eq!(task.await.unwrap(), false);
+        assert!(!task.await.unwrap());
     }
 
     #[gpui::test]
@@ -3396,7 +3393,7 @@ mod tests {
     impl Item for TestItem {
         fn tab_description<'a>(&'a self, detail: usize, _: &'a AppContext) -> Option<Cow<'a, str>> {
             self.tab_descriptions.as_ref().and_then(|descriptions| {
-                let description = *descriptions.get(detail).or(descriptions.last())?;
+                let description = *descriptions.get(detail).or_else(|| descriptions.last())?;
                 Some(description.into())
             })
         }
@@ -3452,7 +3449,7 @@ mod tests {
         }
 
         fn can_save(&self, _: &AppContext) -> bool {
-            self.project_entry_ids.len() > 0
+            !self.project_entry_ids.is_empty()
         }
 
         fn save(

crates/zed/src/feedback.rs ๐Ÿ”—

@@ -7,8 +7,7 @@ use gpui::{
 use settings::Settings;
 use workspace::StatusItemView;
 
-pub const NEW_ISSUE_URL: &'static str =
-    "https://github.com/zed-industries/feedback/issues/new/choose";
+pub const NEW_ISSUE_URL: &str = "https://github.com/zed-industries/feedback/issues/new/choose";
 
 pub struct FeedbackLink;
 

crates/zed/src/languages/c.rs ๐Ÿ”—

@@ -116,7 +116,7 @@ impl super::LspAdapter for CLspAdapter {
     ) -> Option<CodeLabel> {
         let label = completion
             .label
-            .strip_prefix("โ€ข")
+            .strip_prefix('โ€ข')
             .unwrap_or(&completion.label)
             .trim();
 

crates/zed/src/languages/go.rs ๐Ÿ”—

@@ -72,7 +72,7 @@ impl super::LspAdapter for GoLspAdapter {
                 }
             }
         } else if let Some(path) = this.cached_server_binary(container_dir.clone()).await {
-            return Ok(path.to_path_buf());
+            return Ok(path);
         }
 
         let gobin_dir = container_dir.join("gobin");
@@ -122,7 +122,7 @@ impl super::LspAdapter for GoLspAdapter {
             }
 
             if let Some(path) = last_binary_path {
-                Ok(path.to_path_buf())
+                Ok(path)
             } else {
                 Err(anyhow!("no cached binary"))
             }
@@ -141,7 +141,7 @@ impl super::LspAdapter for GoLspAdapter {
         // Gopls returns nested fields and methods as completions.
         // To syntax highlight these, combine their final component
         // with their detail.
-        let name_offset = label.rfind(".").unwrap_or(0);
+        let name_offset = label.rfind('.').unwrap_or(0);
 
         match completion.kind.zip(completion.detail.as_ref()) {
             Some((lsp::CompletionItemKind::MODULE, detail)) => {

crates/zed/src/languages/python.rs ๐Ÿ”—

@@ -206,7 +206,7 @@ mod tests {
             );
 
             // dedent the closing paren if it is shifted to the beginning of the line
-            let argument_ix = buffer.text().find("1").unwrap();
+            let argument_ix = buffer.text().find('1').unwrap();
             buffer.edit(
                 [(argument_ix..argument_ix + 1, "")],
                 Some(AutoindentMode::EachLine),

crates/zed/src/languages/typescript.rs ๐Ÿ”—

@@ -65,7 +65,7 @@ impl LspAdapter for TypeScriptLspAdapter {
                     ("typescript", versions.typescript_version.as_str()),
                     (
                         "typescript-language-server",
-                        &versions.server_version.as_str(),
+                        versions.server_version.as_str(),
                     ),
                 ],
                 &version_dir,

crates/zed/src/main.rs ๐Ÿ”—

@@ -29,7 +29,7 @@ use serde_json::json;
 use settings::{self, KeymapFileContent, Settings, SettingsFileContent};
 use smol::process::Command;
 use std::{env, ffi::OsStr, fs, panic, path::PathBuf, sync::Arc, thread, time::Duration};
-use terminal;
+
 use theme::ThemeRegistry;
 use util::{ResultExt, TryFutureExt};
 use workspace::{self, AppState, NewFile, OpenPaths};
@@ -54,7 +54,7 @@ fn main() {
     let db = app.background().spawn(async move {
         project::Db::open(&*zed::paths::DB)
             .log_err()
-            .unwrap_or(project::Db::null())
+            .unwrap_or_else(project::Db::null)
     });
 
     load_embedded_fonts(&app);
@@ -182,10 +182,8 @@ fn main() {
                 if client::IMPERSONATE_LOGIN.is_some() {
                     client.authenticate_and_connect(false, &cx).await?;
                 }
-            } else {
-                if client.has_keychain_credentials(&cx) {
-                    client.authenticate_and_connect(true, &cx).await?;
-                }
+            } else if client.has_keychain_credentials(&cx) {
+                client.authenticate_and_connect(true, &cx).await?;
             }
             Ok::<_, anyhow::Error>(())
         })
@@ -222,7 +220,9 @@ fn init_logger() {
         let level = LevelFilter::Info;
 
         // Prevent log file from becoming too large.
-        const MAX_LOG_BYTES: u64 = 1 * 1024 * 1024;
+        const KIB: u64 = 1024;
+        const MIB: u64 = 1024 * KIB;
+        const MAX_LOG_BYTES: u64 = MIB;
         if fs::metadata(&*zed::paths::LOG).map_or(false, |metadata| metadata.len() > MAX_LOG_BYTES)
         {
             let _ = fs::rename(&*zed::paths::LOG, &*zed::paths::OLD_LOG);
@@ -406,7 +406,7 @@ fn load_embedded_fonts(app: &App) {
         for font_path in &font_paths {
             scope.spawn(async {
                 let font_path = &*font_path;
-                let font_bytes = Assets.load(&font_path).unwrap().to_vec();
+                let font_bytes = Assets.load(font_path).unwrap().to_vec();
                 embedded_fonts.lock().push(Arc::from(font_bytes));
             });
         }
@@ -426,7 +426,7 @@ async fn watch_themes(
     let mut events = fs
         .watch("styles/src".as_ref(), Duration::from_millis(100))
         .await;
-    while let Some(_) = events.next().await {
+    while (events.next().await).is_some() {
         let output = Command::new("npm")
             .current_dir("styles")
             .args(["run", "build-themes"])

crates/zed/src/settings_file.rs ๐Ÿ”—

@@ -42,11 +42,11 @@ where
     ///Loads the given watched JSON file. In the special case that the file is
     ///empty (ignoring whitespace) or is not a file, this will return T::default()
     async fn load(fs: Arc<dyn Fs>, path: &Path) -> Option<T> {
-        if !fs.is_file(&path).await {
+        if !fs.is_file(path).await {
             return Some(T::default());
         }
 
-        fs.load(&path).await.log_err().and_then(|data| {
+        fs.load(path).await.log_err().and_then(|data| {
             if data.trim().is_empty() {
                 Some(T::default())
             } else {
@@ -74,7 +74,7 @@ pub fn watch_settings_file(
 pub fn keymap_updated(content: KeymapFileContent, cx: &mut MutableAppContext) {
     cx.clear_bindings();
     settings::KeymapFileContent::load_defaults(cx);
-    content.add(cx).log_err();
+    content.add_to_cx(cx).log_err();
 }
 
 pub fn settings_updated(
@@ -84,7 +84,7 @@ pub fn settings_updated(
     cx: &mut MutableAppContext,
 ) {
     let mut settings = defaults.clone();
-    settings.set_user_settings(content, theme_registry, &cx.font_cache());
+    settings.set_user_settings(content, theme_registry, cx.font_cache());
     cx.set_global(settings);
     cx.refresh_windows();
 }

crates/zed/src/zed.rs ๐Ÿ”—

@@ -143,7 +143,7 @@ pub fn init(app_state: &Arc<AppState>, cx: &mut gpui::MutableAppContext) {
     cx.add_action({
         let app_state = app_state.clone();
         move |_: &mut Workspace, _: &OpenKeymap, cx: &mut ViewContext<Workspace>| {
-            open_config_file(&paths::KEYMAP, app_state.clone(), cx, || Default::default());
+            open_config_file(&paths::KEYMAP, app_state.clone(), cx, Default::default);
         }
     });
     cx.add_action({
@@ -222,7 +222,7 @@ pub fn initialize_workspace(
                     pane.toolbar().update(cx, |toolbar, cx| {
                         let breadcrumbs = cx.add_view(|_| Breadcrumbs::new(project.clone()));
                         toolbar.add_item(breadcrumbs, cx);
-                        let buffer_search_bar = cx.add_view(|cx| BufferSearchBar::new(cx));
+                        let buffer_search_bar = cx.add_view(BufferSearchBar::new);
                         toolbar.add_item(buffer_search_bar, cx);
                         let project_search_bar = cx.add_view(|_| ProjectSearchBar::new());
                         toolbar.add_item(project_search_bar, cx);
@@ -273,7 +273,7 @@ pub fn initialize_workspace(
         sidebar.add_item(
             "icons/folder_tree_16.svg",
             "Project Panel".to_string(),
-            project_panel.into(),
+            project_panel,
             cx,
         )
     });
@@ -281,7 +281,7 @@ pub fn initialize_workspace(
         sidebar.add_item(
             "icons/user_group_16.svg",
             "Contacts Panel".to_string(),
-            contact_panel.into(),
+            contact_panel,
             cx,
         )
     });
@@ -487,7 +487,7 @@ fn open_bundled_config_file(
     title: &str,
     cx: &mut ViewContext<Workspace>,
 ) {
-    workspace.with_local_workspace(cx, app_state.clone(), |workspace, cx| {
+    workspace.with_local_workspace(cx, app_state, |workspace, cx| {
         let project = workspace.project().clone();
         let buffer = project.update(cx, |project, cx| {
             let text = Assets::get(asset_path).unwrap().data;
@@ -1005,7 +1005,7 @@ mod tests {
             .insert_file("/root/a.txt", "changed".to_string())
             .await;
         editor
-            .condition(&cx, |editor, cx| editor.has_conflict(cx))
+            .condition(cx, |editor, cx| editor.has_conflict(cx))
             .await;
         cx.read(|cx| assert!(editor.is_dirty(cx)));
 
@@ -1072,7 +1072,7 @@ mod tests {
         // Edit the file and save it again. This time, there is no filename prompt.
         editor.update(cx, |editor, cx| {
             editor.handle_input(" there", cx);
-            assert_eq!(editor.is_dirty(cx.as_ref()), true);
+            assert!(editor.is_dirty(cx.as_ref()));
         });
         let save_task = workspace.update(cx, |workspace, cx| workspace.save_active_item(false, cx));
         save_task.await.unwrap();
@@ -1570,30 +1570,20 @@ mod tests {
 
         // Reopen all the closed items, ensuring they are reopened in the same order
         // in which they were closed.
-        workspace
-            .update(cx, |workspace, cx| Pane::reopen_closed_item(workspace, cx))
-            .await;
+        workspace.update(cx, Pane::reopen_closed_item).await;
         assert_eq!(active_path(&workspace, cx), Some(file3.clone()));
 
-        workspace
-            .update(cx, |workspace, cx| Pane::reopen_closed_item(workspace, cx))
-            .await;
+        workspace.update(cx, Pane::reopen_closed_item).await;
         assert_eq!(active_path(&workspace, cx), Some(file2.clone()));
 
-        workspace
-            .update(cx, |workspace, cx| Pane::reopen_closed_item(workspace, cx))
-            .await;
+        workspace.update(cx, Pane::reopen_closed_item).await;
         assert_eq!(active_path(&workspace, cx), Some(file4.clone()));
 
-        workspace
-            .update(cx, |workspace, cx| Pane::reopen_closed_item(workspace, cx))
-            .await;
+        workspace.update(cx, Pane::reopen_closed_item).await;
         assert_eq!(active_path(&workspace, cx), Some(file1.clone()));
 
         // Reopening past the last closed item is a no-op.
-        workspace
-            .update(cx, |workspace, cx| Pane::reopen_closed_item(workspace, cx))
-            .await;
+        workspace.update(cx, Pane::reopen_closed_item).await;
         assert_eq!(active_path(&workspace, cx), Some(file1.clone()));
 
         // Reopening closed items doesn't interfere with navigation history.

plugins/json_language/src/lib.rs ๐Ÿ”—

@@ -1,13 +1,12 @@
+use std::{fs, path::PathBuf};
+
 use plugin::prelude::*;
 use serde::Deserialize;
-use std::fs;
-use std::path::PathBuf;
 
 #[import]
 fn command(string: &str) -> Option<Vec<u8>>;
 
-const BIN_PATH: &'static str =
-    "node_modules/vscode-json-languageserver/bin/vscode-json-languageserver";
+const BIN_PATH: &str = "node_modules/vscode-json-languageserver/bin/vscode-json-languageserver";
 
 #[export]
 pub fn name() -> &'static str {
@@ -51,13 +50,11 @@ pub fn fetch_server_binary(container_dir: PathBuf, version: String) -> Result<Pa
             return Err("failed to install vscode-json-languageserver".to_string());
         }
 
-        if let Some(mut entries) = fs::read_dir(&container_dir).ok() {
-            while let Some(entry) = entries.next() {
-                if let Some(entry) = entry.ok() {
-                    let entry_path = entry.path();
-                    if entry_path.as_path() != version_dir {
-                        fs::remove_dir_all(&entry_path).ok();
-                    }
+        if let Ok(entries) = fs::read_dir(&container_dir) {
+            for entry in entries.flatten() {
+                let entry_path = entry.path();
+                if entry_path.as_path() != version_dir {
+                    fs::remove_dir_all(&entry_path).ok();
                 }
             }
         }
@@ -69,9 +66,9 @@ pub fn fetch_server_binary(container_dir: PathBuf, version: String) -> Result<Pa
 #[export]
 pub fn cached_server_binary(container_dir: PathBuf) -> Option<PathBuf> {
     let mut last_version_dir = None;
-    let mut entries = fs::read_dir(&container_dir).ok()?;
+    let entries = fs::read_dir(&container_dir).ok()?;
 
-    while let Some(entry) = entries.next() {
+    for entry in entries {
         let entry = entry.ok()?;
         if entry.file_type().ok()?.is_dir() {
             last_version_dir = Some(entry.path());

styles/package-lock.json ๐Ÿ”—

@@ -5,7 +5,6 @@
   "requires": true,
   "packages": {
     "": {
-      "name": "styles",
       "version": "1.0.0",
       "license": "ISC",
       "dependencies": {