@@ -126,7 +126,7 @@ impl LanguageClient {
126
126
is_nvim,
127
127
) : (
128
128
u64 ,
129
- HashMap < String , Vec < String > > ,
129
+ HashMap < String , ServerCommand > ,
130
130
Option < String > ,
131
131
Option < String > ,
132
132
Vec < String > ,
@@ -295,7 +295,7 @@ impl LanguageClient {
295
295
state. semantic_highlight_maps = semantic_highlight_maps;
296
296
state. semantic_scope_separator = semantic_scope_separator;
297
297
state. semantic_scope_to_hl_group_table . clear ( ) ;
298
- state. server_commands . extend ( server_commands) ;
298
+ state. server_commands = server_commands;
299
299
state. selection_ui = selection_ui;
300
300
state. selection_ui_auto_open = selection_ui_auto_open;
301
301
state. trace = trace;
@@ -1136,6 +1136,42 @@ impl LanguageClient {
1136
1136
}
1137
1137
}
1138
1138
1139
+ fn get_server_initialization_options_for_language_id (
1140
+ & self ,
1141
+ root : & str ,
1142
+ language_id : & str ,
1143
+ ) -> Result < Option < Value > > {
1144
+ let server_name = self . server_name_for_language_id ( & language_id) ?;
1145
+ let settings = self . get_workspace_settings ( & root) ?;
1146
+ // warn the user that they are using a deprecated workspace settings
1147
+ // file format and direct them to the documentation about the new one
1148
+ if settings. pointer ( "/initializationOptions" ) . is_some ( ) {
1149
+ let lines = vec ! [
1150
+ "You seem to be using an incorrect workspace settings format for LanguageClient-neovim, to learn more about this error see `:help g:LanguageClient_settingsPath`" ,
1151
+ ] ;
1152
+ self . vim ( ) ?
1153
+ . rpcclient
1154
+ . notify ( "s:ShowAlert" , json ! ( [ "__LanguageClient__" , lines] ) ) ?;
1155
+ }
1156
+
1157
+ let section = format ! ( "/{}" , server_name) ;
1158
+ let initialization_options = settings. pointer ( section. as_str ( ) ) . unwrap_or ( & Value :: Null ) ;
1159
+ let initialization_options =
1160
+ get_default_initialization_options ( & language_id) . combine ( & initialization_options) ;
1161
+
1162
+ if initialization_options. is_null ( ) {
1163
+ Ok ( None )
1164
+ } else {
1165
+ Ok ( Some ( initialization_options) )
1166
+ }
1167
+ }
1168
+
1169
+ pub fn server_name_for_language_id ( & self , language_id : & str ) -> Result < String > {
1170
+ let server_commands = self . get ( |state| state. server_commands . clone ( ) ) ?;
1171
+ let server_command = server_commands. get ( language_id) . unwrap ( ) ;
1172
+ Ok ( server_command. get_server_name ( ) )
1173
+ }
1174
+
1139
1175
/////// LSP ///////
1140
1176
1141
1177
fn initialize ( & self , params : & Value ) -> Result < Value > {
@@ -1147,23 +1183,12 @@ impl LanguageClient {
1147
1183
let has_snippet_support = has_snippet_support > 0 ;
1148
1184
let root = self . get ( |state| state. roots . get ( & language_id) . cloned ( ) . unwrap_or_default ( ) ) ?;
1149
1185
1150
- let initialization_options = self
1151
- . get_workspace_settings ( & root)
1152
- . map ( |s| s[ "initializationOptions" ] . clone ( ) )
1153
- . unwrap_or_else ( |err| {
1154
- warn ! ( "Failed to get initializationOptions: {}" , err) ;
1155
- json ! ( Value :: Null )
1156
- } ) ;
1157
- let initialization_options =
1158
- get_default_initialization_options ( & language_id) . combine ( & initialization_options) ;
1159
- let initialization_options = if initialization_options. is_null ( ) {
1160
- None
1161
- } else {
1162
- Some ( initialization_options)
1163
- } ;
1164
-
1165
1186
let trace = self . get ( |state| state. trace ) ?;
1166
1187
let preferred_markup_kind = self . get ( |state| state. preferred_markup_kind . clone ( ) ) ?;
1188
+ let initialization_options = self . get_server_initialization_options_for_language_id (
1189
+ root. as_str ( ) ,
1190
+ language_id. as_str ( ) ,
1191
+ ) ?;
1167
1192
1168
1193
let result: Value = self . get_client ( & Some ( language_id. clone ( ) ) ) ?. call (
1169
1194
lsp_types:: request:: Initialize :: METHOD ,
@@ -2923,7 +2948,7 @@ impl LanguageClient {
2923
2948
2924
2949
pub fn register_server_commands ( & self , params : & Value ) -> Result < Value > {
2925
2950
info ! ( "Begin {}" , REQUEST_REGISTER_SERVER_COMMANDS ) ;
2926
- let commands = HashMap :: < String , Vec < String > > :: deserialize ( params) ?;
2951
+ let commands = HashMap :: < String , ServerCommand > :: deserialize ( params) ?;
2927
2952
self . update ( |state| {
2928
2953
state. server_commands . extend ( commands) ;
2929
2954
Ok ( ( ) )
@@ -3892,6 +3917,7 @@ impl LanguageClient {
3892
3917
language_id : language_id. clone ( ) ,
3893
3918
} )
3894
3919
} ) ?;
3920
+ let command = command. get_command ( ) ;
3895
3921
3896
3922
let root_path: Option < String > = try_get ( "rootPath" , & params) ?;
3897
3923
let root = if let Some ( r) = root_path {
@@ -3995,16 +4021,6 @@ impl LanguageClient {
3995
4021
self . initialize ( & params) ?;
3996
4022
self . initialized ( & params) ?;
3997
4023
3998
- let root = self . get ( |state| state. roots . get ( & language_id) . cloned ( ) . unwrap_or_default ( ) ) ?;
3999
- match self . get_workspace_settings ( & root) {
4000
- Ok ( Value :: Null ) => ( ) ,
4001
- Ok ( settings) => self . workspace_did_change_configuration ( & json ! ( {
4002
- "languageId" : language_id,
4003
- "settings" : settings,
4004
- } ) ) ?,
4005
- Err ( err) => warn ! ( "Failed to get workspace settings: {}" , err) ,
4006
- }
4007
-
4008
4024
self . vim ( ) ?
4009
4025
. rpcclient
4010
4026
. notify ( "setbufvar" , json ! ( [ filename, VIM_IS_SERVER_RUNNING , 1 ] ) ) ?;
0 commit comments