1- use crate :: extensions:: { java, rust_analyzer } ;
1+ use crate :: extensions:: java;
22use crate :: language_client:: LanguageClient ;
33use crate :: vim:: { try_get, Mode } ;
44use crate :: {
@@ -177,6 +177,7 @@ impl LanguageClient {
177177 apply_completion_text_edits,
178178 preferred_markup_kind,
179179 hide_virtual_texts_on_insert,
180+ enable_extensions,
180181 ) : (
181182 Option < usize > ,
182183 String ,
@@ -190,6 +191,7 @@ impl LanguageClient {
190191 u8 ,
191192 Option < Vec < MarkupKind > > ,
192193 u8 ,
194+ Option < HashMap < String , bool > > ,
193195 ) = self . vim ( ) ?. eval (
194196 [
195197 "get(g:, 'LanguageClient_diagnosticsSignsMax', v:null)" ,
@@ -204,6 +206,7 @@ impl LanguageClient {
204206 "get(g:, 'LanguageClient_applyCompletionAdditionalTextEdits', 1)" ,
205207 "get(g:, 'LanguageClient_preferredMarkupKind', v:null)" ,
206208 "s:GetVar('LanguageClient_hideVirtualTextsOnInsert', 0)" ,
209+ "get(g:, 'LanguageClient_enableExtensions', v:null)" ,
207210 ]
208211 . as_ref ( ) ,
209212 ) ?;
@@ -320,6 +323,7 @@ impl LanguageClient {
320323 state. server_stderr = server_stderr;
321324 state. is_nvim = is_nvim;
322325 state. preferred_markup_kind = preferred_markup_kind;
326+ state. enable_extensions = enable_extensions;
323327 Ok ( ( ) )
324328 } ) ?;
325329
@@ -1017,15 +1021,32 @@ impl LanguageClient {
10171021 }
10181022
10191023 fn try_handle_command_by_client ( & self , cmd : & Command ) -> Result < bool > {
1020- match cmd. command . as_str ( ) {
1021- java:: command:: APPLY_WORKSPACE_EDIT => self . handle_java_command ( cmd) ,
1022- rust_analyzer:: command:: RUN
1023- | rust_analyzer:: command:: RUN_SINGLE
1024- | rust_analyzer:: command:: SHOW_REFERENCES
1025- | rust_analyzer:: command:: SELECT_APPLY_SOURCE_CHANGE
1026- | rust_analyzer:: command:: APPLY_SOURCE_CHANGE => self . handle_rust_analyzer_command ( cmd) ,
1027-
1028- _ => Ok ( false ) ,
1024+ let filetype: String = self . vim ( ) ?. eval ( "&filetype" ) ?;
1025+ let enabled_extensions = self . get ( |state| state. enable_extensions . clone ( ) ) ?;
1026+ if !enabled_extensions
1027+ . unwrap_or_default ( )
1028+ . get ( & filetype)
1029+ . cloned ( )
1030+ . unwrap_or ( true )
1031+ {
1032+ return Ok ( false ) ;
1033+ }
1034+
1035+ let capabilities = self . get ( |state| state. capabilities . get ( & filetype) . cloned ( ) ) ?;
1036+ let server_name = capabilities
1037+ . unwrap_or_default ( )
1038+ . server_info
1039+ . unwrap_or_default ( )
1040+ . name ;
1041+
1042+ match server_name. as_str ( ) {
1043+ "gopls" => self . handle_gopls_command ( cmd) ,
1044+ "rust-analyzer" => self . handle_rust_analyzer_command ( cmd) ,
1045+ _ => match cmd. command . as_str ( ) {
1046+ // not sure which name java's language server advertises
1047+ java:: command:: APPLY_WORKSPACE_EDIT => self . handle_java_command ( cmd) ,
1048+ _ => Ok ( false ) ,
1049+ } ,
10291050 }
10301051 }
10311052
@@ -1247,10 +1268,11 @@ impl LanguageClient {
12471268 } ,
12481269 ) ?;
12491270
1271+ let initialize_result = InitializeResult :: deserialize ( & result) ?;
12501272 self . update ( |state| {
12511273 state
12521274 . capabilities
1253- . insert ( language_id. clone ( ) , result . clone ( ) ) ;
1275+ . insert ( language_id. clone ( ) , initialize_result ) ;
12541276 Ok ( ( ) )
12551277 } ) ?;
12561278
@@ -2122,9 +2144,7 @@ impl LanguageClient {
21222144 if let Some ( initialize_result) = capabilities. get ( & language_id) {
21232145 // XXX: the capabilities state field stores the initialize result, not the capabilities
21242146 // themselves, so we need to deserialize to InitializeResult.
2125- let initialize_result: InitializeResult =
2126- serde_json:: from_value ( initialize_result. clone ( ) ) ?;
2127- let capabilities = initialize_result. capabilities ;
2147+ let capabilities = initialize_result. capabilities . clone ( ) ;
21282148
21292149 if let Some ( code_lens_provider) = capabilities. code_lens_provider {
21302150 info ! ( "Begin {}" , lsp_types:: request:: CodeLensRequest :: METHOD ) ;
0 commit comments