diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index a89317db90..f207430d7a 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -1314,15 +1314,41 @@ impl Project { } for (buffer, buffer_abs_path, lang_server) in local_buffers { - let lsp_edits = lang_server - .request::(lsp::DocumentFormattingParams { - text_document: lsp::TextDocumentIdentifier::new( - lsp::Url::from_file_path(&buffer_abs_path).unwrap(), - ), - options: Default::default(), - work_done_progress_params: Default::default(), - }) - .await?; + let capabilities = if let Some(capabilities) = lang_server.capabilities().await { + capabilities + } else { + continue; + }; + + let text_document = lsp::TextDocumentIdentifier::new( + lsp::Url::from_file_path(&buffer_abs_path).unwrap(), + ); + let lsp_edits = if capabilities.document_formatting_provider.is_some() { + lang_server + .request::(lsp::DocumentFormattingParams { + text_document, + options: Default::default(), + work_done_progress_params: Default::default(), + }) + .await? + } else if capabilities.document_range_formatting_provider.is_some() { + let buffer_start = lsp::Position::new(0, 0); + let buffer_end = buffer + .read_with(&cx, |buffer, _| buffer.max_point_utf16()) + .to_lsp_position(); + lang_server + .request::( + lsp::DocumentRangeFormattingParams { + text_document, + range: lsp::Range::new(buffer_start, buffer_end), + options: Default::default(), + work_done_progress_params: Default::default(), + }, + ) + .await? + } else { + continue; + }; if let Some(lsp_edits) = lsp_edits { let edits = buffer diff --git a/crates/text/src/rope.rs b/crates/text/src/rope.rs index 3d1cb28eb1..ce666968b2 100644 --- a/crates/text/src/rope.rs +++ b/crates/text/src/rope.rs @@ -126,6 +126,10 @@ impl Rope { self.chunks.extent(&()) } + pub fn max_point_utf16(&self) -> PointUtf16 { + self.chunks.extent(&()) + } + pub fn cursor(&self, offset: usize) -> Cursor { Cursor::new(self, offset) } diff --git a/crates/text/src/text.rs b/crates/text/src/text.rs index 95441a1208..89943777e0 100644 --- a/crates/text/src/text.rs +++ b/crates/text/src/text.rs @@ -1526,6 +1526,10 @@ impl BufferSnapshot { self.visible_text.max_point() } + pub fn max_point_utf16(&self) -> PointUtf16 { + self.visible_text.max_point_utf16() + } + pub fn point_to_offset(&self, point: Point) -> usize { self.visible_text.point_to_offset(point) }