Skip to content

Commit 1ad4da1

Browse files
More serialization changes to bring the serializer everywhere. Started work on fixing tests
1 parent 8cf6021 commit 1ad4da1

File tree

129 files changed

+650
-371
lines changed

Some content is hidden

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

129 files changed

+650
-371
lines changed

src/Client/Protocol/LspConnection.cs

+7-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
using OmniSharp.Extensions.LanguageServer.Client.Handlers;
1515
using OmniSharp.Extensions.LanguageServer.Client.Logging;
1616
using OmniSharp.Extensions.LanguageServer.Protocol;
17+
using OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities;
1718
using JsonRpcMessages = OmniSharp.Extensions.JsonRpc.Server.Messages;
1819

1920
namespace OmniSharp.Extensions.LanguageServer.Client.Protocol
@@ -124,6 +125,8 @@ public sealed class LspConnection
124125
/// </summary>
125126
Task _dispatchLoop;
126127

128+
private JsonSerializerSettings _jsonSerializerSettings;
129+
127130
/// <summary>
128131
/// Create a new <see cref="LspConnection"/>.
129132
/// </summary>
@@ -156,6 +159,8 @@ public LspConnection(ILoggerFactory loggerFactory, Stream input, Stream output)
156159
Log = loggerFactory.CreateLogger<LspConnection>();
157160
_input = input;
158161
_output = output;
162+
// What does client version do? Do we have to negotaite this?
163+
_jsonSerializerSettings = Serializer.CreateSerializerSettings(ClientVersion.Lsp3);
159164
}
160165

161166
/// <summary>
@@ -654,7 +659,7 @@ async Task SendMessage<TMessage>(TMessage message)
654659
if (message == null)
655660
throw new ArgumentNullException(nameof(message));
656661

657-
string payload = JsonConvert.SerializeObject(message);
662+
string payload = JsonConvert.SerializeObject(message, _jsonSerializerSettings);
658663
byte[] payloadBuffer = PayloadEncoding.GetBytes(payload);
659664

