Skip to content

Commit 4cae6dd

Browse files
Updated serializer changes
1 parent 4131f00 commit 4cae6dd

File tree

123 files changed

+317
-195
lines changed

Some content is hidden

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

123 files changed

+317
-195
lines changed

src/Client/Protocol/LspConnection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ public LspConnection(ILoggerFactory loggerFactory, Stream input, Stream output)
160160
_input = input;
161161
_output = output;
162162
// What does client version do? Do we have to negotaite this?
163-
_jsonSerializerSettings = Serializer.CreateSerializerSettings(ClientVersion.Lsp3);
163+
_jsonSerializerSettings = new Serializer(ClientVersion.Lsp3).Settings;
164164
}
165165

166166
/// <summary>

src/JsonRpc/Connection.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.IO;
33
using Microsoft.Extensions.Logging;
4+
using OmniSharp.Extensions.LanguageServer.Protocol;
45

56
namespace OmniSharp.Extensions.JsonRpc
67
{
@@ -16,7 +17,8 @@ public Connection(
1617
IRequestProcessIdentifier requestProcessIdentifier,
1718
IRequestRouter requestRouter,
1819
IResponseRouter responseRouter,
19-
ILoggerFactory loggerFactory)
20+
ILoggerFactory loggerFactory,
21+
ISerializer serializer)
2022
{
2123
_requestRouter = requestRouter;
2224

@@ -27,7 +29,8 @@ public Connection(
2729
requestProcessIdentifier,
2830
requestRouter,
2931
responseRouter,
30-
loggerFactory
32+
loggerFactory,
33+
serializer
3134
);
3235
}
3336

src/JsonRpc/ISerializer.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using Newtonsoft.Json;
2+
3+
namespace OmniSharp.Extensions.LanguageServer.Protocol
4+
{
5+
public interface ISerializer
6+
{
7+
JsonSerializer JsonSerializer { get; }
8+
JsonSerializerSettings Settings { get; }
9+
string SerializeObject(object value);
10+
object DeserializeObject(string json);
11+
T DeserializeObject<T>(string json);
12+
}
13+
}

src/JsonRpc/InputHandler.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Newtonsoft.Json;
99
using OmniSharp.Extensions.JsonRpc.Server;
1010
using OmniSharp.Extensions.JsonRpc.Server.Messages;
11+
using OmniSharp.Extensions.LanguageServer.Protocol;
1112

1213
namespace OmniSharp.Extensions.JsonRpc
1314
{
@@ -26,7 +27,7 @@ public class InputHandler : IInputHandler
2627
private Thread _inputThread;
2728
private readonly IRequestRouter _requestRouter;
2829
private readonly IResponseRouter _responseRouter;
29-
private readonly JsonSerializerSettings _jsonSerializerSettings;
30+
private readonly ISerializer _serializer;
3031
private readonly ILogger<InputHandler> _logger;
3132
private readonly IScheduler _scheduler;
3233

@@ -38,7 +39,7 @@ public InputHandler(
3839
IRequestRouter requestRouter,
3940
IResponseRouter responseRouter,
4041
ILoggerFactory loggerFactory,
41-
JsonSerializerSettings jsonSerializerSettings
42+
ISerializer serializer
4243
)
4344
{
4445
if (!input.CanRead) throw new ArgumentException($"must provide a readable stream for {nameof(input)}", nameof(input));
@@ -48,7 +49,7 @@ JsonSerializerSettings jsonSerializerSettings
4849
_requestProcessIdentifier = requestProcessIdentifier;
4950
_requestRouter = requestRouter;
5051
_responseRouter = responseRouter;
51-
_jsonSerializerSettings = jsonSerializerSettings;
52+
_serializer = serializer;
5253
_logger = loggerFactory.CreateLogger<InputHandler>();
5354
_scheduler = new ProcessScheduler(loggerFactory);
5455
_inputThread = new Thread(ProcessInputStream) { IsBackground = true, Name = "ProcessInputStream" };
@@ -158,7 +159,7 @@ private void HandleRequest(string request)
158159
}
159160
else if (response is ServerError serverError)
160161
{
161-
tcs.SetException(new Exception(JsonConvert.SerializeObject(serverError.Error, _jsonSerializerSettings)));
162+
tcs.SetException(new Exception(_serializer.SerializeObject(serverError.Error)));
162163
}
163164
}
164165

