]> git.lizzy.rs Git - rust.git/blob - crates/rust-analyzer/src/caps.rs
Merge #6513
[rust.git] / crates / rust-analyzer / src / caps.rs
1 //! Advertizes the capabilities of the LSP Server.
2 use std::env;
3
4 use lsp_types::{
5     CallHierarchyServerCapability, ClientCapabilities, CodeActionKind, CodeActionOptions,
6     CodeActionProviderCapability, CodeLensOptions, CompletionOptions,
7     DocumentOnTypeFormattingOptions, FoldingRangeProviderCapability, HoverProviderCapability,
8     ImplementationProviderCapability, OneOf, RenameOptions, SaveOptions,
9     SelectionRangeProviderCapability, SemanticTokensFullOptions, SemanticTokensLegend,
10     SemanticTokensOptions, ServerCapabilities, SignatureHelpOptions, TextDocumentSyncCapability,
11     TextDocumentSyncKind, TextDocumentSyncOptions, TypeDefinitionProviderCapability,
12     WorkDoneProgressOptions,
13 };
14 use serde_json::json;
15
16 use crate::semantic_tokens;
17
18 pub fn server_capabilities(client_caps: &ClientCapabilities) -> ServerCapabilities {
19     ServerCapabilities {
20         text_document_sync: Some(TextDocumentSyncCapability::Options(TextDocumentSyncOptions {
21             open_close: Some(true),
22             change: Some(if env::var("RA_NO_INCREMENTAL_SYNC").is_ok() {
23                 TextDocumentSyncKind::Full
24             } else {
25                 TextDocumentSyncKind::Incremental
26             }),
27             will_save: None,
28             will_save_wait_until: None,
29             save: Some(SaveOptions::default().into()),
30         })),
31         hover_provider: Some(HoverProviderCapability::Simple(true)),
32         completion_provider: Some(CompletionOptions {
33             resolve_provider: None,
34             trigger_characters: Some(vec![":".to_string(), ".".to_string()]),
35             work_done_progress_options: WorkDoneProgressOptions { work_done_progress: None },
36         }),
37         signature_help_provider: Some(SignatureHelpOptions {
38             trigger_characters: Some(vec!["(".to_string(), ",".to_string()]),
39             retrigger_characters: None,
40             work_done_progress_options: WorkDoneProgressOptions { work_done_progress: None },
41         }),
42         declaration_provider: None,
43         definition_provider: Some(OneOf::Left(true)),
44         type_definition_provider: Some(TypeDefinitionProviderCapability::Simple(true)),
45         implementation_provider: Some(ImplementationProviderCapability::Simple(true)),
46         references_provider: Some(OneOf::Left(true)),
47         document_highlight_provider: Some(OneOf::Left(true)),
48         document_symbol_provider: Some(OneOf::Left(true)),
49         workspace_symbol_provider: Some(OneOf::Left(true)),
50         code_action_provider: Some(code_action_capabilities(client_caps)),
51         code_lens_provider: Some(CodeLensOptions { resolve_provider: Some(true) }),
52         document_formatting_provider: Some(OneOf::Left(true)),
53         document_range_formatting_provider: None,
54         document_on_type_formatting_provider: Some(DocumentOnTypeFormattingOptions {
55             first_trigger_character: "=".to_string(),
56             more_trigger_character: Some(vec![".".to_string(), ">".to_string()]),
57         }),
58         selection_range_provider: Some(SelectionRangeProviderCapability::Simple(true)),
59         semantic_highlighting: None,
60         folding_range_provider: Some(FoldingRangeProviderCapability::Simple(true)),
61         rename_provider: Some(OneOf::Right(RenameOptions {
62             prepare_provider: Some(true),
63             work_done_progress_options: WorkDoneProgressOptions { work_done_progress: None },
64         })),
65         document_link_provider: None,
66         color_provider: None,
67         execute_command_provider: None,
68         workspace: None,
69         call_hierarchy_provider: Some(CallHierarchyServerCapability::Simple(true)),
70         semantic_tokens_provider: Some(
71             SemanticTokensOptions {
72                 legend: SemanticTokensLegend {
73                     token_types: semantic_tokens::SUPPORTED_TYPES.to_vec(),
74                     token_modifiers: semantic_tokens::SUPPORTED_MODIFIERS.to_vec(),
75                 },
76
77                 full: Some(SemanticTokensFullOptions::Delta { delta: Some(true) }),
78                 range: Some(true),
79                 work_done_progress_options: Default::default(),
80             }
81             .into(),
82         ),
83         experimental: Some(json!({
84             "joinLines": true,
85             "ssr": true,
86             "onEnter": true,
87             "parentModule": true,
88             "runnables": {
89                 "kinds": [ "cargo" ],
90             },
91         })),
92     }
93 }
94
95 fn code_action_capabilities(client_caps: &ClientCapabilities) -> CodeActionProviderCapability {
96     client_caps
97         .text_document
98         .as_ref()
99         .and_then(|it| it.code_action.as_ref())
100         .and_then(|it| it.code_action_literal_support.as_ref())
101         .map_or(CodeActionProviderCapability::Simple(true), |_| {
102             CodeActionProviderCapability::Options(CodeActionOptions {
103                 // Advertise support for all built-in CodeActionKinds.
104                 // Ideally we would base this off of the client capabilities
105                 // but the client is supposed to fall back gracefully for unknown values.
106                 code_action_kinds: Some(vec![
107                     CodeActionKind::EMPTY,
108                     CodeActionKind::QUICKFIX,
109                     CodeActionKind::REFACTOR,
110                     CodeActionKind::REFACTOR_EXTRACT,
111                     CodeActionKind::REFACTOR_INLINE,
112                     CodeActionKind::REFACTOR_REWRITE,
113                 ]),
114                 resolve_provider: Some(true),
115                 work_done_progress_options: Default::default(),
116             })
117         })
118 }