|
2 | 2 | use std::env;
|
3 | 3 |
|
4 | 4 | use lsp_types::{
|
5 |
| - CallHierarchyServerCapability, CodeActionOptions, CodeActionProviderCapability, |
6 |
| - CodeLensOptions, CompletionOptions, DocumentOnTypeFormattingOptions, |
7 |
| - FoldingRangeProviderCapability, ImplementationProviderCapability, RenameOptions, |
8 |
| - RenameProviderCapability, SaveOptions, SelectionRangeProviderCapability, |
9 |
| - SemanticTokensDocumentProvider, SemanticTokensLegend, SemanticTokensOptions, |
10 |
| - ServerCapabilities, SignatureHelpOptions, TextDocumentSyncCapability, TextDocumentSyncKind, |
11 |
| - TextDocumentSyncOptions, TypeDefinitionProviderCapability, WorkDoneProgressOptions, |
| 5 | + CallHierarchyServerCapability, ClientCapabilities, CodeActionOptions, |
| 6 | + CodeActionProviderCapability, CodeLensOptions, CompletionOptions, |
| 7 | + DocumentOnTypeFormattingOptions, FoldingRangeProviderCapability, |
| 8 | + ImplementationProviderCapability, RenameOptions, RenameProviderCapability, SaveOptions, |
| 9 | + SelectionRangeProviderCapability, SemanticTokensDocumentProvider, SemanticTokensLegend, |
| 10 | + SemanticTokensOptions, ServerCapabilities, SignatureHelpOptions, TextDocumentSyncCapability, |
| 11 | + TextDocumentSyncKind, TextDocumentSyncOptions, TypeDefinitionProviderCapability, |
| 12 | + WorkDoneProgressOptions, |
12 | 13 | };
|
13 | 14 | use serde_json::json;
|
14 | 15 |
|
15 | 16 | use crate::semantic_tokens;
|
16 | 17 |
|
17 |
| -pub fn server_capabilities() -> ServerCapabilities { |
| 18 | +pub fn server_capabilities(client_caps: &ClientCapabilities) -> ServerCapabilities { |
| 19 | + let code_action_provider = code_action_capabilities(client_caps); |
| 20 | + |
18 | 21 | ServerCapabilities {
|
19 | 22 | text_document_sync: Some(TextDocumentSyncCapability::Options(TextDocumentSyncOptions {
|
20 | 23 | open_close: Some(true),
|
@@ -46,20 +49,7 @@ pub fn server_capabilities() -> ServerCapabilities {
|
46 | 49 | document_highlight_provider: Some(true),
|
47 | 50 | document_symbol_provider: Some(true),
|
48 | 51 | workspace_symbol_provider: Some(true),
|
49 |
| - code_action_provider: Some(CodeActionProviderCapability::Options(CodeActionOptions { |
50 |
| - // Advertise support for all built-in CodeActionKinds |
51 |
| - code_action_kinds: Some(vec![ |
52 |
| - lsp_types::code_action_kind::EMPTY.to_string(), |
53 |
| - lsp_types::code_action_kind::QUICKFIX.to_string(), |
54 |
| - lsp_types::code_action_kind::REFACTOR.to_string(), |
55 |
| - lsp_types::code_action_kind::REFACTOR_EXTRACT.to_string(), |
56 |
| - lsp_types::code_action_kind::REFACTOR_INLINE.to_string(), |
57 |
| - lsp_types::code_action_kind::REFACTOR_REWRITE.to_string(), |
58 |
| - lsp_types::code_action_kind::SOURCE.to_string(), |
59 |
| - lsp_types::code_action_kind::SOURCE_ORGANIZE_IMPORTS.to_string(), |
60 |
| - ]), |
61 |
| - work_done_progress_options: Default::default(), |
62 |
| - })), |
| 52 | + code_action_provider: Some(code_action_provider), |
63 | 53 | code_lens_provider: Some(CodeLensOptions { resolve_provider: Some(true) }),
|
64 | 54 | document_formatting_provider: Some(true),
|
65 | 55 | document_range_formatting_provider: None,
|
@@ -98,3 +88,29 @@ pub fn server_capabilities() -> ServerCapabilities {
|
98 | 88 | })),
|
99 | 89 | }
|
100 | 90 | }
|
| 91 | + |
| 92 | +fn code_action_capabilities(client_caps: &ClientCapabilities) -> CodeActionProviderCapability { |
| 93 | + client_caps |
| 94 | + .text_document |
| 95 | + .as_ref() |
| 96 | + .and_then(|it| it.code_action.as_ref()) |
| 97 | + .and_then(|it| it.code_action_literal_support.as_ref()) |
| 98 | + .map_or(CodeActionProviderCapability::Simple(true), |_| { |
| 99 | + CodeActionProviderCapability::Options(CodeActionOptions { |
| 100 | + // Advertise support for all built-in CodeActionKinds. |
| 101 | + // Ideally we would base this off of the client capabilities |
| 102 | + // but the client is supposed to fall back gracefully for unknown values. |
| 103 | + code_action_kinds: Some(vec![ |
| 104 | + lsp_types::code_action_kind::EMPTY.to_string(), |
| 105 | + lsp_types::code_action_kind::QUICKFIX.to_string(), |
| 106 | + lsp_types::code_action_kind::REFACTOR.to_string(), |
| 107 | + lsp_types::code_action_kind::REFACTOR_EXTRACT.to_string(), |
| 108 | + lsp_types::code_action_kind::REFACTOR_INLINE.to_string(), |
| 109 | + lsp_types::code_action_kind::REFACTOR_REWRITE.to_string(), |
| 110 | + lsp_types::code_action_kind::SOURCE.to_string(), |
| 111 | + lsp_types::code_action_kind::SOURCE_ORGANIZE_IMPORTS.to_string(), |
| 112 | + ]), |
| 113 | + work_done_progress_options: Default::default(), |
| 114 | + }) |
| 115 | + }) |
| 116 | +} |
0 commit comments