Skip to content

Fix/dap default serialization #400

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Oct 28, 2020
Merged
13 changes: 5 additions & 8 deletions src/Dap.Protocol/DapSerializer.cs
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using OmniSharp.Extensions.DebugAdapter.Protocol.DebugAdapterConverters;
using OmniSharp.Extensions.DebugAdapter.Protocol.Serialization;
using OmniSharp.Extensions.JsonRpc.Serialization;

namespace OmniSharp.Extensions.DebugAdapter.Protocol
{
public class DapSerializer : SerializerBase
#pragma warning disable 618
public class DapSerializer : DapProtocolSerializer
#pragma warning restore 618
{
protected override void AddOrReplaceConverters(ICollection<JsonConverter> converters)
{
ReplaceConverter(converters, new DapClientNotificationConverter(this));
ReplaceConverter(converters, new DapClientResponseConverter(this));
ReplaceConverter(converters, new DapClientRequestConverter());
ReplaceConverter(converters, new DapRpcErrorConverter(this));
}
}
}
4 changes: 3 additions & 1 deletion src/Dap.Protocol/DebugAdapterRpcOptionsBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using OmniSharp.Extensions.DebugAdapter.Protocol.Serialization;
using OmniSharp.Extensions.JsonRpc;
using ISerializer = OmniSharp.Extensions.JsonRpc.ISerializer;

namespace OmniSharp.Extensions.DebugAdapter.Protocol
{
Expand All @@ -15,7 +17,7 @@ protected DebugAdapterRpcOptionsBase()
RequestProcessIdentifier = new ParallelRequestProcessIdentifier();
}

public ISerializer Serializer { get; set; } = new DapSerializer();
public ISerializer Serializer { get; set; } = new DapProtocolSerializer();
internal bool AddDefaultLoggingProvider { get; set; }
internal Action<ILoggingBuilder> LoggingBuilderAction { get; set; } = _ => { };
internal Action<IConfigurationBuilder> ConfigurationBuilderAction { get; set; } = _ => { };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

