Start work on interpreting 'label/insertText' completions

These completions don't supply a range that should be overwritten, so
the client needs to infer it via substring matching.

Co-authored-by: Keith Simmons <keith@zed.dev>
This commit is contained in:
Max Brunsfeld 2022-03-30 17:47:25 -07:00
parent c280c85ce7
commit 263e3d8176
3 changed files with 20 additions and 1 deletions

View File

@ -2363,7 +2363,10 @@ impl Project {
Some(lsp::CompletionTextEdit::Edit(edit)) => { Some(lsp::CompletionTextEdit::Edit(edit)) => {
(range_from_lsp(edit.range), edit.new_text.clone()) (range_from_lsp(edit.range), edit.new_text.clone())
} }
None => (position..position, lsp_completion.label.clone()), None => (
this.common_prefix_at_position(position, &lsp_completion.label),
lsp_completion.label.clone(),
),
Some(lsp::CompletionTextEdit::InsertAndReplace(_)) => { Some(lsp::CompletionTextEdit::InsertAndReplace(_)) => {
log::info!("unsupported insert/replace completion"); log::info!("unsupported insert/replace completion");
return None; return None;

View File

@ -164,6 +164,15 @@ fn test_line_len() {
assert_eq!(buffer.line_len(5), 0); assert_eq!(buffer.line_len(5), 0);
} }
#[test]
fn test_common_prefix_at_positionn() {
let buffer = Buffer::new(0, 0, History::new("a = (bcd)".into()));
assert_eq!(
buffer.common_prefix_at_position(Point::new(0, 8), "bcdef"),
Point::new(0, 5)..Point::new(0, 8)
)
}
#[test] #[test]
fn test_text_summary_for_range() { fn test_text_summary_for_range() {
let buffer = Buffer::new(0, 0, History::new("ab\nefg\nhklm\nnopqrs\ntuvwxyz".into())); let buffer = Buffer::new(0, 0, History::new("ab\nefg\nhklm\nnopqrs\ntuvwxyz".into()));

View File

@ -1508,6 +1508,13 @@ impl BufferSnapshot {
.eq(needle.bytes()) .eq(needle.bytes())
} }
pub fn common_prefix_at_position<T>(&self, position: T, needle: &str) -> Range<T>
where
T: TextDimension + ToOffset,
{
todo!()
}
pub fn text(&self) -> String { pub fn text(&self) -> String {
self.visible_text.to_string() self.visible_text.to_string()
} }