From 4887ea3563df756a2a25ce36eeb2800d7758721b Mon Sep 17 00:00:00 2001 From: Mikayla Date: Fri, 29 Sep 2023 12:05:21 -0700 Subject: [PATCH] Add support for the TextDocumentSyncKind LSP options --- crates/project/src/project.rs | 58 ++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index a551b985bf..1db00b387c 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -2231,26 +2231,48 @@ impl Project { .get_mut(&buffer.remote_id()) .and_then(|m| m.get_mut(&language_server.server_id()))?; let previous_snapshot = buffer_snapshots.last()?; - let next_version = previous_snapshot.version + 1; - let content_changes = buffer - .edits_since::<(PointUtf16, usize)>(previous_snapshot.snapshot.version()) - .map(|edit| { - let edit_start = edit.new.start.0; - let edit_end = edit_start + (edit.old.end.0 - edit.old.start.0); - let new_text = next_snapshot - .text_for_range(edit.new.start.1..edit.new.end.1) - .collect(); - lsp::TextDocumentContentChangeEvent { - range: Some(lsp::Range::new( - point_to_lsp(edit_start), - point_to_lsp(edit_end), - )), + let document_sync_kind = language_server + .capabilities() + .text_document_sync + .as_ref() + .and_then(|sync| match sync { + lsp::TextDocumentSyncCapability::Kind(kind) => Some(*kind), + lsp::TextDocumentSyncCapability::Options(options) => options.change, + }); + + let content_changes: Vec<_> = match document_sync_kind { + Some(lsp::TextDocumentSyncKind::FULL) => { + vec![lsp::TextDocumentContentChangeEvent { + range: None, range_length: None, - text: new_text, - } - }) - .collect(); + text: next_snapshot.text(), + }] + } + Some(lsp::TextDocumentSyncKind::INCREMENTAL) => buffer + .edits_since::<(PointUtf16, usize)>( + previous_snapshot.snapshot.version(), + ) + .map(|edit| { + let edit_start = edit.new.start.0; + let edit_end = edit_start + (edit.old.end.0 - edit.old.start.0); + let new_text = next_snapshot + .text_for_range(edit.new.start.1..edit.new.end.1) + .collect(); + lsp::TextDocumentContentChangeEvent { + range: Some(lsp::Range::new( + point_to_lsp(edit_start), + point_to_lsp(edit_end), + )), + range_length: None, + text: new_text, + } + }) + .collect(), + _ => continue, + }; + + let next_version = previous_snapshot.version + 1; buffer_snapshots.push(LspBufferSnapshot { version: next_version,