1
- use crate :: extensions:: java;
2
1
use crate :: language_client:: LanguageClient ;
3
2
use crate :: vim:: { try_get, Mode } ;
3
+ use crate :: { extensions:: java, vim:: Funcref } ;
4
4
use crate :: {
5
5
rpcclient:: RpcClient ,
6
6
types:: * ,
@@ -127,15 +127,15 @@ impl LanguageClient {
127
127
) : (
128
128
u64 ,
129
129
HashMap < String , Vec < String > > ,
130
- Option < String > ,
130
+ Option < Either < Funcref , String > > ,
131
131
Option < String > ,
132
132
Vec < String > ,
133
133
u64 ,
134
134
Option < RootMarkers > ,
135
135
Option < f64 > ,
136
136
Option < f64 > ,
137
137
u64 ,
138
- Option < String > ,
138
+ Option < Either < Funcref , String > > ,
139
139
Value ,
140
140
String ,
141
141
Option < String > ,
@@ -145,15 +145,15 @@ impl LanguageClient {
145
145
[
146
146
"!!get(g:, 'LanguageClient_autoStart', 1)" ,
147
147
"s:GetVar('LanguageClient_serverCommands', {})" ,
148
- "s:getSelectionUI( )" ,
148
+ "s:getStringOrFuncref('LanguageClient_selectionUI', v:null )" ,
149
149
"get(g:, 'LanguageClient_trace', v:null)" ,
150
150
"map(s:ToList(get(g:, 'LanguageClient_settingsPath', '.vim/settings.json')), 'expand(v:val)')" ,
151
151
"!!get(g:, 'LanguageClient_loadSettings', 1)" ,
152
152
"get(g:, 'LanguageClient_rootMarkers', v:null)" ,
153
153
"get(g:, 'LanguageClient_changeThrottle', v:null)" ,
154
154
"get(g:, 'LanguageClient_waitOutputTimeout', v:null)" ,
155
155
"!!get(g:, 'LanguageClient_diagnosticsEnable', 1)" ,
156
- "get(g:, 'LanguageClient_diagnosticsList', 'Quickfix')" ,
156
+ "s:getStringOrFuncref( 'LanguageClient_diagnosticsList', 'Quickfix')" ,
157
157
"get(g:, 'LanguageClient_diagnosticsDisplay', {})" ,
158
158
"get(g:, 'LanguageClient_windowLogMessageLevel', 'Warning')" ,
159
159
"get(g:, 'LanguageClient_hoverPreview', 'Auto')" ,
@@ -165,7 +165,6 @@ impl LanguageClient {
165
165
166
166
#[ allow( clippy:: type_complexity) ]
167
167
let (
168
- diagnostics_display_funcref,
169
168
diagnostics_signs_max,
170
169
diagnostics_max_severity,
171
170
diagnostics_ignore_sources,
@@ -181,7 +180,6 @@ impl LanguageClient {
181
180
enable_extensions,
182
181
code_lens_hl_group,
183
182
) : (
184
- Option < String > ,
185
183
Option < usize > ,
186
184
String ,
187
185
Vec < String > ,
@@ -198,7 +196,6 @@ impl LanguageClient {
198
196
String ,
199
197
) = self . vim ( ) ?. eval (
200
198
[
201
- "get(g:, 'LanguageClient_diagnosticsDisplayFuncref', v:null)" ,
202
199
"get(g:, 'LanguageClient_diagnosticsSignsMax', v:null)" ,
203
200
"get(g:, 'LanguageClient_diagnosticsMaxSeverity', 'Hint')" ,
204
201
"get(g:, 'LanguageClient_diagnosticsIgnoreSources', [])" ,
@@ -232,12 +229,12 @@ impl LanguageClient {
232
229
None => Some ( TraceOption :: default ( ) ) ,
233
230
} ;
234
231
235
- let selection_ui = if let Some ( s ) = selection_ui {
236
- SelectionUI :: from_str ( & s) ?
237
- } else if self . vim ( ) ? . eval :: < _ , i64 > ( "get(g:, 'loaded_fzf')" ) ? == 1 {
238
- SelectionUI :: Funcref
232
+ let selection_ui = if let Some ( Either :: Right ( s ) ) = selection_ui {
233
+ Either :: Right ( SelectionUI :: from_str ( & s) ?)
234
+ } else if let Some ( Either :: Left ( s ) ) = selection_ui {
235
+ Either :: Left ( s )
239
236
} else {
240
- SelectionUI :: default ( )
237
+ Either :: Right ( SelectionUI :: default ( ) )
241
238
} ;
242
239
243
240
let change_throttle = change_throttle. map ( |t| Duration :: from_millis ( ( t * 1000.0 ) as u64 ) ) ;
@@ -246,10 +243,12 @@ impl LanguageClient {
246
243
247
244
let diagnostics_enable = diagnostics_enable == 1 ;
248
245
249
- let diagnostics_list = if let Some ( s) = diagnostics_list {
250
- DiagnosticsList :: from_str ( & s) ?
246
+ let diagnostics_list = if let Some ( Either :: Right ( s) ) = diagnostics_list {
247
+ Either :: Right ( DiagnosticsList :: from_str ( & s) ?)
248
+ } else if let Some ( Either :: Left ( s) ) = diagnostics_list {
249
+ Either :: Left ( s)
251
250
} else {
252
- DiagnosticsList :: Disabled
251
+ Either :: Right ( DiagnosticsList :: Disabled )
253
252
} ;
254
253
255
254
let window_log_level = match window_log_message_level. to_ascii_uppercase ( ) . as_str ( ) {
@@ -331,7 +330,6 @@ impl LanguageClient {
331
330
state. preferred_markup_kind = preferred_markup_kind;
332
331
state. enable_extensions = enable_extensions;
333
332
state. code_lens_hl_group = code_lens_hl_group;
334
- state. diagnostics_display_funcref = diagnostics_display_funcref;
335
333
336
334
Ok ( ( ) )
337
335
} ) ?;
@@ -686,15 +684,18 @@ impl LanguageClient {
686
684
. collect ( ) ;
687
685
688
686
let title = "[LC]: diagnostics" ;
689
- let diagnostics_list = self . get ( |state| state. diagnostics_list ) ?;
687
+ let diagnostics_list = self . get ( |state| state. diagnostics_list . clone ( ) ) ?;
690
688
match diagnostics_list {
691
- DiagnosticsList :: Quickfix => {
692
- self . vim ( ) ?. setqflist ( & qflist, "r" , title) ?;
693
- }
694
- DiagnosticsList :: Location => {
695
- self . vim ( ) ?. setloclist ( & qflist, "r" , title) ?;
696
- }
697
- DiagnosticsList :: Disabled => { }
689
+ Either :: Left ( _) => { }
690
+ Either :: Right ( dl) => match dl {
691
+ DiagnosticsList :: Quickfix => {
692
+ self . vim ( ) ?. setqflist ( & qflist, "r" , title) ?;
693
+ }
694
+ DiagnosticsList :: Location => {
695
+ self . vim ( ) ?. setloclist ( & qflist, "r" , title) ?;
696
+ }
697
+ DiagnosticsList :: Disabled => { }
698
+ } ,
698
699
}
699
700
700
701
Ok ( ( ) )
@@ -1890,14 +1891,21 @@ impl LanguageClient {
1890
1891
. map ( |it| ListItem :: string_item ( it, self , & cwd) )
1891
1892
. collect ( ) ;
1892
1893
1893
- match self . get ( |state| state. selection_ui ) ? {
1894
- SelectionUI :: Funcref => {
1894
+ match self . get ( |state| state. selection_ui . clone ( ) ) ? {
1895
+ Either :: Left ( f) => {
1896
+ self . vim ( ) ?
1897
+ . rpcclient
1898
+ . notify ( f, json ! ( [ actions?, NOTIFICATION_FZF_SINK_COMMAND ] ) ) ?;
1899
+ }
1900
+ // this exists purely for compatibility purposes, we should consider dropping this at
1901
+ // some point and letting the user set up the FZF integration via a funcref
1902
+ Either :: Right ( SelectionUI :: FZF ) => {
1895
1903
self . vim ( ) ?. rpcclient . notify (
1896
1904
"s:selectionUI_funcref" ,
1897
1905
json ! ( [ actions?, NOTIFICATION_FZF_SINK_COMMAND ] ) ,
1898
1906
) ?;
1899
1907
}
1900
- SelectionUI :: Quickfix | SelectionUI :: LocationList => {
1908
+ Either :: Right ( SelectionUI :: Quickfix ) | Either :: Right ( SelectionUI :: LocationList ) => {
1901
1909
let mut actions: Vec < String > = actions?
1902
1910
. iter_mut ( )
1903
1911
. enumerate ( )
@@ -1922,11 +1930,25 @@ impl LanguageClient {
1922
1930
where
1923
1931
T : ListItem ,
1924
1932
{
1925
- let selection_ui = self . get ( |state| state. selection_ui ) ?;
1933
+ let selection_ui = self . get ( |state| state. selection_ui . clone ( ) ) ?;
1926
1934
let selection_ui_auto_open = self . get ( |state| state. selection_ui_auto_open ) ?;
1927
1935
1928
1936
match selection_ui {
1929
- SelectionUI :: Funcref => {
1937
+ Either :: Left ( f) => {
1938
+ let cwd: String = self . vim ( ) ?. eval ( "getcwd()" ) ?;
1939
+ let source: Result < Vec < _ > > = items
1940
+ . iter ( )
1941
+ . map ( |it| ListItem :: string_item ( it, self , & cwd) )
1942
+ . collect ( ) ;
1943
+ let source = source?;
1944
+
1945
+ self . vim ( ) ?
1946
+ . rpcclient
1947
+ . notify ( f, json ! ( [ source, NOTIFICATION_FZF_SINK_LOCATION ] ) ) ?;
1948
+ }
1949
+ // this exists purely for compatibility purposes, we should consider dropping this at
1950
+ // some point and letting the user set up the FZF integration via a funcref
1951
+ Either :: Right ( SelectionUI :: FZF ) => {
1930
1952
let cwd: String = self . vim ( ) ?. eval ( "getcwd()" ) ?;
1931
1953
let source: Result < Vec < _ > > = items
1932
1954
. iter ( )
@@ -1936,10 +1958,10 @@ impl LanguageClient {
1936
1958
1937
1959
self . vim ( ) ?. rpcclient . notify (
1938
1960
"s:selectionUI_funcref" ,
1939
- json ! ( [ source, format! ( "s:{}" , NOTIFICATION_FZF_SINK_LOCATION ) ] ) ,
1961
+ json ! ( [ source, NOTIFICATION_FZF_SINK_LOCATION ] ) ,
1940
1962
) ?;
1941
1963
}
1942
- SelectionUI :: Quickfix => {
1964
+ Either :: Right ( SelectionUI :: Quickfix ) => {
1943
1965
let list: Result < Vec < _ > > = items
1944
1966
. iter ( )
1945
1967
. map ( |it| ListItem :: quickfix_item ( it, self ) )
@@ -1951,7 +1973,7 @@ impl LanguageClient {
1951
1973
}
1952
1974
self . vim ( ) ?. echo ( "Populated quickfix list." ) ?;
1953
1975
}
1954
- SelectionUI :: LocationList => {
1976
+ Either :: Right ( SelectionUI :: LocationList ) => {
1955
1977
let list: Result < Vec < _ > > = items
1956
1978
. iter ( )
1957
1979
. map ( |it| ListItem :: quickfix_item ( it, self ) )
@@ -2476,7 +2498,7 @@ impl LanguageClient {
2476
2498
}
2477
2499
2478
2500
// if a diagnostics display funcref has been configured then call that function and return
2479
- if let Some ( funcref) = self . get ( |state| state. diagnostics_display_funcref . clone ( ) ) ? {
2501
+ if let Either :: Left ( funcref) = self . get ( |state| state. diagnostics_list . clone ( ) ) ? {
2480
2502
self . vim ( ) ?
2481
2503
. rpcclient
2482
2504
. notify ( funcref, json ! ( [ filename, diagnostics] ) ) ?;
0 commit comments