Skip to content

Commit b94f484

Browse files
moved to observables for events
1 parent b0f8c9e commit b94f484

File tree

9 files changed

+45
-43
lines changed

9 files changed

+45
-43
lines changed

src/Client/LanguageClient.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public LanguageClient(ILoggerFactory loggerFactory, ServerProcess process)
9292
throw new ArgumentNullException(nameof(process));
9393

9494
_process = process;
95-
_process.Exited += ServerProcess_Exit;
95+
_process.Exited.Subscribe(x => ServerProcess_Exit());
9696
}
9797

9898
/// <summary>
@@ -452,7 +452,7 @@ async Task Start()
452452
/// <param name="args">
453453
/// The event arguments.
454454
/// </param>
455-
async void ServerProcess_Exit(object sender, EventArgs args)
455+
async void ServerProcess_Exit()
456456
{
457457
Log.LogDebug("Server process has exited; language client is shutting down...");
458458

src/Client/Processes/ServerProcess.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
using System;
1+
using System;
22
using System.IO;
3+
using System.Reactive.Linq;
4+
using System.Reactive.Subjects;
35
using System.Threading.Tasks;
46
using Microsoft.Extensions.Logging;
57

@@ -11,6 +13,7 @@ namespace OmniSharp.Extensions.LanguageServer.Client.Processes
1113
public abstract class ServerProcess
1214
: IDisposable
1315
{
16+
private readonly ISubject<object> _exitedSubject;
1417
/// <summary>
1518
/// Create a new <see cref="ServerProcess"/>.
1619
/// </summary>
@@ -31,6 +34,8 @@ protected ServerProcess(ILoggerFactory loggerFactory)
3134

3235
ServerExitCompletion = new TaskCompletionSource<object>();
3336
ServerExitCompletion.SetResult(null); // Start out as if the server has already exited.
37+
38+
Exited = _exitedSubject = new AsyncSubject<object>();
3439
}
3540

3641
/// <summary>
@@ -82,7 +87,7 @@ protected virtual void Dispose(bool disposing)
8287
/// <summary>
8388
/// Event raised when the server has exited.
8489
/// </summary>
85-
public event EventHandler<EventArgs> Exited;
90+
public IObservable<object> Exited { get; }
8691

8792
/// <summary>
8893
/// Is the server running?
@@ -130,7 +135,8 @@ protected virtual void Dispose(bool disposing)
130135
/// </summary>
131136
protected virtual void OnExited()
132137
{
133-
Exited?.Invoke(this, EventArgs.Empty);
138+
_exitedSubject.OnNext(null);
139+
_exitedSubject.OnCompleted();
134140
}
135141
}
136142
}

src/Server/Handlers/ExitEventHandler.cs

Lines changed: 0 additions & 4 deletions
This file was deleted.

src/Server/Handlers/ExitHandler.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
using System;
2+
using System.Reactive.Subjects;
3+
using System.Reactive.Threading.Tasks;
14
using System.Threading;
25
using System.Threading.Tasks;
36
using MediatR;
@@ -9,25 +12,26 @@ namespace OmniSharp.Extensions.LanguageServer.Server.Handlers
912
{
1013
public class ExitHandler : IExitHandler
1114
{
15+
private readonly ISubject<int> _exitSubject;
1216
private readonly ShutdownHandler _shutdownHandler;
1317

1418
public ExitHandler(ShutdownHandler shutdownHandler)
1519
{
1620
_shutdownHandler = shutdownHandler;
21+
Exit = _exitSubject = new AsyncSubject<int>();
1722
}
1823

19-
private readonly TaskCompletionSource<int> _exitedSource = new TaskCompletionSource<int>(TaskContinuationOptions.LongRunning);
20-
public Task WaitForExit => _exitedSource.Task;
24+
public Task WaitForExit => Exit.ToTask();
25+
public IObservable<int> Exit { get; }
2126

2227

23-
public Task Handle(EmptyRequest request, CancellationToken token)
28+
public async Task Handle(EmptyRequest request, CancellationToken token)
2429
{
30+
await Task.Yield();
31+
2532
var result = _shutdownHandler.ShutdownRequested ? 0 : 1;
26-
Exit?.Invoke(result);
27-
_exitedSource.SetResult(result);
28-
return Task.CompletedTask;
33+
_exitSubject.OnNext(result);
34+
_exitSubject.OnCompleted();
2935
}
30-
31-
public event ExitEventHandler Exit;
3236
}
3337
}

