diff --git a/crates/agent/src/context_picker/completion_provider.rs b/crates/agent/src/context_picker/completion_provider.rs index d86c4105cf..3745c1cb9a 100644 --- a/crates/agent/src/context_picker/completion_provider.rs +++ b/crates/agent/src/context_picker/completion_provider.rs @@ -765,7 +765,7 @@ impl CompletionProvider for ContextPickerCompletionProvider { let snapshot = buffer.read(cx).snapshot(); let source_range = snapshot.anchor_before(state.source_range.start) - ..snapshot.anchor_before(state.source_range.end); + ..snapshot.anchor_after(state.source_range.end); let thread_store = self.thread_store.clone(); let text_thread_store = self.text_thread_store.clone(); diff --git a/crates/assistant_context_editor/src/slash_command.rs b/crates/assistant_context_editor/src/slash_command.rs index d1dd2c9cd7..726e74297b 100644 --- a/crates/assistant_context_editor/src/slash_command.rs +++ b/crates/assistant_context_editor/src/slash_command.rs @@ -238,13 +238,14 @@ impl SlashCommandCompletionProvider { Ok(vec![project::CompletionResponse { completions, - is_incomplete: false, + // TODO: Could have slash commands indicate whether their completions are incomplete. + is_incomplete: true, }]) }) } else { Task::ready(Ok(vec![project::CompletionResponse { completions: Vec::new(), - is_incomplete: false, + is_incomplete: true, }])) } } @@ -273,17 +274,17 @@ impl CompletionProvider for SlashCommandCompletionProvider { position.row, call.arguments.last().map_or(call.name.end, |arg| arg.end) as u32, ); - let command_range = buffer.anchor_after(command_range_start) + let command_range = buffer.anchor_before(command_range_start) ..buffer.anchor_after(command_range_end); let name = line[call.name.clone()].to_string(); let (arguments, last_argument_range) = if let Some(argument) = call.arguments.last() { let last_arg_start = - buffer.anchor_after(Point::new(position.row, argument.start as u32)); + buffer.anchor_before(Point::new(position.row, argument.start as u32)); let first_arg_start = call.arguments.first().expect("we have the last element"); - let first_arg_start = - buffer.anchor_after(Point::new(position.row, first_arg_start.start as u32)); + let first_arg_start = buffer + .anchor_before(Point::new(position.row, first_arg_start.start as u32)); let arguments = call .arguments .into_iter() @@ -296,7 +297,7 @@ impl CompletionProvider for SlashCommandCompletionProvider { ) } else { let start = - buffer.anchor_after(Point::new(position.row, call.name.start as u32)); + buffer.anchor_before(Point::new(position.row, call.name.start as u32)); (None, start..buffer_position) }; diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 3b1b43a46f..fec20454a3 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -5067,10 +5067,16 @@ impl Editor { return; } + let multibuffer_snapshot = self.buffer.read(cx).read(cx); + // Typically `start` == `end`, but with snippet tabstop choices the default choice is // inserted and selected. To handle that case, the start of the selection is used so that // the menu starts with all choices. - let position = self.selections.newest_anchor().start; + let position = self + .selections + .newest_anchor() + .start + .bias_right(&multibuffer_snapshot); if position.diff_base_anchor.is_some() { return; } @@ -5083,8 +5089,9 @@ impl Editor { let buffer_snapshot = buffer.read(cx).snapshot(); let query: Option> = - Self::completion_query(&self.buffer.read(cx).read(cx), position) - .map(|query| query.into()); + Self::completion_query(&multibuffer_snapshot, position).map(|query| query.into()); + + drop(multibuffer_snapshot); let provider = match requested_source { Some(CompletionsMenuSource::Normal) | None => self.completion_provider.clone(), diff --git a/crates/inspector_ui/src/div_inspector.rs b/crates/inspector_ui/src/div_inspector.rs index 05c1e2222c..7d162bcc35 100644 --- a/crates/inspector_ui/src/div_inspector.rs +++ b/crates/inspector_ui/src/div_inspector.rs @@ -715,7 +715,7 @@ fn completion_replace_range(snapshot: &BufferSnapshot, anchor: &Anchor) -> Optio if end_in_line > start_in_line { let replace_start = snapshot.anchor_before(line_start + start_in_line); - let replace_end = snapshot.anchor_before(line_start + end_in_line); + let replace_end = snapshot.anchor_after(line_start + end_in_line); Some(replace_start..replace_end) } else { None