5
5
using System . Reactive . Linq ;
6
6
using System . Reactive . Subjects ;
7
7
using System . Reactive . Threading . Tasks ;
8
+ using System . Reflection ;
8
9
using System . Threading ;
9
10
using System . Threading . Tasks ;
10
11
using DryIoc ;
@@ -42,6 +43,7 @@ public class LanguageClient : JsonRpcServerBase, ILanguageClient
42
43
private readonly IEnumerable < IOnLanguageClientInitialize > _initializeHandlers ;
43
44
private readonly IEnumerable < OnLanguageClientInitializedDelegate > _initializedDelegates ;
44
45
private readonly IEnumerable < IOnLanguageClientInitialized > _initializedHandlers ;
46
+ private readonly ISerializer _serializer ;
45
47
private readonly IResponseRouter _responseRouter ;
46
48
private readonly ISubject < InitializeResult > _initializeComplete = new AsyncSubject < InitializeResult > ( ) ;
47
49
private readonly CompositeDisposable _disposable = new CompositeDisposable ( ) ;
@@ -140,7 +142,8 @@ internal LanguageClient(
140
142
IRegistrationManager registrationManager ,
141
143
ILanguageClientWorkspaceFoldersManager languageClientWorkspaceFoldersManager , IEnumerable < OnLanguageClientInitializeDelegate > initializeDelegates ,
142
144
IEnumerable < IOnLanguageClientInitialize > initializeHandlers , IEnumerable < OnLanguageClientInitializedDelegate > initializedDelegates ,
143
- IEnumerable < IOnLanguageClientInitialized > initializedHandlers
145
+ IEnumerable < IOnLanguageClientInitialized > initializedHandlers ,
146
+ ISerializer serializer
144
147
) : base ( handlerCollection , responseRouter )
145
148
{
146
149
_connection = connection ;
@@ -167,6 +170,7 @@ IEnumerable<IOnLanguageClientInitialized> initializedHandlers
167
170
_initializeHandlers = initializeHandlers ;
168
171
_initializedDelegates = initializedDelegates ;
169
172
_initializedHandlers = initializedHandlers ;
173
+ _serializer = serializer ;
170
174
_concurrency = options . Value . Concurrency ;
171
175
172
176
// We need to at least create Window here in case any handler does loggin in their constructor
@@ -205,15 +209,43 @@ public async Task Initialize(CancellationToken token)
205
209
{
206
210
var @params = new InitializeParams {
207
211
Trace = _trace ,
208
- Capabilities = _clientCapabilities ,
209
212
ClientInfo = _clientInfo ,
213
+ Capabilities = _clientCapabilities ,
210
214
RootUri = _rootUri ,
211
215
RootPath = _rootUri ? . GetFileSystemPath ( ) ,
212
216
WorkspaceFolders = new Container < WorkspaceFolder > ( WorkspaceFoldersManager . CurrentWorkspaceFolders ) ,
213
217
InitializationOptions = _initializationOptions
214
218
} ;
215
219
216
- RegisterCapabilities ( @params . Capabilities ) ;
220
+ var capabilitiesObject = new JObject ( ) ;
221
+ foreach ( var capability in _capabilities )
222
+ {
223
+ var keys = capability . GetType ( ) . GetCustomAttribute < CapabilityKeyAttribute > ( ) ? . Keys . Select ( key => char . ToLower ( key [ 0 ] ) + key . Substring ( 1 ) ) . ToArray ( ) ;
224
+ if ( keys != null )
225
+ {
226
+ var value = capabilitiesObject ;
227
+ foreach ( var key in keys . Take ( keys . Length - 1 ) )
228
+ {
229
+ if ( value . TryGetValue ( key , out var t ) && t is JObject to )
230
+ {
231
+ value = to ;
232
+ }
233
+ else
234
+ {
235
+ value [ key ] = value = new JObject ( ) ;
236
+ }
237
+ }
238
+ var lastKey = keys [ keys . Length - 1 ] ;
239
+ value [ lastKey ] = JToken . FromObject ( capability , _serializer . JsonSerializer ) ;
240
+ }
241
+ }
242
+
243
+ using ( var reader = capabilitiesObject . CreateReader ( ) )
244
+ {
245
+ _serializer . JsonSerializer . Populate ( reader , _clientCapabilities ) ;
246
+ }
247
+
248
+ RegisterCapabilities ( _clientCapabilities ) ;
217
249
218
250
WorkDoneManager . Initialize ( @params . Capabilities . Window ) ;
219
251
@@ -229,7 +261,7 @@ await LanguageProtocolEventingHelper.Run(
229
261
) ;
230
262
231
263
_connection . Open ( ) ;
232
- var serverParams = await this . RequestLanguageProtocolInitialize ( ClientSettings , token ) ;
264
+ var serverParams = await SendRequest ( ClientSettings , token ) ;
233
265
_receiver . Initialized ( ) ;
234
266
235
267
ServerSettings = serverParams ;
@@ -334,17 +366,17 @@ public async Task Shutdown()
334
366
_connection . Dispose ( ) ;
335
367
}
336
368
337
- private T UseOrTryAndFindCapability < T > ( Supports < T > supports )
369
+ private Supports < T > UseOrTryAndFindCapability < T > ( Supports < T > supports ) where T : class
338
370
{
339
371
var value = supports . IsSupported
340
372
? supports . Value
341
- : _capabilities . OfType < T > ( ) . FirstOrDefault ( ) ?? Activator . CreateInstance < T > ( ) ;
373
+ : _capabilities . OfType < T > ( ) . FirstOrDefault ( ) ;
342
374
if ( value is IDynamicCapability dynamicCapability )
343
375
{
344
376
dynamicCapability . DynamicRegistration = _collection . ContainsHandler ( typeof ( IRegisterCapabilityHandler ) ) ;
345
377
}
346
378
347
- return value ;
379
+ return Supports . OfValue ( value ) ;
348
380
}
349
381
350
382
public IObservable < InitializeResult > Start => _initializeComplete . AsObservable ( ) ;
0 commit comments