Skip to content

Commit f9df503

Browse files
Added ability to add many handlers
1 parent 7d02563 commit f9df503

File tree

3 files changed

+57
-49
lines changed

3 files changed

+57
-49
lines changed

src/Lsp/Abstractions/IHandlerCollection.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@ namespace OmniSharp.Extensions.LanguageServer.Abstractions
66
{
77
interface IHandlerCollection : IEnumerable<ILspHandlerDescriptor>
88
{
9-
IDisposable Add(IJsonRpcHandler handler);
10-
11-
IEnumerable<ILspHandlerDescriptor> Get(string method);
12-
IEnumerable<ILspHandlerDescriptor> Get(IJsonRpcHandler handler);
9+
IDisposable Add(params IJsonRpcHandler[] handlers);
10+
IDisposable Add(IEnumerable<IJsonRpcHandler> handlers);
1311
}
14-
}
12+
}

src/Lsp/HandlerCollection.cs

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -22,49 +22,45 @@ IEnumerator IEnumerable.GetEnumerator()
2222
return GetEnumerator();
2323
}
2424

25-
public IDisposable Add(IJsonRpcHandler handler)
25+
public IDisposable Add(params IJsonRpcHandler[] handlers)
2626
{
27-
//var type = handler.GetType();
27+
return Add(handlers.AsEnumerable());
28+
}
2829

29-
var handlers = new List<HandlerDescriptor>();
30-
foreach (var implementedInterface in handler.GetType().GetTypeInfo()
31-
.ImplementedInterfaces
32-
.Where(x => !string.IsNullOrWhiteSpace(LspHelper.GetMethodName(x))))
30+
public IDisposable Add(IEnumerable<IJsonRpcHandler> handlers)
31+
{
32+
var descriptors = new List<HandlerDescriptor>();
33+
foreach (var handler in handlers)
3334
{
34-
var @interface = GetHandlerInterface(implementedInterface);
35-
if (@interface == null) continue;
36-
var registration = UnwrapGenericType(typeof(IRegistration<>), implementedInterface);
37-
var capability = UnwrapGenericType(typeof(ICapability<>), implementedInterface);
38-
39-
Type @params = null;
40-
if (@interface.GetTypeInfo().IsGenericType)
35+
foreach (var implementedInterface in handler.GetType().GetTypeInfo()
36+
.ImplementedInterfaces
37+
.Where(x => !string.IsNullOrWhiteSpace(LspHelper.GetMethodName(x))))
4138
{
42-
@params = @interface.GetTypeInfo().GetGenericArguments()[0];
43-
}
39+
var @interface = GetHandlerInterface(implementedInterface);
40+
var registration = UnwrapGenericType(typeof(IRegistration<>), implementedInterface);
41+
var capability = UnwrapGenericType(typeof(ICapability<>), implementedInterface);
4442

45-
var h = new HandlerDescriptor(
46-
LspHelper.GetMethodName(implementedInterface),
47-
handler,
48-
@interface,
49-
@params,
50-
registration,
51-
capability,
52-
() => _handlers.RemoveWhere(instance => instance.Handler == handler));
43+
Type @params = null;
44+
if (@interface.GetTypeInfo().IsGenericType)
45+
{
46+
@params = @interface.GetTypeInfo().GetGenericArguments()[0];
47+
}
5348

54-
_handlers.Add(h);
55-
}
49+
var h = new HandlerDescriptor(
50+
LspHelper.GetMethodName(implementedInterface),
51+
handler,
52+
@interface,
53+
@params,
54+
registration,
55+
capability,
56+
() => _handlers.RemoveWhere(instance => instance.Handler == handler));
5657

57-
return new ImutableDisposable(handlers);
58-
}
59-
60-
public IEnumerable<ILspHandlerDescriptor> Get(IJsonRpcHandler handler)
61-
{
62-
return _handlers.Where(instance => instance.Handler == handler);
63-
}
58+
descriptors.Add(h);
59+
_handlers.Add(h);
60+
}
61+
}
6462

65-
public IEnumerable<ILspHandlerDescriptor> Get(string method)
66-
{
67-
return _handlers.Where(instance => instance.Method == method);
63+
return new ImutableDisposable(descriptors);
6864
}
6965

7066
private static readonly Type[] HandlerTypes = { typeof(INotificationHandler), typeof(INotificationHandler<>), typeof(IRequestHandler<>), typeof(IRequestHandler<,>), };

src/Lsp/LanguageServer.cs

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,31 @@ IRequestProcessIdentifier requestProcessIdentifier
6767

6868
public IDisposable AddHandler(IJsonRpcHandler handler)
6969
{
70-
var handlerDisposable = _collection.Add(handler);
70+
return AddHandler(handler);
71+
}
72+
73+
public IDisposable AddHandlers(params IJsonRpcHandler[] handlers)
74+
{
75+
return AddHandlers(handlers.AsEnumerable());
76+
}
77+
78+
public IDisposable AddHandlers(IEnumerable<IJsonRpcHandler> handlers)
79+
{
80+
var handlerDisposable = _collection.Add(handlers);
7181

7282
return new ImutableDisposable(
7383
handlerDisposable,
74-
new Disposable(() => {
75-
var handlers = _collection
76-
.Where(x => x.Handler == handler)
84+
new Disposable(() =>
85+
{
86+
var foundItems = handlers
87+
.SelectMany(handler => _collection
88+
.Where(x => handler == x.Handler)
7789
.Where(x => x.AllowsDynamicRegistration)
7890
.Select(x => x.Registration)
79-
.Where(x => x != null)
80-
.ToArray();
91+
.Where(x => x != null))
92+
.ToArray();
8193

82-
Task.Run(() => this.UnregisterCapability(new UnregistrationParams() { Unregisterations = handlers }));
94+
Task.Run(() => this.UnregisterCapability(new UnregistrationParams() { Unregisterations = foundItems }));
8395
}));
8496
}
8597

@@ -117,7 +129,8 @@ async Task<InitializeResult> IRequestHandler<InitializeParams, InitializeResult>
117129
}
118130
}
119131

120-
var serverCapabilities = new ServerCapabilities() {
132+
var serverCapabilities = new ServerCapabilities()
133+
{
121134
CodeActionProvider = HasHandler<ICodeActionHandler>(),
122135
CodeLensProvider = GetOptions<ICodeLensOptions, CodeLensOptions>(CodeLensOptions.Of),
123136
CompletionProvider = GetOptions<ICompletionOptions, CompletionOptions>(CompletionOptions.Of),
@@ -147,7 +160,8 @@ async Task<InitializeResult> IRequestHandler<InitializeParams, InitializeResult>
147160
}
148161
else
149162
{
150-
serverCapabilities.TextDocumentSync = textSyncHandler?.Options ?? new TextDocumentSyncOptions() {
163+
serverCapabilities.TextDocumentSync = textSyncHandler?.Options ?? new TextDocumentSyncOptions()
164+
{
151165
Change = TextDocumentSyncKind.None,
152166
OpenClose = false,
153167
Save = new SaveOptions() { IncludeText = false },

0 commit comments

Comments
 (0)