-
Notifications
You must be signed in to change notification settings - Fork 109
Expand file tree
/
Copy pathLanguageClientHelpers.cs
More file actions
45 lines (41 loc) · 1.96 KB
/
Copy pathLanguageClientHelpers.cs
File metadata and controls
45 lines (41 loc) · 1.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System.Reactive.Disposables;
using System.Reactive.Linq;
using OmniSharp.Extensions.LanguageServer.Protocol.Client;
using OmniSharp.Extensions.LanguageServer.Protocol.Shared;
using OmniSharp.Extensions.LanguageServer.Shared;
namespace OmniSharp.Extensions.LanguageServer.Client
{
static class LanguageClientHelpers
{
static IEnumerable<T> GetUniqueHandlers<T>(CompositeDisposable disposable)
{
return disposable.OfType<ILspHandlerDescriptor>()
.Select(z => z.Handler)
.OfType<T>()
.Concat(disposable.OfType<CompositeDisposable>().SelectMany(GetUniqueHandlers<T>))
.Concat(disposable.OfType<LspHandlerDescriptorDisposable>().SelectMany(GetLspHandlers<T>))
.Distinct();
}
static IEnumerable<T> GetLspHandlers<T>(LspHandlerDescriptorDisposable disposable)
{
return disposable.Descriptors
.Select(z => z.Handler)
.OfType<T>()
.Distinct();
}
internal static void InitHandlers(ILanguageClient client, CompositeDisposable result)
{
Observable.Concat(
GetUniqueHandlers<IOnLanguageClientInitialize>(result)
.Select(handler => Observable.FromAsync(ct => handler.OnInitialize(client, client.ClientSettings, ct)))
.Merge(),
GetUniqueHandlers<IOnLanguageClientInitialized>(result)
.Select(handler => Observable.FromAsync(ct => handler.OnInitialized(client, client.ClientSettings, client.ServerSettings, ct)))
.Merge(),
GetUniqueHandlers<IOnLanguageClientStarted>(result)
.Select(handler => Observable.FromAsync(ct => handler.OnStarted(client, ct)))
.Merge()
).Subscribe();
}
}
}