Skip to content

Commit 507173c

Browse files
Added helpers to get handlers out of the collection
1 parent 1560138 commit 507173c

File tree

1 file changed

+40
-5
lines changed

1 file changed

+40
-5
lines changed

src/Server/LanguageServer.cs

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ public class LanguageServer : ILanguageServer, IInitializeHandler, IInitializedH
134134
private readonly IResponseRouter _responseRouter;
135135
private readonly TaskCompletionSource<InitializeResult> _initializeComplete = new TaskCompletionSource<InitializeResult>();
136136
private readonly CompositeDisposable _disposable = new CompositeDisposable();
137+
private readonly ServiceProvider _serviceProvider;
137138

138139
public static ILanguageServer From(Action<LanguageServerOptions> optionsAction)
139140
{
@@ -195,16 +196,34 @@ internal LanguageServer(
195196
services.AddSingleton<IResponseRouter, ResponseRouter>();
196197
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ResolveCommandPipeline<,>));
197198

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);
199207

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);
203221

204222
_exitHandler = new ExitHandler(_shutdownHandler);
205223

206224
_disposable.Add(
207-
AddHandlers(this, _shutdownHandler, _exitHandler, new CancelRequestHandler(_requestRouter))
225+
AddHandlers(this, _shutdownHandler, _exitHandler, new CancelRequestHandler(_requestRouter)),
226+
AddHandlers(_serviceProvider.GetServices<IJsonRpcHandler>())
208227
);
209228
}
210229

@@ -240,11 +259,27 @@ public IDisposable AddHandler(IJsonRpcHandler handler)
240259
return AddHandlers(handler);
241260
}
242261

262+
public IDisposable AddHandler<T>()
263+
where T : IJsonRpcHandler
264+
{
265+
return AddHandlers(ActivatorUtilities.CreateInstance<T>(_serviceProvider));
266+
}
267+
243268
public IDisposable AddHandlers(IEnumerable<IJsonRpcHandler> handlers)
244269
{
245270
return AddHandlers(handlers.ToArray());
246271
}
247272

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+
248283
public IDisposable AddHandlers(params IJsonRpcHandler[] handlers)
249284
{
250285
var handlerDisposable = _collection.Add(handlers);

0 commit comments

Comments
 (0)