Skip to content

Commit 59204cd

Browse files
Merge pull request #128 from OmniSharp/feature/delegate-all-the-things
Added delegate handlers for all base interfaces +semver:major
2 parents c7eb818 + cfc563c commit 59204cd

File tree

105 files changed

+3003
-638
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+3003
-638
lines changed

src/Client/Protocol/LspConnection.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ public void SendNotification(string method, object notification)
387387
{
388388
_outgoing.TryAdd(new ClientMessage
389389
{
390-
Method = GeneralNames.CancelRequest,
390+
Method = JsonRpcNames.CancelRequest,
391391
Params = new JObject(
392392
new JProperty("id", requestId)
393393
)
@@ -450,7 +450,7 @@ public void SendNotification(string method, object notification)
450450
{
451451
_outgoing.TryAdd(new ClientMessage
452452
{
453-
Method = GeneralNames.CancelRequest,
453+
Method = JsonRpcNames.CancelRequest,
454454
Params = new JObject(
455455
new JProperty("id", requestId)
456456
)
@@ -817,7 +817,7 @@ async Task DispatchLoop()
817817
if (message.Id != null)
818818
{
819819
// Request.
820-
if (message.Method == GeneralNames.CancelRequest)
820+
if (message.Method == JsonRpcNames.CancelRequest)
821821
CancelRequest(message);
822822
else
823823
DispatchRequest(message);
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
using Newtonsoft.Json;
33
using Newtonsoft.Json.Serialization;
44

5-
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models
5+
namespace OmniSharp.Extensions.JsonRpc
66
{
77
public class CancelParams : IRequest
88
{
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using OmniSharp.Extensions.JsonRpc;
2+
3+
// ReSharper disable CheckNamespace
4+
5+
namespace OmniSharp.Extensions.JsonRpc
6+
{
7+
public static class CancelRequestExtensions
8+
{
9+
public static void CancelRequest(this IResponseRouter mediator, CancelParams @params)
10+
{
11+
mediator.SendNotification(JsonRpcNames.CancelRequest, @params);
12+
}
13+
14+
public static void CancelRequest(this IResponseRouter mediator, string id)
15+
{
16+
mediator.SendNotification(JsonRpcNames.CancelRequest, new CancelParams() { Id = id });
17+
}
18+
19+
public static void CancelRequest(this IResponseRouter mediator, long id)
20+
{
21+
mediator.SendNotification(JsonRpcNames.CancelRequest, new CancelParams() { Id = id });
22+
}
23+
}
24+
}

src/Server/Handlers/CancelRequestHandler.cs renamed to src/JsonRpc/CancelRequestHandler.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@
22
using System.Threading.Tasks;
33
using OmniSharp.Extensions.Embedded.MediatR;
44
using OmniSharp.Extensions.JsonRpc;
5-
using OmniSharp.Extensions.LanguageServer.Protocol;
6-
using OmniSharp.Extensions.LanguageServer.Protocol.Models;
75

8-
namespace OmniSharp.Extensions.LanguageServer.Server.Handlers
6+
namespace OmniSharp.Extensions.JsonRpc
97
{
10-
public class CancelRequestHandler : ICancelRequestHandler
8+
public class CancelRequestHandler<TDescriptor> : ICancelRequestHandler
119
{
12-
private readonly ILspRequestRouter _requestRouter;
10+
private readonly IRequestRouter<TDescriptor> _requestRouter;
1311

14-
internal CancelRequestHandler(ILspRequestRouter requestRouter)
12+
public CancelRequestHandler(IRequestRouter<TDescriptor> requestRouter)
1513
{
1614
_requestRouter = requestRouter;
1715
}

src/JsonRpc/Connection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ namespace OmniSharp.Extensions.JsonRpc
77
public class Connection : IDisposable
88
{
99
private readonly IInputHandler _inputHandler;
10-
private readonly IRequestRouter _requestRouter;
10+
private readonly IRequestRouter<IHandlerDescriptor> _requestRouter;
1111

1212
public Connection(
1313
Stream input,
1414
IOutputHandler outputHandler,
1515
IReciever reciever,
1616
IRequestProcessIdentifier requestProcessIdentifier,
17-
IRequestRouter requestRouter,
17+
IRequestRouter<IHandlerDescriptor> requestRouter,
1818
IResponseRouter responseRouter,
1919
ILoggerFactory loggerFactory,
2020
ISerializer serializer)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using OmniSharp.Extensions.Embedded.MediatR;
2+
3+
namespace OmniSharp.Extensions.JsonRpc
4+
{
5+
public class DelegatingNotification<T> : IRequest
6+
{
7+
public DelegatingNotification(T value)
8+
{
9+
Value = value;
10+
}
11+
12+
public T Value { get; }
13+
}
14+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using System;
2+
using System.Threading;
3+
using System.Threading.Tasks;
4+
using OmniSharp.Extensions.Embedded.MediatR;
5+
6+
namespace OmniSharp.Extensions.JsonRpc
7+
{
8+
public class DelegatingNotificationHandler<T> : IJsonRpcNotificationHandler<DelegatingNotification<T>>
9+
{
10+
private readonly Action<T> _handler;
11+
private readonly ISerializer _serializer;
12+
13+
public DelegatingNotificationHandler(ISerializer serializer, Action<T> handler)
14+
{
15+
_handler = handler;
16+
_serializer = serializer;
17+
}
18+
19+
public Task<Unit> Handle(DelegatingNotification<T> request, CancellationToken cancellationToken)
20+
{
21+
_handler.Invoke(request.Value);
22+
return Unit.Task;
23+
}
24+
}
25+
26+
public class DelegatingNotificationHandler : IJsonRpcNotificationHandler<DelegatingNotification<object>>
27+
{
28+
private readonly Action _handler;
29+
private readonly ISerializer _serializer;
30+
31+
public DelegatingNotificationHandler(ISerializer serializer, Action handler)
32+
{
33+
_handler = handler;
34+
_serializer = serializer;
35+
}
36+
37+
public Task<Unit> Handle(DelegatingNotification<object> request, CancellationToken cancellationToken)
38+
{
39+
_handler.Invoke();
40+
return Unit.Task;
41+
}
42+
}
43+
}

src/JsonRpc/DelegatingRequest.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using Newtonsoft.Json.Linq;
2+
using OmniSharp.Extensions.Embedded.MediatR;
3+
4+
namespace OmniSharp.Extensions.JsonRpc
5+
{
6+
public class DelegatingRequest<T> : IRequest<JToken>, IRequest
7+
{
8+
public DelegatingRequest(T value)
9+
{
10+
Value = value;
11+
}
12+
13+
public T Value { get; }
14+
}
15+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using System;
2+
using System.Threading;
3+
using System.Threading.Tasks;
4+
using Newtonsoft.Json.Linq;
5+
6+
namespace OmniSharp.Extensions.JsonRpc
7+
{
8+
public class DelegatingRequestHandler<T, TResponse> : IJsonRpcRequestHandler<DelegatingRequest<T>, JToken>
9+
{
10+
private readonly Func<T, Task<TResponse>> _handler;
11+
private readonly ISerializer _serializer;
12+
13+
public DelegatingRequestHandler(ISerializer serializer, Func<T, Task<TResponse>> handler)
14+
{
15+
_handler = handler;
16+
_serializer = serializer;
17+
}
18+
19+
public async Task<JToken> Handle(DelegatingRequest<T> request, CancellationToken cancellationToken)
20+
{
21+
var response = await _handler.Invoke(request.Value);
22+
return JToken.FromObject(response, _serializer.JsonSerializer);
23+
}
24+
}
25+
26+
public class DelegatingRequestHandler<T> : IJsonRpcRequestHandler<DelegatingRequest<T>, JToken>
27+
{
28+
private readonly Func<T, Task> _handler;
29+
private readonly ISerializer _serializer;
30+
31+
public DelegatingRequestHandler(ISerializer serializer, Func<T, Task> handler)
32+
{
33+
_handler = handler;
34+
_serializer = serializer;
35+
}
36+
37+
public async Task<JToken> Handle(DelegatingRequest<T> request, CancellationToken cancellationToken)
38+
{
39+
await _handler.Invoke(request.Value);
40+
return JValue.CreateNull();
41+
}
42+
}
43+
}

src/JsonRpc/HandlerCollection.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@ public HandlerInstance(string method, IJsonRpcHandler handler, Type handlerInter
2727
HandlerType = handlerInterface;
2828
Params = @params;
2929
Response = response;
30+
HasReturnType = HandlerType.GetInterfaces().Any(@interface =>
31+
@interface.IsGenericType &&
32+
typeof(IRequestHandler<,>).IsAssignableFrom(@interface.GetGenericTypeDefinition())
33+
);
34+
35+
IsDelegatingHandler = @params?.IsGenericType == true &&
36+
(
37+
typeof(DelegatingRequest<>).IsAssignableFrom(@params.GetGenericTypeDefinition()) ||
38+
typeof(DelegatingNotification<>).IsAssignableFrom(@params.GetGenericTypeDefinition())
39+
);
3040
}
3141

3242
public IJsonRpcHandler Handler { get; }
@@ -35,6 +45,8 @@ public HandlerInstance(string method, IJsonRpcHandler handler, Type handlerInter
3545
public string Method { get; }
3646
public Type Params { get; }
3747
public Type Response { get; }
48+
public bool HasReturnType { get; }
49+
public bool IsDelegatingHandler { get; }
3850

3951
public void Dispose()
4052
{
@@ -61,7 +73,8 @@ private void Remove(IJsonRpcHandler handler)
6173
public IDisposable Add(params IJsonRpcHandler[] handlers)
6274
{
6375
var cd = new CompositeDisposable();
64-
foreach (var handler in handlers){
76+
foreach (var handler in handlers)
77+
{
6578
cd.Add(Add(GetMethodName(handler.GetType()), handler));
6679
}
6780
return cd;
@@ -80,7 +93,9 @@ public IDisposable Add(string method, IJsonRpcHandler handler)
8093
var requestInterface = @params.GetInterfaces()
8194
.FirstOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IRequest<>));
8295
if (requestInterface != null)
96+
{
8397
response = requestInterface.GetGenericArguments()[0];
98+
}
8499
}
85100

86101
var h = new HandlerInstance(method, handler, @interface, @params, response, () => Remove(handler));

0 commit comments

Comments
 (0)