@@ -15,7 +15,9 @@ import {
15
15
NotificationHandler ,
16
16
ProtocolConnection ,
17
17
PublishDiagnosticsParams ,
18
+ Registration ,
18
19
SymbolInformation ,
20
+ UnregistrationRequest ,
19
21
WorkspaceFolder ,
20
22
} from 'vscode-languageserver'
21
23
import type { Position } from 'vscode-languageserver-textdocument'
@@ -191,6 +193,16 @@ export interface Client extends ClientWorkspace {
191
193
*/
192
194
readonly conn : ProtocolConnection
193
195
196
+ /**
197
+ * Get the currently registered server capabilities
198
+ */
199
+ serverCapabilities : Registration [ ]
200
+
201
+ /**
202
+ * Get the currently registered server capabilities
203
+ */
204
+ onServerCapabilitiesChanged ( cb : ( ) => void ) : void
205
+
194
206
/**
195
207
* Get a workspace by name
196
208
*/
@@ -428,12 +440,40 @@ export async function createClient(opts: ClientOptions): Promise<Client> {
428
440
} )
429
441
}
430
442
443
+ let serverCapabilityChangeCallbacks : ( ( ) => void ) [ ] = [ ]
444
+
445
+ function onServerCapabilitiesChanged ( cb : ( ) => void ) {
446
+ serverCapabilityChangeCallbacks . push ( cb )
447
+ }
448
+
449
+ let registeredCapabilities : Registration [ ] = [ ]
450
+
431
451
conn . onRequest ( RegistrationRequest . type , ( { registrations } ) => {
432
452
trace ( 'Registering capabilities' )
433
453
434
454
for ( let registration of registrations ) {
455
+ registeredCapabilities . push ( registration )
435
456
trace ( '-' , registration . method )
436
457
}
458
+
459
+ for ( let cb of serverCapabilityChangeCallbacks ) cb ( )
460
+ } )
461
+
462
+ conn . onRequest ( UnregistrationRequest . type , ( { unregisterations } ) => {
463
+ trace ( 'Unregistering capabilities' )
464
+
465
+ let idsToRemove = new Set < string > ( )
466
+
467
+ for ( let registration of unregisterations ) {
468
+ idsToRemove . add ( registration . id )
469
+ trace ( '-' , registration . method )
470
+ }
471
+
472
+ registeredCapabilities = registeredCapabilities . filter (
473
+ ( capability ) => ! idsToRemove . has ( capability . id ) ,
474
+ )
475
+
476
+ for ( let cb of serverCapabilityChangeCallbacks ) cb ( )
437
477
} )
438
478
439
479
// TODO: Remove this its a hack
@@ -495,6 +535,10 @@ export async function createClient(opts: ClientOptions): Promise<Client> {
495
535
496
536
return {
497
537
...clientWorkspaces [ 0 ] ,
538
+ get serverCapabilities ( ) {
539
+ return registeredCapabilities
540
+ } ,
541
+ onServerCapabilitiesChanged,
498
542
workspace,
499
543
updateSettings,
500
544
}
0 commit comments