src/JsonRpc/OutputHandler.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,23 @@
33
using System.IO;
44
using System.Text;
55
using System.Threading;
6-
using Newtonsoft.Json;
6+
using OmniSharp.Extensions.LanguageServer.Protocol;
77

88
namespace OmniSharp.Extensions.JsonRpc
99
{
1010
public class OutputHandler : IOutputHandler
1111
{
1212
private readonly Stream _output;
13-
private readonly JsonSerializerSettings _jsonSerializerSettings;
13+
private readonly ISerializer _serializer;
1414
private readonly Thread _thread;
1515
private readonly BlockingCollection<object> _queue;
1616
private readonly CancellationTokenSource _cancel;
1717

18-
public OutputHandler(Stream output, JsonSerializerSettings jsonSerializerSettings)
18+
public OutputHandler(Stream output, ISerializer serializer)
1919
{
2020
if (!output.CanWrite) throw new ArgumentException($"must provide a writable stream for {nameof(output)}", nameof(output));
2121
_output = output;
22-
_jsonSerializerSettings = jsonSerializerSettings;
22+
_serializer = serializer;
2323
_queue = new BlockingCollection<object>();
2424
_cancel = new CancellationTokenSource();
2525
_thread = new Thread(ProcessOutputQueue) { IsBackground = true, Name = "ProcessOutputQueue" };
@@ -44,7 +44,7 @@ private void ProcessOutputQueue()
4444
{
4545
if (_queue.TryTake(out var value, Timeout.Infinite, token))
4646
{
47-
var content = JsonConvert.SerializeObject(value, _jsonSerializerSettings);
47+
var content = _serializer.SerializeObject(value);
4848
var contentBytes = System.Text.Encoding.UTF8.GetBytes(content);
4949

5050
// TODO: Is this lsp specific??

src/JsonRpc/Serializer.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using Newtonsoft.Json;
2+
using OmniSharp.Extensions.LanguageServer.Protocol;
3+
4+
namespace OmniSharp.Extensions.JsonRpc
5+
{
6+
class Serializer : ISerializer
7+
{
8+
public Serializer()
9+
{
10+
JsonSerializer = CreateSerializer();
11+
Settings = CreateSerializerSettings();
12+
}
13+
14+
private static JsonSerializer CreateSerializer()
15+
{
16+
var serializer = JsonSerializer.CreateDefault();
17+
return serializer;
18+
}
19+
20+
private static JsonSerializerSettings CreateSerializerSettings()
21+
{
22+
var settings = JsonConvert.DefaultSettings != null ? JsonConvert.DefaultSettings() : new JsonSerializerSettings();
23+
return settings;
24+
}
25+
26+
public JsonSerializer JsonSerializer { get; }
27+
28+
public JsonSerializerSettings Settings { get; }
29+
30+
public string SerializeObject(object value)
31+
{
32+
return JsonConvert.SerializeObject(value, Settings);
33+
}
34+
35+
public object DeserializeObject(string json)
36+
{
37+
return JsonConvert.DeserializeObject(json, Settings);
38+
}
39+
40+
public T DeserializeObject<T>(string json)
41+
{
42+
return JsonConvert.DeserializeObject<T>(json, Settings);
43+
}
44+
}
45+
}

src/Protocol/Models/SignatureHelp.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ public class SignatureHelp
1919
/// The active signature.
2020
/// </summary>
2121
[Optional]
22-
public long ActiveSignature { get; set; }
22+
public int ActiveSignature { get; set; }
2323

2424
/// <summary>
2525
/// The active parameter of the active signature.
2626
/// </summary>
2727
[Optional]
28-
public long ActiveParameter { get; set; }
28+
public int ActiveParameter { get; set; }
2929
}
3030
}

src/Protocol/Models/TextDocumentContentChangeEvent.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class TextDocumentContentChangeEvent
1919
/// The length of the range that got replaced.
2020
/// </summary>
2121
[Optional]
22-
public long RangeLength { get; set; }
22+
public int RangeLength { get; set; }
2323

2424
/// <summary>
2525
/// The new text of the document.

src/Protocol/Serialization/Serializer.cs

Lines changed: 68 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,46 +9,84 @@
99

1010
namespace OmniSharp.Extensions.LanguageServer.Protocol
1111
{
12-
public static class Serializer
12+
public class Serializer : ISerializer
1313
{
14-
public static JsonSerializer CreateSerializer(ClientVersion version)
14+
public Serializer() : this(ClientVersion.Lsp3) { }
15+
public Serializer(ClientVersion clientVersion)
16+
{
17+
JsonSerializer = CreateSerializer(clientVersion);
18+
Settings = CreateSerializerSettings(clientVersion);
19+
}
20+
21+
private static JsonSerializer CreateSerializer(ClientVersion version)
1522
{
1623
var serializer = JsonSerializer.CreateDefault();
1724
serializer.ContractResolver = new ContractResolver();
18-
19-
serializer.Converters.Add(new SupportsConverter());
20-
serializer.Converters.Add(new CompletionListConverter());
21-
serializer.Converters.Add(new DiagnosticCodeConverter());
22-
serializer.Converters.Add(new LocationOrLocationsConverter());
23-
serializer.Converters.Add(new MarkedStringCollectionConverter());
24-
serializer.Converters.Add(new MarkedStringConverter());
25-
serializer.Converters.Add(new StringOrMarkupContentConverter());
26-
serializer.Converters.Add(new TextDocumentSyncConverter());
27-
serializer.Converters.Add(new BooleanNumberStringConverter());
28-
serializer.Converters.Add(new MarkedStringsOrMarkupContentConverter());
25+
AddOrReplaceConverters(serializer.Converters, version);
2926

3027
return serializer;
3128
}
3229

33-
public static JsonSerializerSettings CreateSerializerSettings(ClientVersion version)
30+
private static JsonSerializerSettings CreateSerializerSettings(ClientVersion version)
3431
{
3532
var settings = JsonConvert.DefaultSettings != null ? JsonConvert.DefaultSettings() : new JsonSerializerSettings();
36-
3733
settings.ContractResolver = new ContractResolver();
38-
39-
settings.Converters.Add(new SupportsConverter());
40-
settings.Converters.Add(new CompletionListConverter());
41-
settings.Converters.Add(new DiagnosticCodeConverter());
42-
settings.Converters.Add(new LocationOrLocationsConverter());
43-
settings.Converters.Add(new MarkedStringCollectionConverter());
44-
settings.Converters.Add(new MarkedStringConverter());
45-
settings.Converters.Add(new StringOrMarkupContentConverter());
46-
settings.Converters.Add(new TextDocumentSyncConverter());
47-
settings.Converters.Add(new BooleanNumberStringConverter());
48-
settings.Converters.Add(new MarkedStringsOrMarkupContentConverter());
34+
AddOrReplaceConverters(settings.Converters, version);
4935

5036
return settings;
5137
}
38+
39+
private static void AddOrReplaceConverters(ICollection<JsonConverter> converters, ClientVersion version)
40+
{
41+
ReplaceConverter(converters, new SupportsConverter());
42+
ReplaceConverter(converters, new CompletionListConverter());
43+
ReplaceConverter(converters, new DiagnosticCodeConverter());
44+
ReplaceConverter(converters, new LocationOrLocationsConverter());
45+
ReplaceConverter(converters, new MarkedStringCollectionConverter());
46+
ReplaceConverter(converters, new MarkedStringConverter());
47+
ReplaceConverter(converters, new StringOrMarkupContentConverter());
48+
ReplaceConverter(converters, new TextDocumentSyncConverter());
49+
ReplaceConverter(converters, new BooleanNumberStringConverter());
50+
ReplaceConverter(converters, new MarkedStringsOrMarkupContentConverter());
51+
}
52+
53+
private static void ReplaceConverter<T>(ICollection<JsonConverter> converters, T item)
54+
where T : JsonConverter
55+
{
56+
var existingConverters = converters.OfType<T>().ToArray();
57+
if (existingConverters.Any())
58+
{
59+
foreach (var converter in existingConverters)
60+
converters.Remove(converter);
61+
}
62+
converters.Add(item);
63+
}
64+
65+
public JsonSerializer JsonSerializer { get; }
66+
67+
public JsonSerializerSettings Settings { get; }
68+
69+
public string SerializeObject(object value)
70+
{
71+
return JsonConvert.SerializeObject(value, Settings);
72+
}
73+
74+
public object DeserializeObject(string json)
75+
{
76+
return JsonConvert.DeserializeObject(json, Settings);
77+
}
78+
79+
public T DeserializeObject<T>(string json)
80+
{
81+
return JsonConvert.DeserializeObject<T>(json, Settings);
82+
}
83+
84+
public Serializer SetClientVersion(ClientVersion clientVersion)
85+
{
86+
AddOrReplaceConverters(Settings.Converters, clientVersion);
87+
AddOrReplaceConverters(JsonSerializer.Converters, clientVersion);
88+
return this;
89+
}
5290
}
5391

5492
[AttributeUsage(AttributeTargets.Property)]
@@ -87,10 +125,10 @@ protected override JsonProperty CreateProperty(MemberInfo member, MemberSerializ
87125
var property = base.CreateProperty(member, memberSerialization);
88126
//if (property.DeclaringType.Name.EndsWith("Capability")) return property;
89127
// if (property.PropertyType.GetTypeInfo().IsGenericType)
90-
if (
91-
member.GetCustomAttributes<OptionalAttribute>().Any()
92-
|| property.DeclaringType.Name.EndsWith("Capabilities")
93-
)
128+
if (
129+
member.GetCustomAttributes<OptionalAttribute>().Any()
130+
|| property.DeclaringType.Name.EndsWith("Capabilities")
131+
)
94132
{
95133
property.NullValueHandling = NullValueHandling.Ignore;
96134
// property.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate;

src/Server/LanguageServer.cs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,31 +30,43 @@ public class LanguageServer : ILanguageServer, IInitializeHandler, IInitializedH
3030
private readonly IResponseRouter _responseRouter;
3131
private readonly LspReciever _reciever;
3232
private readonly ILoggerFactory _loggerFactory;
33+
private readonly Serializer _serializer;
3334
private readonly TaskCompletionSource<InitializeResult> _initializeComplete = new TaskCompletionSource<InitializeResult>();
3435
private readonly CompositeDisposable _disposable = new CompositeDisposable();
3536
private readonly HandlerMatcherCollection _handlerMactherCollection;
3637

37-
public LanguageServer(Stream input, Stream output, ILoggerFactory loggerFactory)
38-
: this(input, new OutputHandler(output), new LspReciever(), new RequestProcessIdentifier(), loggerFactory)
38+
public LanguageServer(
39+
Stream input,
40+
Stream output,
41+
ILoggerFactory loggerFactory)
42+
: this(input, output, new LspReciever(), new RequestProcessIdentifier(), loggerFactory, new Serializer())
3943
{
4044
}
4145

42-
internal LanguageServer(Stream input, IOutputHandler output, LspReciever reciever, IRequestProcessIdentifier requestProcessIdentifier, ILoggerFactory loggerFactory)
46+
internal LanguageServer(
47+
Stream input,
48+
Stream output,
49+
LspReciever reciever,
50+
IRequestProcessIdentifier requestProcessIdentifier,
51+
ILoggerFactory loggerFactory,
52+
Serializer serializer)
4353
{
54+
var outputHandler = new OutputHandler(output, serializer);
4455
// TODO: This might not be the best
4556
loggerFactory.AddProvider(new LanguageServerLoggerProvider(this));
4657

4758
_reciever = reciever;
4859
_loggerFactory = loggerFactory;
60+
_serializer = serializer;
4961
_handlerMactherCollection = new HandlerMatcherCollection
5062
{
5163
new TextDocumentMatcher(_loggerFactory.CreateLogger<TextDocumentMatcher>()),
5264
new ExecuteCommandMatcher(_loggerFactory.CreateLogger<ExecuteCommandMatcher>())
5365
};
5466

5567
_requestRouter = new LspRequestRouter(_collection, loggerFactory, _handlerMactherCollection);
56-
_responseRouter = new ResponseRouter(output);
57-
_connection = new Connection(input, output, reciever, requestProcessIdentifier, _requestRouter, _responseRouter, loggerFactory);
68+
_responseRouter = new ResponseRouter(outputHandler);
69+
_connection = new Connection(input, outputHandler, reciever, requestProcessIdentifier, _requestRouter, _responseRouter, loggerFactory, serializer);
5870

5971
_exitHandler = new ExitHandler(_shutdownHandler);
6072

@@ -141,6 +153,7 @@ async Task<InitializeResult> IRequestHandler<InitializeParams, InitializeResult>
141153
await Task.WhenAll(_initializeDelegates.Select(c => c(request)));
142154

143155
_clientVersion = request.Capabilities.GetClientVersion();
156+
_serializer.SetClientVersion(_clientVersion.Value);
144157

145158
if (_clientVersion == ClientVersion.Lsp3)
146159
{

0 commit comments

Comments
 (0)