src/Server/Handlers/ShutdownEventHandler.cs

Lines changed: 0 additions & 4 deletions
This file was deleted.

src/Server/Handlers/ShutdownHandler.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
using System;
2+
using System.Reactive.Linq;
3+
using System.Reactive.Subjects;
4+
using System.Reactive.Threading.Tasks;
15
using System.Threading;
26
using System.Threading.Tasks;
37
using MediatR;
@@ -9,24 +13,29 @@ namespace OmniSharp.Extensions.LanguageServer.Server.Handlers
913
{
1014
public class ShutdownHandler : IShutdownHandler
1115
{
12-
public event ShutdownEventHandler Shutdown;
16+
private readonly ISubject<bool> _shutdownSubject;
1317

18+
public ShutdownHandler()
19+
{
20+
Shutdown = _shutdownSubject = new AsyncSubject<bool>();
21+
}
22+
23+
public IObservable<bool> Shutdown { get; }
1424
public bool ShutdownRequested { get; private set; }
25+
public Task WasShutDown => Shutdown.ToTask();
1526

16-
private readonly TaskCompletionSource<bool> _shutdownSource = new TaskCompletionSource<bool>(TaskContinuationOptions.LongRunning);
17-
public Task WasShutDown => _shutdownSource.Task;
1827
public async Task Handle(EmptyRequest request, CancellationToken token)
1928
{
2029
await Task.Yield(); // Ensure shutdown handler runs asynchronously.
2130

2231
ShutdownRequested = true;
2332
try
2433
{
25-
Shutdown?.Invoke(ShutdownRequested);
34+
_shutdownSubject.OnNext(ShutdownRequested);
2635
}
2736
finally
2837
{
29-
_shutdownSource.SetResult(true); // after all event sinks were notified
38+
_shutdownSubject.OnCompleted();
3039
}
3140
}
3241
}

src/Server/ILanguageServer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ public interface ILanguageServer : IResponseRouter, IDisposable
1919

2020
Task Initialize();
2121

22-
event ShutdownEventHandler Shutdown;
23-
event ExitEventHandler Exit;
22+
IObservable<bool> Shutdown { get; }
23+
IObservable<int> Exit { get; }
2424
Task WasShutDown { get; }
2525
Task WaitForExit { get; }
2626
}

src/Server/LanguageServer.cs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -365,17 +365,8 @@ private async Task DynamicallyRegisterHandlers()
365365
await this.RegisterCapability(@params);
366366
}
367367

368-
public event ShutdownEventHandler Shutdown
369-
{
370-
add => _shutdownHandler.Shutdown += value;
371-
remove => _shutdownHandler.Shutdown -= value;
372-
}
373-
374-
public event ExitEventHandler Exit
375-
{
376-
add => _exitHandler.Exit += value;
377-
remove => _exitHandler.Exit -= value;
378-
}
368+
public IObservable<bool> Shutdown => _shutdownHandler.Shutdown;
369+
public IObservable<int> Exit => _exitHandler.Exit;
379370

380371
public void SendNotification<T>(string method, T @params)
381372
{

test/Lsp.Tests/LspRequestRouterTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,9 +212,9 @@ public async Task ShouldHandle_Request_WithNullParameters()
212212
bool wasShutDown = false;
213213

214214
var shutdownHandler = new ShutdownHandler();
215-
shutdownHandler.Shutdown += shutdownRequested => {
215+
shutdownHandler.Shutdown .Subscribe(shutdownRequested => {
216216
wasShutDown = true;
217-
};
217+
});
218218

219219
var collection = new HandlerCollection { shutdownHandler };
220220
AutoSubstitute.Provide<IHandlerCollection>(collection);
@@ -235,9 +235,9 @@ public async Task ShouldHandle_Request_WithMissingParameters()
235235
{
236236
bool wasShutdown = false;
237237
var shutdownHandler = new ShutdownHandler();
238-
shutdownHandler.Shutdown += shutdownRequested => {
238+
shutdownHandler.Shutdown .Subscribe(shutdownRequested => {
239239
wasShutdown = true;
240-
};
240+
});
241241

242242
var collection = new HandlerCollection { shutdownHandler };
243243
AutoSubstitute.Provide<IHandlerCollection>(collection);

0 commit comments

Comments
 (0)