Skip to content

Commit c7d334c

Browse files
Fix/dap default serialization (#400)
* the default Debug Adapter Protocol serializer was not set for camelcase * fixed failing tests
1 parent 42e9804 commit c7d334c

13 files changed

+59
-36
lines changed

src/Dap.Protocol/DapSerializer.cs

+5-8
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
1+
using System;
12
using System.Collections.Generic;
23
using Newtonsoft.Json;
34
using OmniSharp.Extensions.DebugAdapter.Protocol.DebugAdapterConverters;
5+
using OmniSharp.Extensions.DebugAdapter.Protocol.Serialization;
46
using OmniSharp.Extensions.JsonRpc.Serialization;
57

68
namespace OmniSharp.Extensions.DebugAdapter.Protocol
79
{
8-
public class DapSerializer : SerializerBase
10+
#pragma warning disable 618
11+
public class DapSerializer : DapProtocolSerializer
12+
#pragma warning restore 618
913
{
10-
protected override void AddOrReplaceConverters(ICollection<JsonConverter> converters)
11-
{
12-
ReplaceConverter(converters, new DapClientNotificationConverter(this));
13-
ReplaceConverter(converters, new DapClientResponseConverter(this));
14-
ReplaceConverter(converters, new DapClientRequestConverter());
15-
ReplaceConverter(converters, new DapRpcErrorConverter(this));
16-
}
1714
}
1815
}

src/Dap.Protocol/DebugAdapterRpcOptionsBase.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
using Microsoft.Extensions.Configuration;
33
using Microsoft.Extensions.DependencyInjection;
44
using Microsoft.Extensions.Logging;
5+
using OmniSharp.Extensions.DebugAdapter.Protocol.Serialization;
56
using OmniSharp.Extensions.JsonRpc;
7+
using ISerializer = OmniSharp.Extensions.JsonRpc.ISerializer;
68

79
namespace OmniSharp.Extensions.DebugAdapter.Protocol
810
{
@@ -15,7 +17,7 @@ protected DebugAdapterRpcOptionsBase()
1517
RequestProcessIdentifier = new ParallelRequestProcessIdentifier();
1618
}
1719

18-
public ISerializer Serializer { get; set; } = new DapSerializer();
20+
public ISerializer Serializer { get; set; } = new DapProtocolSerializer();
1921
internal bool AddDefaultLoggingProvider { get; set; }
2022
internal Action<ILoggingBuilder> LoggingBuilderAction { get; set; } = _ => { };
2123
internal Action<IConfigurationBuilder> ConfigurationBuilderAction { get; set; } = _ => { };

src/Dap.Protocol/Serialization/ContractResolver.cs renamed to src/Dap.Protocol/Serialization/DapContractResolver.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
namespace OmniSharp.Extensions.DebugAdapter.Protocol.Serialization
77
{
8-
internal class ContractResolver : DefaultContractResolver
8+
internal class DapContractResolver : DefaultContractResolver
99
{
10-
public ContractResolver() => NamingStrategy = new CamelCaseNamingStrategy(true, false, true);
10+
public DapContractResolver() => NamingStrategy = new CamelCaseNamingStrategy(true, false, true);
1111

1212
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
1313
{

src/Dap.Protocol/Serialization/Serializer.cs

+11-4
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,34 @@
1+
using System;
12
using System.Collections.Generic;
23
using Newtonsoft.Json;
4+
using OmniSharp.Extensions.DebugAdapter.Protocol.DebugAdapterConverters;
5+
using OmniSharp.Extensions.JsonRpc.Serialization;
36

47
namespace OmniSharp.Extensions.DebugAdapter.Protocol.Serialization
58
{
6-
public class DapProtocolSerializer : DapSerializer, ISerializer
9+
[Obsolete("DapProtocolSerializer will be removed in a future version, DapSerializer will be a drop in replacement")]
10+
public class DapProtocolSerializer : SerializerBase, ISerializer
711
{
812
protected override void AddOrReplaceConverters(ICollection<JsonConverter> converters)
913
{
1014
ReplaceConverter(converters, new NumberStringConverter());
11-
base.AddOrReplaceConverters(converters);
15+
ReplaceConverter(converters, new DapClientNotificationConverter(this));
16+
ReplaceConverter(converters, new DapClientResponseConverter(this));
17+
ReplaceConverter(converters, new DapClientRequestConverter());
18+
ReplaceConverter(converters, new DapRpcErrorConverter(this));
1219
}
1320

1421
protected override JsonSerializer CreateSerializer()
1522
{
1623
var serializer = base.CreateSerializer();
17-
serializer.ContractResolver = new ContractResolver();
24+
serializer.ContractResolver = new DapContractResolver();
1825
return serializer;
1926
}
2027

2128
protected override JsonSerializerSettings CreateSerializerSettings()
2229
{
2330
var settings = base.CreateSerializerSettings();
24-
settings.ContractResolver = new ContractResolver();
31+
settings.ContractResolver = new DapContractResolver();
2532
return settings;
2633
}
2734
}

src/Protocol/Serialization/ContractResolver.cs renamed to src/Protocol/Serialization/LspContractResolver.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
namespace OmniSharp.Extensions.LanguageServer.Protocol.Serialization
1313
{
14-
internal class ContractResolver : DefaultContractResolver
14+
internal class LspContractResolver : DefaultContractResolver
1515
{
1616
private readonly CompletionItemKind[] _completionItemKinds;
1717
private readonly CompletionItemTag[] _completionItemTags;
@@ -22,7 +22,7 @@ internal class ContractResolver : DefaultContractResolver
2222
private readonly DiagnosticTag[] _diagnosticTags;
2323
private readonly CodeActionKind[] _codeActionKinds;
2424

25-
public ContractResolver(
25+
public LspContractResolver(
2626
CompletionItemKind[] completionItemKinds,
2727
CompletionItemTag[] completionItemTags,
2828
SymbolKind[] documentSymbolKinds,

src/Protocol/Serialization/Serializer.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public Serializer() : this(ClientVersion.Lsp3)
5454
protected override JsonSerializer CreateSerializer()
5555
{
5656
var serializer = base.CreateSerializer();
57-
serializer.ContractResolver = new ContractResolver(
57+
serializer.ContractResolver = new LspContractResolver(
5858
DefaultCompletionItemKinds,
5959
DefaultCompletionItemTags,
6060
DefaultSymbolKinds,
@@ -70,7 +70,7 @@ protected override JsonSerializer CreateSerializer()
7070
protected override JsonSerializerSettings CreateSerializerSettings()
7171
{
7272
var settings = base.CreateSerializerSettings();
73-
settings.ContractResolver = new ContractResolver(
73+
settings.ContractResolver = new LspContractResolver(
7474
DefaultCompletionItemKinds,
7575
DefaultCompletionItemTags,
7676
DefaultSymbolKinds,
@@ -200,7 +200,7 @@ public void SetClientCapabilities(ClientVersion clientVersion, ClientCapabilitie
200200

201201

202202
AddOrReplaceConverters(Settings.Converters);
203-
Settings.ContractResolver = new ContractResolver(
203+
Settings.ContractResolver = new LspContractResolver(
204204
completionItemKinds,
205205
completionItemTags,
206206
documentSymbolKinds,
@@ -212,7 +212,7 @@ public void SetClientCapabilities(ClientVersion clientVersion, ClientCapabilitie
212212
);
213213

214214
AddOrReplaceConverters(JsonSerializer.Converters);
215-
JsonSerializer.ContractResolver = new ContractResolver(
215+
JsonSerializer.ContractResolver = new LspContractResolver(
216216
completionItemKinds,
217217
completionItemTags,
218218
documentSymbolKinds,

test/Dap.Tests/DapOutputHandlerTests.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Newtonsoft.Json.Linq;
88
using NSubstitute;
99
using OmniSharp.Extensions.DebugAdapter.Protocol;
10+
using OmniSharp.Extensions.DebugAdapter.Protocol.Serialization;
1011
using OmniSharp.Extensions.JsonRpc;
1112
using OmniSharp.Extensions.JsonRpc.Client;
1213
using OmniSharp.Extensions.JsonRpc.Server;
@@ -21,7 +22,7 @@ private static OutputHandler NewHandler(PipeWriter writer)
2122
{
2223
var rec = Substitute.For<IReceiver>();
2324
rec.ShouldFilterOutput(Arg.Any<object>()).Returns(true);
24-
return new OutputHandler(writer, new DapSerializer(), rec, Scheduler.Immediate, NullLogger<OutputHandler>.Instance);
25+
return new OutputHandler(writer, new DapProtocolSerializer(), rec, Scheduler.Immediate, NullLogger<OutputHandler>.Instance);
2526
}
2627

2728
[Fact]

test/Dap.Tests/DebugAdapterSpecifictionRecieverTests.cs

+18-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
using FluentAssertions;
33
using Newtonsoft.Json.Linq;
44
using OmniSharp.Extensions.DebugAdapter.Protocol;
5+
using OmniSharp.Extensions.DebugAdapter.Protocol.Requests;
6+
using OmniSharp.Extensions.DebugAdapter.Protocol.Serialization;
7+
using OmniSharp.Extensions.JsonRpc;
58
using OmniSharp.Extensions.JsonRpc.Server;
69
using OmniSharp.Extensions.JsonRpc.Server.Messages;
710
using Xunit;
@@ -15,8 +18,8 @@ public class DebugAdapterSpecificationReceiverTests
1518
public void ShouldRespond_AsExpected(string json, Renor[] request)
1619
{
1720
var receiver = new DapReceiver();
18-
var inSerializer = new DapSerializer();
19-
var outSerializer = new DapSerializer();
21+
var inSerializer = new DapProtocolSerializer();
22+
var outSerializer = new DapProtocolSerializer();
2023
var (requests, _) = receiver.GetRequests(JToken.Parse(json));
2124
var result = requests.ToArray();
2225
request.Length.Should().Be(result.Length);
@@ -31,6 +34,19 @@ public void ShouldRespond_AsExpected(string json, Renor[] request)
3134
}
3235
}
3336

37+
[Fact]
38+
public void Should_Camel_Case_As_Expected()
39+
{
40+
var serializer = new DapProtocolSerializer();
41+
var response = serializer.SerializeObject(
42+
new InitializeResponse() {
43+
SupportsCancelRequest = true
44+
}
45+
);
46+
47+
response.Should().Be("{\"supportsConfigurationDoneRequest\":false,\"supportsFunctionBreakpoints\":false,\"supportsConditionalBreakpoints\":false,\"supportsHitConditionalBreakpoints\":false,\"supportsEvaluateForHovers\":false,\"supportsStepBack\":false,\"supportsSetVariable\":false,\"supportsRestartFrame\":false,\"supportsGotoTargetsRequest\":false,\"supportsStepInTargetsRequest\":false,\"supportsCompletionsRequest\":false,\"supportsModulesRequest\":false,\"supportsRestartRequest\":false,\"supportsExceptionOptions\":false,\"supportsValueFormattingOptions\":false,\"supportsExceptionInfoRequest\":false,\"supportTerminateDebuggee\":false,\"supportsDelayedStackTraceLoading\":false,\"supportsLoadedSourcesRequest\":false,\"supportsLogPoints\":false,\"supportsTerminateThreadsRequest\":false,\"supportsSetExpression\":false,\"supportsTerminateRequest\":false,\"supportsDataBreakpoints\":false,\"supportsReadMemoryRequest\":false,\"supportsDisassembleRequest\":false,\"supportsCancelRequest\":true,\"supportsBreakpointLocationsRequest\":false,\"supportsClipboardContext\":false,\"supportsSteppingGranularity\":false,\"supportsInstructionBreakpoints\":false}");
48+
}
49+
3450
private class SpecificationMessages : TheoryData<string, Renor[]>
3551
{
3652
public SpecificationMessages()

test/Dap.Tests/Integration/CustomRequestsTests.cs

+8-8
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ await client.RequestAttach(
5858
var call = fake.ReceivedCalls().Single();
5959
var args = call.GetArguments();
6060
var request = args[0].Should().BeOfType<AttachRequestArguments>().Which;
61-
request.ExtensionData.Should().ContainKey("ComputerName").And.Subject["ComputerName"].Should().Be("computer");
62-
request.ExtensionData.Should().ContainKey("RunspaceId").And.Subject["RunspaceId"].Should().Be("1234");
63-
request.ExtensionData.Should().ContainKey("ProcessId").And.Subject["ProcessId"].Should().Be("4321");
61+
request.ExtensionData.Should().ContainKey("computerName").And.Subject["computerName"].Should().Be("computer");
62+
request.ExtensionData.Should().ContainKey("runspaceId").And.Subject["runspaceId"].Should().Be("1234");
63+
request.ExtensionData.Should().ContainKey("processId").And.Subject["processId"].Should().Be("4321");
6464
}
6565

6666
[Fact]
@@ -120,7 +120,7 @@ await client.RequestLaunch(
120120
var call = fake.ReceivedCalls().Single();
121121
var args = call.GetArguments();
122122
var request = args[0].Should().BeOfType<LaunchRequestArguments>().Which;
123-
request.ExtensionData.Should().ContainKey("Script").And.Subject["Script"].Should().Be("build.ps1");
123+
request.ExtensionData.Should().ContainKey("script").And.Subject["script"].Should().Be("build.ps1");
124124
}
125125

126126
[Fact]
@@ -182,9 +182,9 @@ await client.RequestAttach(
182182
var call = fake.ReceivedCalls().Single();
183183
var args = call.GetArguments();
184184
var request = args[0].Should().BeOfType<AttachRequestArguments>().Which;
185-
request.ExtensionData.Should().ContainKey("ComputerName").And.Subject["ComputerName"].Should().Be("computer");
186-
request.ExtensionData.Should().ContainKey("RunspaceId").And.Subject["RunspaceId"].Should().Be("1234");
187-
request.ExtensionData.Should().ContainKey("ProcessId").And.Subject["ProcessId"].Should().Be("4321");
185+
request.ExtensionData.Should().ContainKey("computerName").And.Subject["computerName"].Should().Be("computer");
186+
request.ExtensionData.Should().ContainKey("runspaceId").And.Subject["runspaceId"].Should().Be("1234");
187+
request.ExtensionData.Should().ContainKey("processId").And.Subject["processId"].Should().Be("4321");
188188
}
189189

190190
[Fact]
@@ -244,7 +244,7 @@ await client.RequestLaunch(
244244
var call = fake.ReceivedCalls().Single();
245245
var args = call.GetArguments();
246246
var request = args[0].Should().BeOfType<LaunchRequestArguments>().Which;
247-
request.ExtensionData.Should().ContainKey("Script").And.Subject["Script"].Should().Be("build.ps1");
247+
request.ExtensionData.Should().ContainKey("script").And.Subject["script"].Should().Be("build.ps1");
248248
}
249249

250250
[Fact]

test/Lsp.Tests/Integration/TypedCodeActionTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ public async Task Should_Resolve_With_Data_CancellationToken()
297297
item.CodeAction!.Command!.Name.Should().Be("resolved");
298298
}
299299

300-
[Fact]
300+
[FactWithSkipOn(SkipOnPlatform.Mac)]
301301
public async Task Should_Resolve_With_Partial_Data_CancellationToken()
302302
{
303303
var (client, _) = await Initialize(

test/Lsp.Tests/Integration/TypedCodeLensTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ public async Task Should_Resolve_With_Data_CancellationToken()
284284
item.Command!.Name.Should().Be("resolved");
285285
}
286286

287-
[Fact]
287+
[FactWithSkipOn(SkipOnPlatform.Mac)]
288288
public async Task Should_Resolve_With_Partial_Data_CancellationToken()
289289
{
290290
var (client, _) = await Initialize(

test/Lsp.Tests/Integration/TypedCompletionTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ public async Task Should_Resolve_With_Data_CancellationToken()
284284
item.Detail.Should().Be("resolved");
285285
}
286286

287-
[Fact]
287+
[FactWithSkipOn(SkipOnPlatform.Mac)]
288288
public async Task Should_Resolve_With_Partial_Data_CancellationToken()
289289
{
290290
var (client, _) = await Initialize(

test/Lsp.Tests/Integration/TypedDocumentLinkTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ public async Task Should_Resolve_With_Data_CancellationToken()
261261
item.Tooltip.Should().Be("resolved");
262262
}
263263

264-
[Fact]
264+
[FactWithSkipOn(SkipOnPlatform.Mac)]
265265
public async Task Should_Resolve_With_Partial_Data_CancellationToken()
266266
{
267267
var (client, _) = await Initialize(

0 commit comments

Comments
 (0)