From 3ec69a5bc0ed23dfa9f95538d3fb2f1ae91f41fd Mon Sep 17 00:00:00 2001 From: Michael Sloan Date: Wed, 19 Mar 2025 14:15:33 -0600 Subject: [PATCH] Make getting keybinding for display more efficient (#27046) No longer iterates all the matching bindings, and no longer clones the result. Release Notes: - N/A --- crates/gpui/src/keymap.rs | 12 +++++++++--- crates/gpui/src/platform/mac/platform.rs | 2 +- crates/ui/src/components/keybinding.rs | 8 +++----- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/crates/gpui/src/keymap.rs b/crates/gpui/src/keymap.rs index 27ca70e32827fdb2da7600bf057f430dc4e19821..49bdb54cfb65277708968d83f1784b95ecdc1fd5 100644 --- a/crates/gpui/src/keymap.rs +++ b/crates/gpui/src/keymap.rs @@ -202,10 +202,16 @@ impl Keymap { /// couple times. The decision as of now is to pick a side and leave it /// as is, until we have a better way to decide which binding to display /// that is consistent and not confusing. - pub fn binding_to_display_from_bindings<'a>( - bindings: impl IntoIterator, + pub fn binding_to_display_from_bindings(mut bindings: Vec) -> Option { + bindings.pop() + } + + /// Like `bindings_to_display_from_bindings` but takes a `DoubleEndedIterator` and returns a + /// reference. + pub fn binding_to_display_from_bindings_iterator<'a>( + mut bindings: impl DoubleEndedIterator, ) -> Option<&'a KeyBinding> { - return bindings.into_iter().last(); + bindings.next_back() } } diff --git a/crates/gpui/src/platform/mac/platform.rs b/crates/gpui/src/platform/mac/platform.rs index edc8fdfea294b16598e5b8be88407c824633709f..4fe8383651c513e18ccba1b8c055953c2bf4907a 100644 --- a/crates/gpui/src/platform/mac/platform.rs +++ b/crates/gpui/src/platform/mac/platform.rs @@ -290,7 +290,7 @@ impl MacPlatform { action, os_action, } => { - let keystrokes = crate::Keymap::binding_to_display_from_bindings( + let keystrokes = crate::Keymap::binding_to_display_from_bindings_iterator( keymap.bindings_for_action(action.as_ref()), ) .map(|binding| binding.keystrokes()); diff --git a/crates/ui/src/components/keybinding.rs b/crates/ui/src/components/keybinding.rs index 5d1fda8e11ef4a17e09c33478f62b0a3e2665260..63b63da45ff96dce8603cd4d9d48b044a698ea12 100644 --- a/crates/ui/src/components/keybinding.rs +++ b/crates/ui/src/components/keybinding.rs @@ -33,8 +33,7 @@ impl KeyBinding { return Self::for_action_in(action, &focused, window, cx); } let key_binding = - gpui::Keymap::binding_to_display_from_bindings(&window.bindings_for_action(action)) - .cloned()?; + gpui::Keymap::binding_to_display_from_bindings(window.bindings_for_action(action))?; Some(Self::new(key_binding, cx)) } @@ -46,9 +45,8 @@ impl KeyBinding { cx: &App, ) -> Option { let key_binding = gpui::Keymap::binding_to_display_from_bindings( - &window.bindings_for_action_in(action, focus), - ) - .cloned()?; + window.bindings_for_action_in(action, focus), + )?; Some(Self::new(key_binding, cx)) }