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:
@@ -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()
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user