diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 9c1b0913aa..ccd090c409 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -1007,7 +1007,7 @@ impl CodeActionsMenu { } struct CopilotState { - position: Anchor, + excerpt_id: Option, pending_refresh: Task>, completions: Vec, active_completion_index: usize, @@ -1016,7 +1016,7 @@ struct CopilotState { impl Default for CopilotState { fn default() -> Self { Self { - position: Anchor::min(), + excerpt_id: None, pending_refresh: Task::ready(Some(())), completions: Default::default(), active_completion_index: 0, @@ -1032,12 +1032,10 @@ impl CopilotState { ) -> Option<&str> { let cursor_offset = cursor.to_offset(buffer); let completion = self.completions.get(self.active_completion_index)?; - if self.position.excerpt_id == cursor.excerpt_id - && self.position.buffer_id == cursor.buffer_id - { + if self.excerpt_id == Some(cursor.excerpt_id) { let completion_offset: usize = buffer.summary_for_anchor(&Anchor { - excerpt_id: self.position.excerpt_id, - buffer_id: self.position.buffer_id, + excerpt_id: cursor.excerpt_id, + buffer_id: cursor.buffer_id, text_anchor: completion.position, }); let prefix_len = cursor_offset.saturating_sub(completion_offset); @@ -2777,12 +2775,11 @@ impl Editor { .completions .swap(0, self.copilot_state.active_completion_index); self.copilot_state.completions.truncate(1); + self.copilot_state.active_completion_index = 0; + cx.notify(); } else { self.clear_copilot_suggestions(cx); } - self.copilot_state.position = cursor; - self.copilot_state.active_completion_index = 0; - cx.notify(); if !copilot.read(cx).status().is_authorized() { return None; @@ -2805,6 +2802,7 @@ impl Editor { this.upgrade(&cx)?.update(&mut cx, |this, cx| { this.copilot_state.completions.clear(); this.copilot_state.active_completion_index = 0; + this.copilot_state.excerpt_id = Some(cursor.excerpt_id); for completion in completions { let was_empty = this.copilot_state.completions.is_empty(); if let Some(completion) = this.copilot_state.push_completion(completion) { @@ -2837,17 +2835,18 @@ impl Editor { } let snapshot = self.buffer.read(cx).snapshot(cx); + let cursor = self.selections.newest_anchor().head(); self.copilot_state.active_completion_index = (self.copilot_state.active_completion_index + 1) % self.copilot_state.completions.len(); if let Some(text) = self .copilot_state - .text_for_active_completion(self.copilot_state.position, &snapshot) + .text_for_active_completion(cursor, &snapshot) { self.display_map.update(cx, |map, cx| { map.replace_suggestion( Some(Suggestion { - position: self.copilot_state.position, + position: cursor, text: text.into(), }), cx, @@ -2859,12 +2858,12 @@ impl Editor { fn accept_copilot_suggestion(&mut self, cx: &mut ViewContext) -> bool { let snapshot = self.buffer.read(cx).snapshot(cx); + let cursor = self.selections.newest_anchor().head(); if let Some(text) = self .copilot_state - .text_for_active_completion(self.copilot_state.position, &snapshot) - .map(|text| text.to_string()) + .text_for_active_completion(cursor, &snapshot) { - self.insert(&text, cx); + self.insert(&text.to_string(), cx); self.clear_copilot_suggestions(cx); true } else { @@ -2879,7 +2878,7 @@ impl Editor { self.copilot_state.completions.clear(); self.copilot_state.active_completion_index = 0; self.copilot_state.pending_refresh = Task::ready(None); - self.copilot_state.position = Anchor::min(); + self.copilot_state.excerpt_id = None; cx.notify(); !was_empty }