:art:

Antonio Scandurra created

Change summary

crates/editor/src/editor.rs | 31 +++++++++++++++----------------
1 file changed, 15 insertions(+), 16 deletions(-)

Detailed changes

crates/editor/src/editor.rs 🔗

@@ -1007,7 +1007,7 @@ impl CodeActionsMenu {
 }
 
 struct CopilotState {
-    position: Anchor,
+    excerpt_id: Option<ExcerptId>,
     pending_refresh: Task<Option<()>>,
     completions: Vec<copilot::Completion>,
     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<Self>) -> 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
     }