@@ -743,15 +743,15 @@ impl CompletionProvider for ContextPickerCompletionProvider {
_window: &mut Window,
cx: &mut Context<Editor>,
) -> Task<Result<Vec<CompletionResponse>>> {
- let state = buffer.update(cx, |buffer, _cx| {
- let position = buffer_position.to_point(buffer);
- let line_start = Point::new(position.row, 0);
- let offset_to_line = buffer.point_to_offset(line_start);
- let mut lines = buffer.text_for_range(line_start..position).lines();
- let line = lines.next()?;
- MentionCompletion::try_parse(line, offset_to_line)
- });
- let Some(state) = state else {
+ let snapshot = buffer.read(cx).snapshot();
+ let position = buffer_position.to_point(&snapshot);
+ let line_start = Point::new(position.row, 0);
+ let offset_to_line = snapshot.point_to_offset(line_start);
+ let mut lines = snapshot.text_for_range(line_start..position).lines();
+ let Some(line) = lines.next() else {
+ return Task::ready(Ok(Vec::new()));
+ };
+ let Some(state) = MentionCompletion::try_parse(line, offset_to_line) else {
return Task::ready(Ok(Vec::new()));
};
@@ -761,7 +761,6 @@ impl CompletionProvider for ContextPickerCompletionProvider {
return Task::ready(Ok(Vec::new()));
};
- let snapshot = buffer.read(cx).snapshot();
let source_range = snapshot.anchor_before(state.source_range.start)
..snapshot.anchor_after(state.source_range.end);
@@ -5473,16 +5473,18 @@ impl Editor {
if position.diff_base_anchor.is_some() {
return;
}
- let (buffer, buffer_position) =
- if let Some(output) = self.buffer.read(cx).text_anchor_for_position(position, cx) {
- output
- } else {
- return;
- };
+ let buffer_position = multibuffer_snapshot.anchor_before(position);
+ let Some(buffer) = buffer_position
+ .buffer_id
+ .and_then(|buffer_id| self.buffer.read(cx).buffer(buffer_id))
+ else {
+ return;
+ };
let buffer_snapshot = buffer.read(cx).snapshot();
let query: Option<Arc<String>> =
- Self::completion_query(&multibuffer_snapshot, position).map(|query| query.into());
+ Self::completion_query(&multibuffer_snapshot, buffer_position)
+ .map(|query| query.into());
drop(multibuffer_snapshot);
@@ -5568,6 +5570,11 @@ impl Editor {
}
};
+ let Anchor {
+ excerpt_id: buffer_excerpt_id,
+ text_anchor: buffer_position,
+ ..
+ } = buffer_position;
let (word_replace_range, word_to_exclude) = if let (word_range, Some(CharKind::Word)) =
buffer_snapshot.surrounding_word(buffer_position, false)
{
@@ -5623,7 +5630,7 @@ impl Editor {
let (mut words, provider_responses) = match &provider {
Some(provider) => {
let provider_responses = provider.completions(
- position.excerpt_id,
+ buffer_excerpt_id,
&buffer,
buffer_position,
completion_context,
@@ -3078,7 +3078,7 @@ impl ToOffset for usize {
fn to_offset(&self, snapshot: &BufferSnapshot) -> usize {
assert!(
*self <= snapshot.len(),
- "offset {} is out of range, max allowed is {}",
+ "offset {} is out of range, snapshot length is {}",
self,
snapshot.len()
);