660665
byte[] headerBuffer = HeaderEncoding.GetBytes(
@@ -754,7 +759,7 @@ async Task<ServerMessage> ReceiveMessage()
754759
Log.LogDebug("Received entire payload ({ReceivedByteCount} bytes).", received);
755760

756761
string responseBody = PayloadEncoding.GetString(requestBuffer);
757-
ServerMessage message = JsonConvert.DeserializeObject<ServerMessage>(responseBody);
762+
ServerMessage message = JsonConvert.DeserializeObject<ServerMessage>(responseBody, _jsonSerializerSettings);
758763

759764
Log.LogDebug("Read response body {ResponseBody}.", responseBody);
760765

src/JsonRpc/Client/Notification.cs

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
namespace OmniSharp.Extensions.JsonRpc.Client
55
{
6+
[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]
67
public class Notification
78
{
89
public string ProtocolVersion { get; } = "2.0";

src/JsonRpc/Client/Request.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
using Newtonsoft.Json;
1+
using Newtonsoft.Json;
22
using Newtonsoft.Json.Serialization;
33

44
namespace OmniSharp.Extensions.JsonRpc.Client
55
{
6+
[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]
67
public class Request
78
{
89
public object Id { get; set; }

src/JsonRpc/Client/Response.cs

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
namespace OmniSharp.Extensions.JsonRpc.Client
55
{
6+
[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]
67
public class Response
78
{
89
public Response(object id)

src/JsonRpc/InputHandler.cs

+5-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class InputHandler : IInputHandler
2626
private Thread _inputThread;
2727
private readonly IRequestRouter _requestRouter;
2828
private readonly IResponseRouter _responseRouter;
29+
private readonly JsonSerializerSettings _jsonSerializerSettings;
2930
private readonly ILogger<InputHandler> _logger;
3031
private readonly IScheduler _scheduler;
3132

@@ -36,7 +37,8 @@ public InputHandler(
3637
IRequestProcessIdentifier requestProcessIdentifier,
3738
IRequestRouter requestRouter,
3839
IResponseRouter responseRouter,
39-
ILoggerFactory loggerFactory
40+
ILoggerFactory loggerFactory,
41+
JsonSerializerSettings jsonSerializerSettings
4042
)
4143
{
4244
if (!input.CanRead) throw new ArgumentException($"must provide a readable stream for {nameof(input)}", nameof(input));
@@ -46,6 +48,7 @@ ILoggerFactory loggerFactory
4648
_requestProcessIdentifier = requestProcessIdentifier;
4749
_requestRouter = requestRouter;
4850
_responseRouter = responseRouter;
51+
_jsonSerializerSettings = jsonSerializerSettings;
4952
_logger = loggerFactory.CreateLogger<InputHandler>();
5053
_scheduler = new ProcessScheduler(loggerFactory);
5154
_inputThread = new Thread(ProcessInputStream) { IsBackground = true, Name = "ProcessInputStream" };
@@ -155,7 +158,7 @@ private void HandleRequest(string request)
155158
}
156159
else if (response is ServerError serverError)
157160
{
158-
tcs.SetException(new Exception(JsonConvert.SerializeObject(serverError.Error)));
161+
tcs.SetException(new Exception(JsonConvert.SerializeObject(serverError.Error, _jsonSerializerSettings)));
159162
}
160163
}
161164

src/JsonRpc/OutputHandler.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Concurrent;
33
using System.IO;
44
using System.Text;
@@ -10,14 +10,16 @@ namespace OmniSharp.Extensions.JsonRpc
1010
public class OutputHandler : IOutputHandler
1111
{
1212
private readonly Stream _output;
13+
private readonly JsonSerializerSettings _jsonSerializerSettings;
1314
private readonly Thread _thread;
1415
private readonly BlockingCollection<object> _queue;
1516
private readonly CancellationTokenSource _cancel;
1617

17-
public OutputHandler(Stream output)
18+
public OutputHandler(Stream output, JsonSerializerSettings jsonSerializerSettings)
1819
{
1920
if (!output.CanWrite) throw new ArgumentException($"must provide a writable stream for {nameof(output)}", nameof(output));
2021
_output = output;
22+
_jsonSerializerSettings = jsonSerializerSettings;
2123
_queue = new BlockingCollection<object>();
2224
_cancel = new CancellationTokenSource();
2325
_thread = new Thread(ProcessOutputQueue) { IsBackground = true, Name = "ProcessOutputQueue" };
@@ -42,7 +44,7 @@ private void ProcessOutputQueue()
4244
{
4345
if (_queue.TryTake(out var value, Timeout.Infinite, token))
4446
{
45-
var content = JsonConvert.SerializeObject(value);
47+
var content = JsonConvert.SerializeObject(value, _jsonSerializerSettings);
4648
var contentBytes = System.Text.Encoding.UTF8.GetBytes(content);
4749

4850
// TODO: Is this lsp specific??

src/Protocol/Client/Capabilities/CompletionCapability.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ public class CompletionCapability : DynamicCapability, ConnectedCapability<IComp
1414
/// The client supports to send additional context information for a `textDocument/completion` request.
1515
/// </summary>
1616
[Optional]
17-
public bool? ContextSupport { get; set; }
17+
public bool ContextSupport { get; set; }
1818
}
1919
}

src/Protocol/Client/Capabilities/CompletionItemCapability.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ public class CompletionItemCapability
1515
/// that is typing in one will update others too.
1616
/// </summary>
1717
[Optional]
18-
public bool? SnippetSupport { get; set; }
18+
public bool SnippetSupport { get; set; }
1919

2020
/// <summary>
2121
/// Client supports commit characters on a completion item.
2222
/// </summary>
2323
[Optional]
24-
public bool? CommitCharactersSupport { get; set; }
24+
public bool CommitCharactersSupport { get; set; }
2525

2626
/// <summary>
2727
/// Client supports the follow content formats for the documentation

src/Protocol/Client/Capabilities/DynamicCapability.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Newtonsoft.Json;
1+
using Newtonsoft.Json;
22
using Newtonsoft.Json.Serialization;
33

44
namespace OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities
@@ -9,6 +9,6 @@ public class DynamicCapability
99
/// Whether completion supports dynamic registration.
1010
/// </summary>
1111
[Optional]
12-
public bool? DynamicRegistration { get; set; }
12+
public bool DynamicRegistration { get; set; }
1313
}
1414
}

src/Protocol/Client/Capabilities/SynchronizationCapability.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,20 @@ public class SynchronizationCapability : DynamicCapability, ConnectedCapability<
99
/// The client supports sending will save notifications.
1010
/// </summary>
1111
[Optional]
12-
public bool? WillSave { get; set; }
12+
public bool WillSave { get; set; }
1313

1414
/// <summary>
1515
/// The client supports sending a will save request and
1616
/// waits for a response providing text edits which will
1717
/// be applied to the document before it is saved.
1818
/// </summary>
1919
[Optional]
20-
public bool? WillSaveWaitUntil { get; set; }
20+
public bool WillSaveWaitUntil { get; set; }
2121

2222
/// <summary>
2323
/// The client supports did save notifications.
2424
/// </summary>
2525
[Optional]
26-
public bool? DidSave { get; set; }
26+
public bool DidSave { get; set; }
2727
}
2828
}

src/Protocol/Client/Capabilities/TextDocumentClientCapabilities.cs

-45
Original file line numberDiff line numberDiff line change
@@ -8,119 +8,74 @@ public class TextDocumentClientCapabilities
88
{
99
public Supports<SynchronizationCapability> Synchronization { get; set; }
1010

11-
[EditorBrowsable(EditorBrowsableState.Never)]
12-
public bool ShouldSerializeSynchronization() => Synchronization.IsSupported;
13-
1411
/// <summary>
1512
/// Capabilities specific to the `textDocument/completion`
1613
/// </summary>
1714
public Supports<CompletionCapability> Completion { get; set; }
1815

19-
[EditorBrowsable(EditorBrowsableState.Never)]
20-
public bool ShouldSerializeCompletion() => Completion.IsSupported;
21-
2216
/// <summary>
2317
/// Capabilities specific to the `textDocument/hover`
2418
/// </summary>
2519
public Supports<HoverCapability> Hover { get; set; }
2620

27-
[EditorBrowsable(EditorBrowsableState.Never)]
28-
public bool ShouldSerializeHover() => Hover.IsSupported;
29-
3021
/// <summary>
3122
/// Capabilities specific to the `textDocument/signatureHelp`
3223
/// </summary>
3324
public Supports<SignatureHelpCapability> SignatureHelp { get; set; }
3425

35-
[EditorBrowsable(EditorBrowsableState.Never)]
36-
public bool ShouldSerializeSignatureHelp() => SignatureHelp.IsSupported;
37-
3826
/// <summary>
3927
/// Capabilities specific to the `textDocument/references`
4028
/// </summary>
4129
public Supports<ReferencesCapability> References { get; set; }
4230

43-
[EditorBrowsable(EditorBrowsableState.Never)]
44-
public bool ShouldSerializeReferences() => References.IsSupported;
45-
4631
/// <summary>
4732
/// Capabilities specific to the `textDocument/documentHighlight`
4833
/// </summary>
4934
public Supports<DocumentHighlightCapability> DocumentHighlight { get; set; }
5035

51-
[EditorBrowsable(EditorBrowsableState.Never)]
52-
public bool ShouldSerializeDocumentHighlight() => DocumentHighlight.IsSupported;
53-
5436
/// <summary>
5537
/// Capabilities specific to the `textDocument/documentSymbol`
5638
/// </summary>
5739
public Supports<DocumentSymbolCapability> DocumentSymbol { get; set; }
5840

59-
[EditorBrowsable(EditorBrowsableState.Never)]
60-
public bool ShouldSerializeDocumentSymbol() => DocumentSymbol.IsSupported;
61-
6241
/// <summary>
6342
/// Capabilities specific to the `textDocument/formatting`
6443
/// </summary>
6544
public Supports<DocumentFormattingCapability> Formatting { get; set; }
6645

67-
[EditorBrowsable(EditorBrowsableState.Never)]
68-
public bool ShouldSerializeFormatting() => Formatting.IsSupported;
69-
7046
/// <summary>
7147
/// Capabilities specific to the `textDocument/rangeFormatting`
7248
/// </summary>
7349
public Supports<DocumentRangeFormattingCapability> RangeFormatting { get; set; }
7450

75-
[EditorBrowsable(EditorBrowsableState.Never)]
76-
public bool ShouldSerializeRangeFormatting() => RangeFormatting.IsSupported;
77-
7851
/// <summary>
7952
/// Capabilities specific to the `textDocument/onTypeFormatting`
8053
/// </summary>
8154
public Supports<DocumentOnTypeFormattingCapability> OnTypeFormatting { get; set; }
8255

83-
[EditorBrowsable(EditorBrowsableState.Never)]
84-
public bool ShouldSerializeOnTypeFormatting() => OnTypeFormatting.IsSupported;
85-
8656
/// <summary>
8757
/// Capabilities specific to the `textDocument/definition`
8858
/// </summary>
8959
public Supports<DefinitionCapability> Definition { get; set; }
9060

91-
[EditorBrowsable(EditorBrowsableState.Never)]
92-
public bool ShouldSerializeDefinition() => Definition.IsSupported;
93-
9461
/// <summary>
9562
/// Capabilities specific to the `textDocument/codeAction`
9663
/// </summary>
9764
public Supports<CodeActionCapability> CodeAction { get; set; }
9865

99-
[EditorBrowsable(EditorBrowsableState.Never)]
100-
public bool ShouldSerializeCodeAction() => CodeAction.IsSupported;
101-
10266
/// <summary>
10367
/// Capabilities specific to the `textDocument/codeLens`
10468
/// </summary>
10569
public Supports<CodeLensCapability> CodeLens { get; set; }
10670

107-
[EditorBrowsable(EditorBrowsableState.Never)]
108-
public bool ShouldSerializeCodeLens() => CodeLens.IsSupported;
109-
11071
/// <summary>
11172
/// Capabilities specific to the `textDocument/documentLink`
11273
/// </summary>
11374
public Supports<DocumentLinkCapability> DocumentLink { get; set; }
11475

115-
[EditorBrowsable(EditorBrowsableState.Never)]
116-
public bool ShouldSerializeDocumentLink() => DocumentLink.IsSupported;
117-
11876
/// <summary>
11977
/// Capabilities specific to the `textDocument/rename`
12078
/// </summary>
12179
public Supports<RenameCapability> Rename { get; set; }
122-
123-
[EditorBrowsable(EditorBrowsableState.Never)]
124-
public bool ShouldSerializeRename() => Rename.IsSupported;
12580
}
12681
}

src/Protocol/Client/Capabilities/WorkspaceClientCapabilites.cs

-18
Original file line numberDiff line numberDiff line change
@@ -12,44 +12,26 @@ public class WorkspaceClientCapabilites
1212
/// </summary>
1313
public Supports<bool> ApplyEdit { get; set; }
1414

15-
[EditorBrowsable(EditorBrowsableState.Never)]
16-
public bool ShouldSerializeApplyEdit() => ApplyEdit.IsSupported;
17-
1815
public Supports<WorkspaceEditCapability> WorkspaceEdit { get; set; }
1916

20-
[EditorBrowsable(EditorBrowsableState.Never)]
21-
public bool ShouldSerializeWorkspaceEdit() => WorkspaceEdit.IsSupported;
22-
2317
/// <summary>
2418
/// Capabilities specific to the `workspace/didChangeConfiguration` notification.
2519
/// </summary>
2620
public Supports<DidChangeConfigurationCapability> DidChangeConfiguration { get; set; }
2721

28-
[EditorBrowsable(EditorBrowsableState.Never)]
29-
public bool ShouldSerializeDidChangeConfiguration() => DidChangeConfiguration.IsSupported;
30-
3122
/// <summary>
3223
/// Capabilities specific to the `workspace/didChangeWatchedFiles` notification.
3324
/// </summary>
3425
public Supports<DidChangeWatchedFilesCapability> DidChangeWatchedFiles { get; set; }
3526

36-
[EditorBrowsable(EditorBrowsableState.Never)]
37-
public bool ShouldSerializeDidChangeWatchedFiles() => DidChangeWatchedFiles.IsSupported;
38-
3927
/// <summary>
4028
/// Capabilities specific to the `workspace/symbol` request.
4129
/// </summary>
4230
public Supports<WorkspaceSymbolCapability> Symbol { get; set; }
4331

44-
[EditorBrowsable(EditorBrowsableState.Never)]
45-
public bool ShouldSerializeSymbol() => Symbol.IsSupported;
46-
4732
/// <summary>
4833
/// Capabilities specific to the `workspace/executeCommand` request.
4934
/// </summary>
5035
public Supports<ExecuteCommandCapability> ExecuteCommand { get; set; }
51-
52-
[EditorBrowsable(EditorBrowsableState.Never)]
53-
public bool ShouldSerializeExecuteCommand() => ExecuteCommand.IsSupported;
5436
}
5537
}

src/Protocol/Client/Capabilities/WorkspaceEditCapability.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Newtonsoft.Json;
1+
using Newtonsoft.Json;
22
using Newtonsoft.Json.Serialization;
33

44
namespace OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities
@@ -9,6 +9,6 @@ public class WorkspaceEditCapability
99
/// The client supports versioned document changes in `WorkspaceEdit`s
1010
/// </summary>
1111
[Optional]
12-
public bool? DocumentChanges { get; set; }
12+
public bool DocumentChanges { get; set; }
1313
}
1414
}

src/Protocol/Serialization/Converters/MarkedStringConverter.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using Newtonsoft.Json;
33
using Newtonsoft.Json.Linq;
44
using OmniSharp.Extensions.LanguageServer.Protocol.Models;
@@ -44,4 +44,4 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
4444

4545
public override bool CanConvert(Type objectType) => objectType == typeof(MarkedString);
4646
}
47-
}
47+
}

0 commit comments

Comments
 (0)