editor: Fix incorrect offset passed to acp completion provider (#38321)

Might fix | ZED-15G
Release Notes:

- N/A *or* Added/Fixed/Improved ...
This commit is contained in:
Lukas Wirth
2025-09-17 12:02:39 +00:00
committed by GitHub
parent 574b943081
commit a5c29176a3
3 changed files with 25 additions and 19 deletions
@@ -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);
+15 -8
View File
@@ -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,
+1 -1
View File
@@ -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()
);