diff --git a/crates/lsp/src/lsp.rs b/crates/lsp/src/lsp.rs index baff4c343c..edbe564b79 100644 --- a/crates/lsp/src/lsp.rs +++ b/crates/lsp/src/lsp.rs @@ -724,6 +724,9 @@ impl LanguageServer { }), rename: Some(RenameClientCapabilities { prepare_support: Some(true), + prepare_support_default_behavior: Some( + PrepareSupportDefaultBehavior::IDENTIFIER, + ), ..Default::default() }), hover: Some(HoverClientCapabilities { diff --git a/crates/project/src/lsp_command.rs b/crates/project/src/lsp_command.rs index c632f9aca1..68f1522af5 100644 --- a/crates/project/src/lsp_command.rs +++ b/crates/project/src/lsp_command.rs @@ -299,28 +299,27 @@ impl LspCommand for PrepareRename { _: LanguageServerId, mut cx: AsyncApp, ) -> Result { - buffer.update(&mut cx, |buffer, _| { - match message { - Some(lsp::PrepareRenameResponse::Range(range)) - | Some(lsp::PrepareRenameResponse::RangeWithPlaceholder { range, .. }) => { - let Range { start, end } = range_from_lsp(range); - if buffer.clip_point_utf16(start, Bias::Left) == start.0 - && buffer.clip_point_utf16(end, Bias::Left) == end.0 - { - Ok(PrepareRenameResponse::Success( - buffer.anchor_after(start)..buffer.anchor_before(end), - )) - } else { - Ok(PrepareRenameResponse::InvalidPosition) - } - } - Some(lsp::PrepareRenameResponse::DefaultBehavior { .. }) => { - Err(anyhow!("Invalid for language server to send a `defaultBehavior` response to `prepareRename`")) - } - None => { + buffer.update(&mut cx, |buffer, _| match message { + Some(lsp::PrepareRenameResponse::Range(range)) + | Some(lsp::PrepareRenameResponse::RangeWithPlaceholder { range, .. }) => { + let Range { start, end } = range_from_lsp(range); + if buffer.clip_point_utf16(start, Bias::Left) == start.0 + && buffer.clip_point_utf16(end, Bias::Left) == end.0 + { + Ok(PrepareRenameResponse::Success( + buffer.anchor_after(start)..buffer.anchor_before(end), + )) + } else { Ok(PrepareRenameResponse::InvalidPosition) } } + Some(lsp::PrepareRenameResponse::DefaultBehavior { .. }) => { + let snapshot = buffer.snapshot(); + let (range, _) = snapshot.surrounding_word(self.position); + let range = snapshot.anchor_after(range.start)..snapshot.anchor_before(range.end); + Ok(PrepareRenameResponse::Success(range)) + } + None => Ok(PrepareRenameResponse::InvalidPosition), })? }