namespace OmniSharp.Extensions.DebugAdapter.Protocol.Serialization
{
internal class ContractResolver : DefaultContractResolver
internal class DapContractResolver : DefaultContractResolver
{
public ContractResolver() => NamingStrategy = new CamelCaseNamingStrategy(true, false, true);
public DapContractResolver() => NamingStrategy = new CamelCaseNamingStrategy(true, false, true);

protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
Expand Down
15 changes: 11 additions & 4 deletions src/Dap.Protocol/Serialization/Serializer.cs
Original file line number Diff line number Diff line change
@@ -1,27 +1,34 @@
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using OmniSharp.Extensions.DebugAdapter.Protocol.DebugAdapterConverters;
using OmniSharp.Extensions.JsonRpc.Serialization;

namespace OmniSharp.Extensions.DebugAdapter.Protocol.Serialization
{
public class DapProtocolSerializer : DapSerializer, ISerializer
[Obsolete("DapProtocolSerializer will be removed in a future version, DapSerializer will be a drop in replacement")]
public class DapProtocolSerializer : SerializerBase, ISerializer
{
protected override void AddOrReplaceConverters(ICollection<JsonConverter> converters)
{
ReplaceConverter(converters, new NumberStringConverter());
base.AddOrReplaceConverters(converters);
ReplaceConverter(converters, new DapClientNotificationConverter(this));
ReplaceConverter(converters, new DapClientResponseConverter(this));
ReplaceConverter(converters, new DapClientRequestConverter());
ReplaceConverter(converters, new DapRpcErrorConverter(this));
}

protected override JsonSerializer CreateSerializer()
{
var serializer = base.CreateSerializer();
serializer.ContractResolver = new ContractResolver();
serializer.ContractResolver = new DapContractResolver();
return serializer;
}

protected override JsonSerializerSettings CreateSerializerSettings()
{
var settings = base.CreateSerializerSettings();
settings.ContractResolver = new ContractResolver();
settings.ContractResolver = new DapContractResolver();
return settings;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

namespace OmniSharp.Extensions.LanguageServer.Protocol.Serialization
{
internal class ContractResolver : DefaultContractResolver
internal class LspContractResolver : DefaultContractResolver
{
private readonly CompletionItemKind[] _completionItemKinds;
private readonly CompletionItemTag[] _completionItemTags;
Expand All @@ -22,7 +22,7 @@ internal class ContractResolver : DefaultContractResolver
private readonly DiagnosticTag[] _diagnosticTags;
private readonly CodeActionKind[] _codeActionKinds;

public ContractResolver(
public LspContractResolver(
CompletionItemKind[] completionItemKinds,
CompletionItemTag[] completionItemTags,
SymbolKind[] documentSymbolKinds,
Expand Down
8 changes: 4 additions & 4 deletions src/Protocol/Serialization/Serializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public Serializer() : this(ClientVersion.Lsp3)
protected override JsonSerializer CreateSerializer()
{
var serializer = base.CreateSerializer();
serializer.ContractResolver = new ContractResolver(
serializer.ContractResolver = new LspContractResolver(
DefaultCompletionItemKinds,
DefaultCompletionItemTags,
DefaultSymbolKinds,
Expand All @@ -70,7 +70,7 @@ protected override JsonSerializer CreateSerializer()
protected override JsonSerializerSettings CreateSerializerSettings()
{
var settings = base.CreateSerializerSettings();
settings.ContractResolver = new ContractResolver(
settings.ContractResolver = new LspContractResolver(
DefaultCompletionItemKinds,
DefaultCompletionItemTags,
DefaultSymbolKinds,
Expand Down Expand Up @@ -200,7 +200,7 @@ public void SetClientCapabilities(ClientVersion clientVersion, ClientCapabilitie


AddOrReplaceConverters(Settings.Converters);
Settings.ContractResolver = new ContractResolver(
Settings.ContractResolver = new LspContractResolver(
completionItemKinds,
completionItemTags,
documentSymbolKinds,
Expand All @@ -212,7 +212,7 @@ public void SetClientCapabilities(ClientVersion clientVersion, ClientCapabilitie
);

AddOrReplaceConverters(JsonSerializer.Converters);
JsonSerializer.ContractResolver = new ContractResolver(
JsonSerializer.ContractResolver = new LspContractResolver(
completionItemKinds,
completionItemTags,
documentSymbolKinds,
Expand Down
3 changes: 2 additions & 1 deletion test/Dap.Tests/DapOutputHandlerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Newtonsoft.Json.Linq;
using NSubstitute;
using OmniSharp.Extensions.DebugAdapter.Protocol;
using OmniSharp.Extensions.DebugAdapter.Protocol.Serialization;
using OmniSharp.Extensions.JsonRpc;
using OmniSharp.Extensions.JsonRpc.Client;
using OmniSharp.Extensions.JsonRpc.Server;
Expand All @@ -21,7 +22,7 @@ private static OutputHandler NewHandler(PipeWriter writer)
{
var rec = Substitute.For<IReceiver>();
rec.ShouldFilterOutput(Arg.Any<object>()).Returns(true);
return new OutputHandler(writer, new DapSerializer(), rec, Scheduler.Immediate, NullLogger<OutputHandler>.Instance);
return new OutputHandler(writer, new DapProtocolSerializer(), rec, Scheduler.Immediate, NullLogger<OutputHandler>.Instance);
}

[Fact]
Expand Down
20 changes: 18 additions & 2 deletions test/Dap.Tests/DebugAdapterSpecifictionRecieverTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
using FluentAssertions;
using Newtonsoft.Json.Linq;
using OmniSharp.Extensions.DebugAdapter.Protocol;
using OmniSharp.Extensions.DebugAdapter.Protocol.Requests;
using OmniSharp.Extensions.DebugAdapter.Protocol.Serialization;
using OmniSharp.Extensions.JsonRpc;
using OmniSharp.Extensions.JsonRpc.Server;
using OmniSharp.Extensions.JsonRpc.Server.Messages;
using Xunit;
Expand All @@ -15,8 +18,8 @@ public class DebugAdapterSpecificationReceiverTests
public void ShouldRespond_AsExpected(string json, Renor[] request)
{
var receiver = new DapReceiver();
var inSerializer = new DapSerializer();
var outSerializer = new DapSerializer();
var inSerializer = new DapProtocolSerializer();
var outSerializer = new DapProtocolSerializer();
var (requests, _) = receiver.GetRequests(JToken.Parse(json));
var result = requests.ToArray();
request.Length.Should().Be(result.Length);
Expand All @@ -31,6 +34,19 @@ public void ShouldRespond_AsExpected(string json, Renor[] request)
}
}

[Fact]
public void Should_Camel_Case_As_Expected()
{
var serializer = new DapProtocolSerializer();
var response = serializer.SerializeObject(
new InitializeResponse() {
SupportsCancelRequest = true
}
);

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}");
}

private class SpecificationMessages : TheoryData<string, Renor[]>
{
public SpecificationMessages()
Expand Down
16 changes: 8 additions & 8 deletions test/Dap.Tests/Integration/CustomRequestsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,9 @@ await client.RequestAttach(
var call = fake.ReceivedCalls().Single();
var args = call.GetArguments();
var request = args[0].Should().BeOfType<AttachRequestArguments>().Which;
request.ExtensionData.Should().ContainKey("ComputerName").And.Subject["ComputerName"].Should().Be("computer");
request.ExtensionData.Should().ContainKey("RunspaceId").And.Subject["RunspaceId"].Should().Be("1234");
request.ExtensionData.Should().ContainKey("ProcessId").And.Subject["ProcessId"].Should().Be("4321");
request.ExtensionData.Should().ContainKey("computerName").And.Subject["computerName"].Should().Be("computer");
request.ExtensionData.Should().ContainKey("runspaceId").And.Subject["runspaceId"].Should().Be("1234");
request.ExtensionData.Should().ContainKey("processId").And.Subject["processId"].Should().Be("4321");
}

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

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

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

[Fact]
Expand Down
2 changes: 1 addition & 1 deletion test/Lsp.Tests/Integration/TypedCodeActionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ public async Task Should_Resolve_With_Data_CancellationToken()
item.CodeAction!.Command!.Name.Should().Be("resolved");
}

[Fact]
[FactWithSkipOn(SkipOnPlatform.Mac)]
public async Task Should_Resolve_With_Partial_Data_CancellationToken()
{
var (client, _) = await Initialize(
Expand Down
2 changes: 1 addition & 1 deletion test/Lsp.Tests/Integration/TypedCodeLensTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ public async Task Should_Resolve_With_Data_CancellationToken()
item.Command!.Name.Should().Be("resolved");
}

[Fact]
[FactWithSkipOn(SkipOnPlatform.Mac)]
public async Task Should_Resolve_With_Partial_Data_CancellationToken()
{
var (client, _) = await Initialize(
Expand Down
2 changes: 1 addition & 1 deletion test/Lsp.Tests/Integration/TypedCompletionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ public async Task Should_Resolve_With_Data_CancellationToken()
item.Detail.Should().Be("resolved");
}

[Fact]
[FactWithSkipOn(SkipOnPlatform.Mac)]
public async Task Should_Resolve_With_Partial_Data_CancellationToken()
{
var (client, _) = await Initialize(
Expand Down
2 changes: 1 addition & 1 deletion test/Lsp.Tests/Integration/TypedDocumentLinkTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ public async Task Should_Resolve_With_Data_CancellationToken()
item.Tooltip.Should().Be("resolved");
}

[Fact]
[FactWithSkipOn(SkipOnPlatform.Mac)]
public async Task Should_Resolve_With_Partial_Data_CancellationToken()
{
var (client, _) = await Initialize(
Expand Down