Skip to content

Commit ac5fa09

Browse files
IT's alive!!!
1 parent 13deee2 commit ac5fa09

File tree

14 files changed

+167
-58
lines changed

14 files changed

+167
-58
lines changed

sample/SampleServer/Program.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ class TextDocumentHandler : ITextDocumentSyncHandler
3939
private readonly ILanguageServer _router;
4040

4141
private readonly DocumentSelector _documentSelector = new DocumentSelector(
42-
new DocumentFilter() { Pattern = "*.csproj" }
42+
new DocumentFilter() {
43+
//Pattern = "*.csproj",
44+
Language = "xml"
45+
}
4346
);
4447

4548
private SynchronizationCapability _capability;

src/JsonRpc/InputHandler.cs

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -134,47 +134,53 @@ private void HandleRequest(string request)
134134
{
135135
foreach (var response in requests.Where(x => x.IsResponse).Select(x => x.Response))
136136
{
137-
long id = response.Id is string s ? long.Parse(s) : response.Id is long l ? l : -1;
138-
137+
var id = response.Id is string s ? long.Parse(s) : response.Id is long l ? l : -1;
139138
if (id < 0) continue;
140139

141140
var tcs = _responseRouter.GetRequest(id);
142141
if (tcs is null) continue;
143142

144-
tcs.SetResult(response.Result);
145-
}
146-
}
147-
else
148-
{
149-
foreach (var (type, item) in requests.Select(x => (_requestProcessIdentifier.Identify(x), x)))
150-
{
151-
if (item.IsRequest)
143+
if (response.Error is null)
152144
{
153-
_queue.Enqueue((
154-
type,
155-
async () => {
156-
var result = await _requestRouter.RouteRequest(item.Request);
157-
158-
_outputHandler.Send(result.Value);
159-
}
160-
));
145+
tcs.SetResult(response.Result);
161146
}
162-
else if (item.IsNotification)
147+
else
163148
{
164-
_queue.Enqueue((
165-
type,
166-
() => {
167-
_requestRouter.RouteNotification(item.Notification);
168-
return Task.CompletedTask;
169-
}
170-
));
171-
}
172-
else if (item.IsError)
173-
{
174-
// TODO:
175-
_outputHandler.Send(item.Error);
149+
tcs.SetException(new Exception(response.Error));
176150
}
177151
}
152+
153+
return;
154+
}
155+
156+
foreach (var (type, item) in requests.Select(x => (_requestProcessIdentifier.Identify(x), x)))
157+
{
158+
if (item.IsRequest)
159+
{
160+
_queue.Enqueue((
161+
type,
162+
async () => {
163+
var result = await _requestRouter.RouteRequest(item.Request);
164+
165+
_outputHandler.Send(result.Value);
166+
}
167+
));
168+
}
169+
else if (item.IsNotification)
170+
{
171+
_queue.Enqueue((
172+
type,
173+
() => {
174+
_requestRouter.RouteNotification(item.Notification);
175+
return Task.CompletedTask;
176+
}
177+
));
178+
}
179+
else if (item.IsError)
180+
{
181+
// TODO:
182+
_outputHandler.Send(item.Error);
183+
}
178184
}
179185
}
180186

src/JsonRpc/Reciever.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,16 @@ protected virtual Renor GetRenor(JToken @object)
6161
requestId = idString ?? (idLong.HasValue ? (object)idLong.Value : null);
6262
}
6363

64-
if (request.TryGetValue("result", out var response))
64+
if (hasRequestId && request.TryGetValue("result", out var response))
6565
{
6666
return new Response(requestId, response);
6767
}
6868

69+
if (hasRequestId && request.TryGetValue("error", out var errorResponse))
70+
{
71+
return new Response(requestId, errorResponse.ToString());
72+
}
73+
6974
var method = request["method"]?.Value<string>();
7075
if (string.IsNullOrWhiteSpace(method))
7176
{

src/JsonRpc/ResponseRouter.cs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public void SendNotification<T>(string method, T @params)
2626
});
2727
}
2828

29-
public Task<TResponse> SendRequest<T, TResponse>(string method, T @params)
29+
public async Task<TResponse> SendRequest<T, TResponse>(string method, T @params)
3030
{
3131
long nextId;
3232
lock (_lock)
@@ -43,14 +43,18 @@ public Task<TResponse> SendRequest<T, TResponse>(string method, T @params)
4343
Id = nextId
4444
});
4545

46-
return tcs.Task
47-
.ContinueWith(x => {
48-
_requests.TryRemove(nextId, out var _);
49-
return x.Result.ToObject<TResponse>();
50-
});
46+
try
47+
{
48+
var result = await tcs.Task;
49+
return result.ToObject<TResponse>();
50+
}
51+
finally
52+
{
53+
_requests.TryRemove(nextId, out var _);
54+
}
5155
}
5256

