From 4887ea3563df756a2a25ce36eeb2800d7758721b Mon Sep 17 00:00:00 2001 From: Mikayla Date: Fri, 29 Sep 2023 12:05:21 -0700 Subject: [PATCH 1/2] 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, From 31ff5bffd632947d4962582defc203b2a0ee3e55 Mon Sep 17 00:00:00 2001 From: Mikayla Date: Fri, 29 Sep 2023 12:19:58 -0700 Subject: [PATCH 2/2] Fix tests relying on off-spec behavior --- crates/project/src/project.rs | 54 ++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 1db00b387c..94180bc023 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -2232,24 +2232,8 @@ impl Project { .and_then(|m| m.get_mut(&language_server.server_id()))?; let previous_snapshot = buffer_snapshots.last()?; - 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: next_snapshot.text(), - }] - } - Some(lsp::TextDocumentSyncKind::INCREMENTAL) => buffer + let build_incremental_change = || { + buffer .edits_since::<(PointUtf16, usize)>( previous_snapshot.snapshot.version(), ) @@ -2268,8 +2252,38 @@ impl Project { text: new_text, } }) - .collect(), - _ => continue, + .collect() + }; + + 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: next_snapshot.text(), + }] + } + Some(lsp::TextDocumentSyncKind::INCREMENTAL) => build_incremental_change(), + _ => { + #[cfg(any(test, feature = "test-support"))] + { + build_incremental_change() + } + + #[cfg(not(any(test, feature = "test-support")))] + { + continue; + } + } }; let next_version = previous_snapshot.version + 1;