21
21
using OmniSharp . Extensions . LanguageServer . Protocol . General ;
22
22
using OmniSharp . Extensions . LanguageServer . Protocol . Models ;
23
23
using OmniSharp . Extensions . LanguageServer . Protocol . Progress ;
24
- using OmniSharp . Extensions . LanguageServer . Protocol . Shared ;
25
24
using OmniSharp . Extensions . LanguageServer . Protocol . Workspace ;
26
25
using OmniSharp . Extensions . LanguageServer . Shared ;
27
26
@@ -45,6 +44,7 @@ public class LanguageClient : JsonRpcServerBase, ILanguageClient
45
44
private readonly IEnumerable < OnLanguageClientInitializedDelegate > _initializedDelegates ;
46
45
private readonly IEnumerable < IOnLanguageClientInitialized > _initializedHandlers ;
47
46
private readonly ISerializer _serializer ;
47
+ private readonly InstanceHasStarted _instanceHasStarted ;
48
48
private readonly IResponseRouter _responseRouter ;
49
49
private readonly ISubject < InitializeResult > _initializeComplete = new AsyncSubject < InitializeResult > ( ) ;
50
50
private readonly CompositeDisposable _disposable = new CompositeDisposable ( ) ;
@@ -56,8 +56,8 @@ public class LanguageClient : JsonRpcServerBase, ILanguageClient
56
56
private readonly InitializeTrace _trace ;
57
57
private readonly ClientCapabilities _clientCapabilities ;
58
58
private readonly LanguageProtocolSettingsBag _settingsBag ;
59
- private bool _started ;
60
59
private readonly int ? _concurrency ;
60
+ private readonly IResolverContext _resolverContext ;
61
61
62
62
internal static IContainer CreateContainer ( LanguageClientOptions options , IServiceProvider outerServiceProvider ) =>
63
63
JsonRpcServerContainer . Create ( outerServiceProvider )
@@ -127,7 +127,7 @@ internal LanguageClient(
127
127
ClientCapabilities clientCapabilities ,
128
128
ILspClientReceiver lspClientReceiver ,
129
129
TextDocumentIdentifiers textDocumentIdentifiers ,
130
- IServiceProvider serviceProvider ,
130
+ IResolverContext resolverContext ,
131
131
IEnumerable < OnLanguageClientStartedDelegate > startedDelegates ,
132
132
IEnumerable < IOnLanguageClientStarted > startedHandlers ,
133
133
ITextDocumentLanguageClient textDocumentLanguageClient ,
@@ -144,7 +144,8 @@ internal LanguageClient(
144
144
ILanguageClientWorkspaceFoldersManager languageClientWorkspaceFoldersManager , IEnumerable < OnLanguageClientInitializeDelegate > initializeDelegates ,
145
145
IEnumerable < IOnLanguageClientInitialize > initializeHandlers , IEnumerable < OnLanguageClientInitializedDelegate > initializedDelegates ,
146
146
IEnumerable < IOnLanguageClientInitialized > initializedHandlers ,
147
- ISerializer serializer
147
+ ISerializer serializer ,
148
+ InstanceHasStarted instanceHasStarted
148
149
) : base ( handlerCollection , responseRouter )
149
150
{
150
151
_connection = connection ;
@@ -160,7 +161,7 @@ ISerializer serializer
160
161
_initializationOptions = options . Value . InitializationOptions ;
161
162
_settingsBag = languageProtocolSettingsBag ;
162
163
_collection = handlerCollection ;
163
- Services = serviceProvider ;
164
+ Services = _resolverContext = resolverContext ;
164
165
165
166
_responseRouter = responseRouter ;
166
167
ProgressManager = progressManager ;
@@ -172,6 +173,7 @@ ISerializer serializer
172
173
_initializedDelegates = initializedDelegates ;
173
174
_initializedHandlers = initializedHandlers ;
174
175
_serializer = serializer ;
176
+ _instanceHasStarted = instanceHasStarted ;
175
177
_concurrency = options . Value . Concurrency ;
176
178
177
179
// We need to at least create Window here in case any handler does loggin in their constructor
@@ -290,7 +292,7 @@ await LanguageProtocolEventingHelper.Run(
290
292
token
291
293
) ;
292
294
293
- _started = true ;
295
+ _instanceHasStarted . Started = true ;
294
296
295
297
// TODO: pull supported fields and add any static registrations to the registration manager
296
298
this . SendLanguageProtocolInitialized ( new InitializedParams ( ) ) ;
@@ -397,39 +399,11 @@ public void Dispose()
397
399
public IDisposable Register ( Action < ILanguageClientRegistry > registryAction )
398
400
{
399
401
var manager = new CompositeHandlersManager ( _collection ) ;
400
- registryAction ( new LangaugeClientRegistry ( Services , manager , _textDocumentIdentifiers ) ) ;
402
+ registryAction ( new LangaugeClientRegistry ( _resolverContext , manager , _textDocumentIdentifiers ) ) ;
401
403
var result = manager . GetDisposable ( ) ;
402
- if ( _started )
404
+ if ( _instanceHasStarted . Started )
403
405
{
404
- static IEnumerable < T > GetUniqueHandlers < T > ( CompositeDisposable disposable )
405
- {
406
- return disposable . OfType < ILspHandlerDescriptor > ( )
407
- . Select ( z => z . Handler )
408
- . OfType < T > ( )
409
- . Concat ( disposable . OfType < CompositeDisposable > ( ) . SelectMany ( GetUniqueHandlers < T > ) )
410
- . Concat ( disposable . OfType < LspHandlerDescriptorDisposable > ( ) . SelectMany ( GetLspHandlers < T > ) )
411
- . Distinct ( ) ;
412
- }
413
-
414
- static IEnumerable < T > GetLspHandlers < T > ( LspHandlerDescriptorDisposable disposable )
415
- {
416
- return disposable . Descriptors
417
- . Select ( z => z . Handler )
418
- . OfType < T > ( )
419
- . Distinct ( ) ;
420
- }
421
-
422
- Observable . Concat (
423
- GetUniqueHandlers < IOnLanguageClientInitialize > ( result )
424
- . Select ( handler => Observable . FromAsync ( ct => handler . OnInitialize ( this , ClientSettings , ct ) ) )
425
- . Merge ( ) ,
426
- GetUniqueHandlers < IOnLanguageClientInitialized > ( result )
427
- . Select ( handler => Observable . FromAsync ( ct => handler . OnInitialized ( this , ClientSettings , ServerSettings , ct ) ) )
428
- . Merge ( ) ,
429
- GetUniqueHandlers < IOnLanguageClientStarted > ( result )
430
- . Select ( handler => Observable . FromAsync ( ct => handler . OnStarted ( this , ct ) ) )
431
- . Merge ( )
432
- ) . Subscribe ( ) ;
406
+ LanguageClientHelpers . InitHandlers ( this , result ) ;
433
407
}
434
408
435
409
return result ;
0 commit comments