|
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