@@ -94,6 +94,7 @@ internal LanguageServer(
94
94
services . AddLogging ( ) ;
95
95
_reciever = reciever ;
96
96
_serializer = serializer ;
97
+ _supportedCapabilities = new SupportedCapabilities ( ) ;
97
98
_collection = new HandlerCollection ( _supportedCapabilities ) ;
98
99
_initializeDelegates = initializeDelegates ;
99
100
_initializedDelegates = initializedDelegates ;
@@ -108,9 +109,13 @@ internal LanguageServer(
108
109
109
110
services . AddJsonRpcMediatR ( assemblies ) ;
110
111
services . AddTransient < IHandlerMatcher , TextDocumentMatcher > ( ) ;
112
+ services . AddSingleton < Protocol . Server . ILanguageServer > ( this ) ;
113
+ services . AddSingleton < ILanguageServer > ( this ) ;
111
114
services . AddTransient < IHandlerMatcher , ExecuteCommandMatcher > ( ) ;
112
115
services . AddTransient < IHandlerMatcher , ResolveCommandMatcher > ( ) ;
113
116
services . AddSingleton < ILspRequestRouter , LspRequestRouter > ( ) ;
117
+ services . AddSingleton < IRequestRouter > ( _ => _ . GetRequiredService < ILspRequestRouter > ( ) ) ;
118
+ services . AddSingleton < IReciever , LspReciever > ( ) ;
114
119
services . AddSingleton < IResponseRouter , ResponseRouter > ( ) ;
115
120
services . AddTransient ( typeof ( IPipelineBehavior < , > ) , typeof ( ResolveCommandPipeline < , > ) ) ;
116
121
@@ -206,8 +211,10 @@ private IDisposable RegisterHandlers(LspHandlerDescriptorDisposable handlerDispo
206
211
207
212
return new ImmutableDisposable (
208
213
handlerDisposable ,
209
- new Disposable ( ( ) => {
210
- Client . UnregisterCapability ( new UnregistrationParams ( ) {
214
+ new Disposable ( ( ) =>
215
+ {
216
+ Client . UnregisterCapability ( new UnregistrationParams ( )
217
+ {
211
218
Unregisterations = registrations . ToArray ( )
212
219
} ) . ToObservable ( ) . Subscribe ( ) ;
213
220
} ) ) ;
@@ -242,7 +249,8 @@ async Task<InitializeResult> IRequestHandler<InitializeParams, InitializeResult>
242
249
) ;
243
250
}
244
251
}
245
- _supportedCapabilities = new SupportedCapabilities ( supportedCapabilites ) ;
252
+
253
+ _supportedCapabilities . Add ( supportedCapabilites ) ;
246
254
247
255
await Task . WhenAll ( _initializeDelegates . Select ( c => c ( request ) ) ) ;
248
256
@@ -256,7 +264,8 @@ async Task<InitializeResult> IRequestHandler<InitializeParams, InitializeResult>
256
264
257
265
var ccp = new ClientCapabilityProvider ( _collection ) ;
258
266
259
- var serverCapabilities = new ServerCapabilities ( ) {
267
+ var serverCapabilities = new ServerCapabilities ( )
268
+ {
260
269
CodeActionProvider = ccp . HasStaticHandler ( textDocumentCapabilities . CodeAction ) ,
261
270
CodeLensProvider = ccp . GetStaticOptions ( textDocumentCapabilities . CodeLens ) . Get < ICodeLensOptions , CodeLensOptions > ( CodeLensOptions . Of ) ,
262
271
CompletionProvider = ccp . GetStaticOptions ( textDocumentCapabilities . Completion ) . Get < ICompletionOptions , CompletionOptions > ( CompletionOptions . Of ) ,
@@ -280,8 +289,10 @@ async Task<InitializeResult> IRequestHandler<InitializeParams, InitializeResult>
280
289
281
290
if ( _collection . ContainsHandler ( typeof ( IDidChangeWorkspaceFoldersHandler ) ) )
282
291
{
283
- serverCapabilities . Workspace = new WorkspaceServerCapabilities ( ) {
284
- WorkspaceFolders = new WorkspaceFolderOptions ( ) {
292
+ serverCapabilities . Workspace = new WorkspaceServerCapabilities ( )
293
+ {
294
+ WorkspaceFolders = new WorkspaceFolderOptions ( )
295
+ {
285
296
Supported = true ,
286
297
ChangeNotifications = Guid . NewGuid ( ) . ToString ( )
287
298
}
@@ -290,6 +301,7 @@ async Task<InitializeResult> IRequestHandler<InitializeParams, InitializeResult>
290
301
291
302
var textDocumentSyncKind = _collection . ContainsHandler ( typeof ( IDidChangeTextDocumentHandler ) )
292
303
? _collection
304
+ . Select ( x => x . Handler )
293
305
. OfType < IDidChangeTextDocumentHandler > ( )
294
306
. Where ( x => x . Change != TextDocumentSyncKind . None )
295
307
. Min ( z => z . Change )
@@ -301,7 +313,8 @@ async Task<InitializeResult> IRequestHandler<InitializeParams, InitializeResult>
301
313
}
302
314
else
303
315
{
304
- serverCapabilities . TextDocumentSync = new TextDocumentSyncOptions ( ) {
316
+ serverCapabilities . TextDocumentSync = new TextDocumentSyncOptions ( )
317
+ {
305
318
Change = textDocumentSyncKind ,
306
319
OpenClose = _collection . ContainsHandler ( typeof ( IDidOpenTextDocumentHandler ) ) || _collection . ContainsHandler ( typeof ( IDidCloseTextDocumentHandler ) ) ,
307
320
Save = _collection . ContainsHandler ( typeof ( IDidSaveTextDocumentHandler ) ) ?
@@ -315,11 +328,12 @@ async Task<InitializeResult> IRequestHandler<InitializeParams, InitializeResult>
315
328
// TODO: Need a call back here
316
329
// serverCapabilities.Experimental;
317
330
331
+ _reciever . Initialized ( ) ;
332
+
318
333
var result = ServerSettings = new InitializeResult ( ) { Capabilities = serverCapabilities } ;
319
334
320
335
await Task . WhenAll ( _initializedDelegates . Select ( c => c ( request , result ) ) ) ;
321
336
322
- _reciever . Initialized ( ) ;
323
337
324
338
// TODO:
325
339
if ( _clientVersion == ClientVersion . Lsp2 )
@@ -429,10 +443,17 @@ class SupportedCapabilities : ISupportedCapabilities
429
443
. GetTypeInfo ( )
430
444
. GetMethod ( nameof ( SetCapabilityInner ) , BindingFlags . NonPublic | BindingFlags . Static ) ;
431
445
432
- private readonly IDictionary < Type , object > _supports ;
433
- public SupportedCapabilities ( IEnumerable < ISupports > supports )
446
+ private readonly IDictionary < Type , object > _supports = new Dictionary < Type , object > ( ) ;
447
+ public SupportedCapabilities ( )
448
+ {
449
+ }
450
+
451
+ public void Add ( IEnumerable < ISupports > supports )
434
452
{
435
- _supports = supports . ToDictionary ( x => x . ValueType , x => x . Value ) ;
453
+ foreach ( var item in supports )
454
+ {
455
+ _supports . Add ( item . ValueType , item . Value ) ;
456
+ }
436
457
}
437
458
438
459
public bool AllowsDynamicRegistration ( ILspHandlerDescriptor descriptor )
0 commit comments