53-
public Task SendRequest<T>(string method, T @params)
57+
public async Task SendRequest<T>(string method, T @params)
5458
{
5559
long nextId;
5660
lock (_lock)
@@ -67,7 +71,14 @@ public Task SendRequest<T>(string method, T @params)
6771
Id = nextId
6872
});
6973

70-
return tcs.Task.ContinueWith(x => _requests.TryRemove(nextId, out var _));
74+
try
75+
{
76+
await tcs.Task;
77+
}
78+
finally
79+
{
80+
_requests.TryRemove(nextId, out var _);
81+
}
7182
}
7283

7384
public TaskCompletionSource<JToken> GetRequest(long id)

src/JsonRpc/Server/Response.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,24 @@ namespace JsonRpc.Server
66
{
77
public class Response
88
{
9-
public Response(object id) : this(id, null)
9+
public Response(object id, JToken result)
1010
{
11+
Id = id;
12+
Result = result;
1113
}
1214

13-
public Response(object id, JToken result)
15+
public Response(object id, string error)
1416
{
1517
Id = id;
16-
Result = result;
18+
Error = error;
1719
}
1820

1921
public string ProtocolVersion { get; set; } = "2.0";
2022

2123
public object Id { get; set; }
2224

2325
public JToken Result { get; set; }
26+
27+
public string Error { get; set; }
2428
}
2529
}

src/Lsp/HandlerCollection.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace Lsp
1212
{
1313
class HandlerCollection : IHandlerCollection
1414
{
15-
private readonly List<HandlerDescriptor> _handlers = new List<HandlerDescriptor>();
15+
internal readonly HashSet<HandlerDescriptor> _handlers = new HashSet<HandlerDescriptor>();
1616

1717
public IEnumerator<ILspHandlerDescriptor> GetEnumerator()
1818
{
@@ -50,12 +50,14 @@ public IDisposable Add(IJsonRpcHandler handler)
5050
@params,
5151
registration,
5252
capability,
53-
() => _handlers.RemoveAll(instance => instance.Handler == handler));
53+
() => _handlers.RemoveWhere(instance => instance.Handler == handler));
5454

5555
handlers.Add(h);
5656
}
5757

58-
_handlers.AddRange(handlers);
58+
foreach (var a in handlers)
59+
_handlers.Add(a);
60+
5961
return new ImutableDisposable(handlers);
6062
}
6163

src/Lsp/HandlerDescriptor.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,5 +88,19 @@ private static void SetCapability<T>(ICapability<T> capability, T instance)
8888
{
8989
capability.SetCapability(instance);
9090
}
91+
92+
public override bool Equals(object obj)
93+
{
94+
if (obj is HandlerDescriptor handler)
95+
{
96+
return handler.HandlerType == HandlerType;
97+
}
98+
return false;
99+
}
100+
101+
public override int GetHashCode()
102+
{
103+
return HandlerType.GetHashCode();
104+
}
91105
}
92106
}

src/Lsp/LanguageServer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,6 @@ public async Task Initialize()
8383

8484
await _initializeComplete.Task;
8585

86-
_reciever.Initialized();
87-
8886
// Small delay to let client respond
8987
await Task.Delay(100);
9088

@@ -150,15 +148,17 @@ async Task<InitializeResult> IRequestHandler<InitializeParams, InitializeResult>
150148
};
151149
}
152150

151+
_reciever.Initialized();
152+
153153
// TODO: Need a call back here
154154
// serverCapabilities.Experimental;
155155

156156
var result = Server = new InitializeResult() { Capabilities = serverCapabilities };
157157

158158
// TODO:
159-
_initializeComplete.SetResult(result);
160159
if (_clientVersion == ClientVersion.Lsp2)
161160
{
161+
_initializeComplete.SetResult(result);
162162
}
163163

164164
return result;

src/Lsp/Lsp.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,3 @@
1111
<ProjectReference Include="..\JsonRpc\JsonRpc.csproj" />
1212
</ItemGroup>
1313
</Project>
14-
Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Threading.Tasks;
1+
using System;
2+
using System.Threading.Tasks;
23
using JsonRpc;
34
using Lsp.Models;
45
// ReSharper disable CheckNamespace
@@ -7,9 +8,17 @@ namespace Lsp.Protocol
78
{
89
public static class RegisterCapabilityExtensions
910
{
10-
public static Task RegisterCapability(this ILanguageServer mediator, RegistrationParams @params)
11+
public static async Task RegisterCapability(this ILanguageServer mediator, RegistrationParams @params)
1112
{
12-
return mediator.SendRequest("client/registerCapability", @params);
13+
try
14+
{
15+
await mediator.SendRequest("client/registerCapability", @params);
16+
}
17+
catch (Exception e)
18+
{
19+
// VsCode today does not implement LSP properly.
20+
await mediator.SendRequest("client/registerFeature", @params);
21+
}
1322
}
1423
}
1524
}

0 commit comments

Comments
 (0)