@@ -134,6 +134,7 @@ public class LanguageServer : ILanguageServer, IInitializeHandler, IInitializedH
134
134
private readonly IResponseRouter _responseRouter ;
135
135
private readonly TaskCompletionSource < InitializeResult > _initializeComplete = new TaskCompletionSource < InitializeResult > ( ) ;
136
136
private readonly CompositeDisposable _disposable = new CompositeDisposable ( ) ;
137
+ private readonly ServiceProvider _serviceProvider ;
137
138
138
139
public static ILanguageServer From ( Action < LanguageServerOptions > optionsAction )
139
140
{
@@ -195,16 +196,34 @@ internal LanguageServer(
195
196
services . AddSingleton < IResponseRouter , ResponseRouter > ( ) ;
196
197
services . AddTransient ( typeof ( IPipelineBehavior < , > ) , typeof ( ResolveCommandPipeline < , > ) ) ;
197
198
198
- var serviceProvider = services . BuildServiceProvider ( ) ;
199
+ var foundHandlers = services
200
+ . Where ( x => typeof ( IJsonRpcHandler ) . IsAssignableFrom ( x . ServiceType ) && x . ServiceType != typeof ( IJsonRpcHandler ) )
201
+ . ToArray ( ) ;
202
+
203
+ // Handlers are created at the start and maintained as a singleton
204
+ foreach ( var handler in foundHandlers )
205
+ {
206
+ services . Remove ( handler ) ;
199
207
200
- _requestRouter = serviceProvider . GetRequiredService < ILspRequestRouter > ( ) ;
201
- _responseRouter = serviceProvider . GetRequiredService < IResponseRouter > ( ) ;
202
- _connection = ActivatorUtilities . CreateInstance < Connection > ( serviceProvider , input ) ;
208
+ if ( handler . ImplementationFactory != null )
209
+ services . Add ( ServiceDescriptor . Singleton ( typeof ( IJsonRpcHandler ) , handler . ImplementationFactory ) ) ;
210
+ else if ( handler . ImplementationInstance != null )
211
+ services . Add ( ServiceDescriptor . Singleton ( typeof ( IJsonRpcHandler ) , handler . ImplementationInstance ) ) ;
212
+ else
213
+ services . Add ( ServiceDescriptor . Singleton ( typeof ( IJsonRpcHandler ) , handler . ImplementationType ) ) ;
214
+ }
215
+
216
+ _serviceProvider = services . BuildServiceProvider ( ) ;
217
+
218
+ _requestRouter = _serviceProvider . GetRequiredService < ILspRequestRouter > ( ) ;
219
+ _responseRouter = _serviceProvider . GetRequiredService < IResponseRouter > ( ) ;
220
+ _connection = ActivatorUtilities . CreateInstance < Connection > ( _serviceProvider , input ) ;
203
221
204
222
_exitHandler = new ExitHandler ( _shutdownHandler ) ;
205
223
206
224
_disposable . Add (
207
- AddHandlers ( this , _shutdownHandler , _exitHandler , new CancelRequestHandler ( _requestRouter ) )
225
+ AddHandlers ( this , _shutdownHandler , _exitHandler , new CancelRequestHandler ( _requestRouter ) ) ,
226
+ AddHandlers ( _serviceProvider . GetServices < IJsonRpcHandler > ( ) )
208
227
) ;
209
228
}
210
229
@@ -240,11 +259,27 @@ public IDisposable AddHandler(IJsonRpcHandler handler)
240
259
return AddHandlers ( handler ) ;
241
260
}
242
261
262
+ public IDisposable AddHandler < T > ( )
263
+ where T : IJsonRpcHandler
264
+ {
265
+ return AddHandlers ( ActivatorUtilities . CreateInstance < T > ( _serviceProvider ) ) ;
266
+ }
267
+
243
268
public IDisposable AddHandlers ( IEnumerable < IJsonRpcHandler > handlers )
244
269
{
245
270
return AddHandlers ( handlers . ToArray ( ) ) ;
246
271
}
247
272
273
+ public IDisposable AddHandlers ( IEnumerable < Type > handlers )
274
+ {
275
+ return AddHandlers ( handlers . Select ( x => ActivatorUtilities . CreateInstance ( _serviceProvider , x ) as IJsonRpcHandler ) . ToArray ( ) ) ;
276
+ }
277
+
278
+ public IDisposable AddHandlers ( params Type [ ] handlers )
279
+ {
280
+ return AddHandlers ( handlers . Select ( x => ActivatorUtilities . CreateInstance ( _serviceProvider , x ) as IJsonRpcHandler ) . ToArray ( ) ) ;
281
+ }
282
+
248
283
public IDisposable AddHandlers ( params IJsonRpcHandler [ ] handlers )
249
284
{
250
285
var handlerDisposable = _collection . Add ( handlers ) ;
0 commit comments