Return `None` when prepare rename is not available on language server

Antonio Scandurra created

Change summary

crates/lsp/src/lsp.rs             | 4 ++++
crates/project/src/lsp_command.rs | 8 ++++++++
2 files changed, 12 insertions(+)

Detailed changes

crates/lsp/src/lsp.rs 🔗

@@ -292,6 +292,10 @@ impl LanguageServer {
                         }),
                         ..Default::default()
                     }),
+                    rename: Some(RenameClientCapabilities {
+                        prepare_support: Some(true),
+                        ..Default::default()
+                    }),
                     ..Default::default()
                 }),
                 experimental: Some(json!({

crates/project/src/lsp_command.rs 🔗

@@ -86,6 +86,14 @@ impl LspCommand for PrepareRename {
     type LspRequest = lsp::request::PrepareRenameRequest;
     type ProtoRequest = proto::PrepareRename;
 
+    fn check_capabilities(&self, capabilities: &ServerCapabilities) -> bool {
+        if let Some(lsp::OneOf::Right(rename)) = &capabilities.rename_provider {
+            rename.prepare_provider == Some(true)
+        } else {
+            false
+        }
+    }
+
     fn to_lsp(&self, path: &Path, _: &AppContext) -> lsp::TextDocumentPositionParams {
         lsp::TextDocumentPositionParams {
             text_document: lsp::TextDocumentIdentifier {