Skip to content

Commit 3f168e8

Browse files
agu-zdanilo-leal
andauthored
edit predictions: Invalidate cached settings and unset provider when set to none (#25505)
Fixes a few state mismatches when changing providers and other settings Release Notes: - edit predictions: Fix mismatch between status bar settings and editor control settings - edit predictions: Turn off as soon as `edit_prediction_provider` is set to `none` --------- Co-authored-by: Danilo <[email protected]> Co-authored-by: Danilo Leal <[email protected]>
1 parent 20440f8 commit 3f168e8

File tree

4 files changed

+71
-73
lines changed

4 files changed

+71
-73
lines changed

crates/editor/src/editor.rs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1824,6 +1824,7 @@ impl Editor {
18241824
}),
18251825
provider: Arc::new(provider),
18261826
});
1827+
self.update_edit_prediction_settings(cx);
18271828
self.refresh_inline_completion(false, false, window, cx);
18281829
}
18291830

@@ -1943,7 +1944,7 @@ impl Editor {
19431944
self.auto_replace_emoji_shortcode = auto_replace;
19441945
}
19451946

1946-
pub fn toggle_inline_completions(
1947+
pub fn toggle_edit_predictions(
19471948
&mut self,
19481949
_: &ToggleEditPrediction,
19491950
window: &mut Window,
@@ -1964,6 +1965,7 @@ impl Editor {
19641965
cx: &mut Context<Self>,
19651966
) {
19661967
self.show_inline_completions_override = show_edit_predictions;
1968+
self.update_edit_prediction_settings(cx);
19671969

19681970
if let Some(false) = show_edit_predictions {
19691971
self.discard_inline_completion(false, cx);
@@ -4822,7 +4824,7 @@ impl Editor {
48224824
let (buffer, cursor_buffer_position) =
48234825
self.buffer.read(cx).text_anchor_for_position(cursor, cx)?;
48244826

4825-
if !self.inline_completions_enabled_in_buffer(&buffer, cursor_buffer_position, cx) {
4827+
if !self.edit_predictions_enabled_in_buffer(&buffer, cursor_buffer_position, cx) {
48264828
self.discard_inline_completion(false, cx);
48274829
return None;
48284830
}
@@ -4871,6 +4873,22 @@ impl Editor {
48714873
}
48724874
}
48734875

4876+
pub fn update_edit_prediction_settings(&mut self, cx: &mut Context<Self>) {
4877+
if self.edit_prediction_provider.is_none() {
4878+
self.edit_prediction_settings = EditPredictionSettings::Disabled;
4879+
} else {
4880+
let selection = self.selections.newest_anchor();
4881+
let cursor = selection.head();
4882+
4883+
if let Some((buffer, cursor_buffer_position)) =
4884+
self.buffer.read(cx).text_anchor_for_position(cursor, cx)
4885+
{
4886+
self.edit_prediction_settings =
4887+
self.edit_prediction_settings_at_position(&buffer, cursor_buffer_position, cx);
4888+
}
4889+
}
4890+
}
4891+
48744892
fn edit_prediction_settings_at_position(
48754893
&self,
48764894
buffer: &Entity<Buffer>,
@@ -4925,18 +4943,18 @@ impl Editor {
49254943
)
49264944
}
49274945

4928-
pub fn inline_completions_enabled(&self, cx: &App) -> bool {
4946+
pub fn edit_predictions_enabled_at_cursor(&self, cx: &App) -> bool {
49294947
let cursor = self.selections.newest_anchor().head();
49304948
if let Some((buffer, cursor_position)) =
49314949
self.buffer.read(cx).text_anchor_for_position(cursor, cx)
49324950
{
4933-
self.inline_completions_enabled_in_buffer(&buffer, cursor_position, cx)
4951+
self.edit_predictions_enabled_in_buffer(&buffer, cursor_position, cx)
49344952
} else {
49354953
false
49364954
}
49374955
}
49384956

4939-
fn inline_completions_enabled_in_buffer(
4957+
fn edit_predictions_enabled_in_buffer(
49404958
&self,
49414959
buffer: &Entity<Buffer>,
49424960
buffer_position: language::Anchor,
@@ -15154,6 +15172,7 @@ impl Editor {
1515415172

1515515173
fn settings_changed(&mut self, window: &mut Window, cx: &mut Context<Self>) {
1515615174
self.tasks_update_task = Some(self.refresh_runnables(window, cx));
15175+
self.update_edit_prediction_settings(cx);
1515715176
self.refresh_inline_completion(true, false, window, cx);
1515815177
self.refresh_inlay_hints(
1515915178
InlayHintRefreshReason::SettingsChange(inlay_hint_settings(

crates/editor/src/element.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ impl EditorElement {
406406
register_action(editor, window, Editor::toggle_relative_line_numbers);
407407
register_action(editor, window, Editor::toggle_indent_guides);
408408
register_action(editor, window, Editor::toggle_inlay_hints);
409-
register_action(editor, window, Editor::toggle_inline_completions);
409+
register_action(editor, window, Editor::toggle_edit_predictions);
410410
register_action(editor, window, Editor::toggle_inline_diagnostics);
411411
register_action(editor, window, hover_popover::hover);
412412
register_action(editor, window, Editor::reveal_in_finder);

crates/zed/src/zed/inline_completion_registry.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use settings::SettingsStore;
99
use std::{cell::RefCell, rc::Rc, sync::Arc};
1010
use supermaven::{Supermaven, SupermavenCompletionProvider};
1111
use ui::Window;
12-
use zeta::ProviderDataCollection;
12+
use zeta::{ProviderDataCollection, ZetaInlineCompletionProvider};
1313

1414
pub fn init(client: Arc<Client>, user_store: Entity<UserStore>, cx: &mut App) {
1515
let editors: Rc<RefCell<HashMap<WeakEntity<Editor>, AnyWindowHandle>>> = Rc::default();
@@ -225,7 +225,9 @@ fn assign_edit_prediction_provider(
225225
let singleton_buffer = editor.buffer().read(cx).as_singleton();
226226

227227
match provider {
228-
EditPredictionProvider::None => {}
228+
EditPredictionProvider::None => {
229+
editor.set_edit_prediction_provider::<ZetaInlineCompletionProvider>(None, window, cx);
230+
}
229231
EditPredictionProvider::Copilot => {
230232
if let Some(copilot) = Copilot::global(cx) {
231233
if let Some(buffer) = singleton_buffer {

crates/zed/src/zed/quick_action_bar.rs

Lines changed: 42 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -87,46 +87,21 @@ impl Render for QuickActionBar {
8787
return div().id("empty quick action bar");
8888
};
8989

90-
let (
91-
selection_menu_enabled,
92-
inlay_hints_enabled,
93-
supports_inlay_hints,
94-
inline_diagnostics_enabled,
95-
supports_inline_diagnostics,
96-
git_blame_inline_enabled,
97-
show_git_blame_gutter,
98-
auto_signature_help_enabled,
99-
show_inline_completions,
100-
inline_completion_enabled,
101-
) = {
102-
let supports_inlay_hints =
103-
editor.update(cx, |editor, cx| editor.supports_inlay_hints(cx));
104-
let editor = editor.read(cx);
105-
let selection_menu_enabled = editor.selection_menu_enabled(cx);
106-
let inlay_hints_enabled = editor.inlay_hints_enabled();
107-
let show_inline_diagnostics = editor.show_inline_diagnostics();
108-
let supports_inline_diagnostics = editor.inline_diagnostics_enabled();
109-
let git_blame_inline_enabled = editor.git_blame_inline_enabled();
110-
let show_git_blame_gutter = editor.show_git_blame_gutter();
111-
let auto_signature_help_enabled = editor.auto_signature_help_enabled(cx);
112-
let show_edit_predictions = editor.edit_predictions_enabled();
113-
let inline_completion_enabled = editor.inline_completions_enabled(cx);
114-
115-
(
116-
selection_menu_enabled,
117-
inlay_hints_enabled,
118-
supports_inlay_hints,
119-
show_inline_diagnostics,
120-
supports_inline_diagnostics,
121-
git_blame_inline_enabled,
122-
show_git_blame_gutter,
123-
auto_signature_help_enabled,
124-
show_edit_predictions,
125-
inline_completion_enabled,
126-
)
127-
};
128-
129-
let focus_handle = editor.read(cx).focus_handle(cx);
90+
let supports_inlay_hints = editor.update(cx, |editor, cx| editor.supports_inlay_hints(cx));
91+
let editor_value = editor.read(cx);
92+
let selection_menu_enabled = editor_value.selection_menu_enabled(cx);
93+
let inlay_hints_enabled = editor_value.inlay_hints_enabled();
94+
let inline_diagnostics_enabled = editor_value.show_inline_diagnostics();
95+
let supports_inline_diagnostics = editor_value.inline_diagnostics_enabled();
96+
let git_blame_inline_enabled = editor_value.git_blame_inline_enabled();
97+
let show_git_blame_gutter = editor_value.show_git_blame_gutter();
98+
let auto_signature_help_enabled = editor_value.auto_signature_help_enabled(cx);
99+
let has_edit_prediction_provider = editor_value.edit_prediction_provider().is_some();
100+
let show_edit_predictions = editor_value.edit_predictions_enabled();
101+
let edit_predictions_enabled_at_cursor =
102+
editor_value.edit_predictions_enabled_at_cursor(cx);
103+
104+
let focus_handle = editor_value.focus_handle(cx);
130105

131106
let search_button = editor.is_singleton(cx).then(|| {
132107
QuickActionBarButton::new(
@@ -328,33 +303,35 @@ impl Render for QuickActionBar {
328303
},
329304
);
330305

331-
let mut inline_completion_entry = ContextMenuEntry::new("Edit Predictions")
332-
.toggleable(IconPosition::Start, inline_completion_enabled && show_inline_completions)
333-
.disabled(!inline_completion_enabled)
334-
.action(Some(
335-
editor::actions::ToggleEditPrediction.boxed_clone(),
336-
)).handler({
337-
let editor = editor.clone();
338-
move |window, cx| {
339-
editor
340-
.update(cx, |editor, cx| {
341-
editor.toggle_inline_completions(
342-
&editor::actions::ToggleEditPrediction,
343-
window,
344-
cx,
345-
);
346-
})
347-
.ok();
348-
}
349-
});
350-
if !inline_completion_enabled {
351-
inline_completion_entry = inline_completion_entry.documentation_aside(|_| {
352-
Label::new("You can't toggle edit predictions for this file as it is within the excluded files list.").into_any_element()
353-
});
306+
if has_edit_prediction_provider {
307+
let mut inline_completion_entry = ContextMenuEntry::new("Edit Predictions")
308+
.toggleable(IconPosition::Start, edit_predictions_enabled_at_cursor && show_edit_predictions)
309+
.disabled(!edit_predictions_enabled_at_cursor)
310+
.action(Some(
311+
editor::actions::ToggleEditPrediction.boxed_clone(),
312+
)).handler({
313+
let editor = editor.clone();
314+
move |window, cx| {
315+
editor
316+
.update(cx, |editor, cx| {
317+
editor.toggle_edit_predictions(
318+
&editor::actions::ToggleEditPrediction,
319+
window,
320+
cx,
321+
);
322+
})
323+
.ok();
324+
}
325+
});
326+
if !edit_predictions_enabled_at_cursor {
327+
inline_completion_entry = inline_completion_entry.documentation_aside(|_| {
328+
Label::new("You can't toggle edit predictions for this file as it is within the excluded files list.").into_any_element()
329+
});
330+
}
331+
332+
menu = menu.item(inline_completion_entry);
354333
}
355334

356-
menu = menu.item(inline_completion_entry);
357-
358335
menu = menu.separator();
359336

360337
menu = menu.toggleable_entry(

0 commit comments

Comments
 (0)