diff --git a/src/Dap.Protocol/DapSerializer.cs b/src/Dap.Protocol/DapSerializer.cs index 6619812b0..9e6430618 100644 --- a/src/Dap.Protocol/DapSerializer.cs +++ b/src/Dap.Protocol/DapSerializer.cs @@ -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 converters) - { - ReplaceConverter(converters, new DapClientNotificationConverter(this)); - ReplaceConverter(converters, new DapClientResponseConverter(this)); - ReplaceConverter(converters, new DapClientRequestConverter()); - ReplaceConverter(converters, new DapRpcErrorConverter(this)); - } } } diff --git a/src/Dap.Protocol/DebugAdapterRpcOptionsBase.cs b/src/Dap.Protocol/DebugAdapterRpcOptionsBase.cs index b73837ba1..93a5b5d97 100644 --- a/src/Dap.Protocol/DebugAdapterRpcOptionsBase.cs +++ b/src/Dap.Protocol/DebugAdapterRpcOptionsBase.cs @@ -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 { @@ -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 LoggingBuilderAction { get; set; } = _ => { }; internal Action ConfigurationBuilderAction { get; set; } = _ => { }; diff --git a/src/Dap.Protocol/Serialization/ContractResolver.cs b/src/Dap.Protocol/Serialization/DapContractResolver.cs similarity index 80% rename from src/Dap.Protocol/Serialization/ContractResolver.cs rename to src/Dap.Protocol/Serialization/DapContractResolver.cs index edf3fb36a..116f07d56 100644 --- a/src/Dap.Protocol/Serialization/ContractResolver.cs +++ b/src/Dap.Protocol/Serialization/DapContractResolver.cs @@ -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) { diff --git a/src/Dap.Protocol/Serialization/Serializer.cs b/src/Dap.Protocol/Serialization/Serializer.cs index 8bed33a7c..3fba6c996 100644 --- a/src/Dap.Protocol/Serialization/Serializer.cs +++ b/src/Dap.Protocol/Serialization/Serializer.cs @@ -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 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; } } diff --git a/src/Protocol/Serialization/ContractResolver.cs b/src/Protocol/Serialization/LspContractResolver.cs similarity index 98% rename from src/Protocol/Serialization/ContractResolver.cs rename to src/Protocol/Serialization/LspContractResolver.cs index f049ec7d2..8c8a9b19a 100644 --- a/src/Protocol/Serialization/ContractResolver.cs +++ b/src/Protocol/Serialization/LspContractResolver.cs @@ -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; @@ -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, diff --git a/src/Protocol/Serialization/Serializer.cs b/src/Protocol/Serialization/Serializer.cs index aed2e556c..a6d7b5b6f 100644 --- a/src/Protocol/Serialization/Serializer.cs +++ b/src/Protocol/Serialization/Serializer.cs @@ -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, @@ -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, @@ -200,7 +200,7 @@ public void SetClientCapabilities(ClientVersion clientVersion, ClientCapabilitie AddOrReplaceConverters(Settings.Converters); - Settings.ContractResolver = new ContractResolver( + Settings.ContractResolver = new LspContractResolver( completionItemKinds, completionItemTags, documentSymbolKinds, @@ -212,7 +212,7 @@ public void SetClientCapabilities(ClientVersion clientVersion, ClientCapabilitie ); AddOrReplaceConverters(JsonSerializer.Converters); - JsonSerializer.ContractResolver = new ContractResolver( + JsonSerializer.ContractResolver = new LspContractResolver( completionItemKinds, completionItemTags, documentSymbolKinds, diff --git a/test/Dap.Tests/DapOutputHandlerTests.cs b/test/Dap.Tests/DapOutputHandlerTests.cs index 65338dc62..01e6ba391 100644 --- a/test/Dap.Tests/DapOutputHandlerTests.cs +++ b/test/Dap.Tests/DapOutputHandlerTests.cs @@ -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; @@ -21,7 +22,7 @@ private static OutputHandler NewHandler(PipeWriter writer) { var rec = Substitute.For(); rec.ShouldFilterOutput(Arg.Any()).Returns(true); - return new OutputHandler(writer, new DapSerializer(), rec, Scheduler.Immediate, NullLogger.Instance); + return new OutputHandler(writer, new DapProtocolSerializer(), rec, Scheduler.Immediate, NullLogger.Instance); } [Fact] diff --git a/test/Dap.Tests/DebugAdapterSpecifictionRecieverTests.cs b/test/Dap.Tests/DebugAdapterSpecifictionRecieverTests.cs index 0e23d4af2..a8dd0fedc 100644 --- a/test/Dap.Tests/DebugAdapterSpecifictionRecieverTests.cs +++ b/test/Dap.Tests/DebugAdapterSpecifictionRecieverTests.cs @@ -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; @@ -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); @@ -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 { public SpecificationMessages() diff --git a/test/Dap.Tests/Integration/CustomRequestsTests.cs b/test/Dap.Tests/Integration/CustomRequestsTests.cs index dac194d35..ad8770534 100644 --- a/test/Dap.Tests/Integration/CustomRequestsTests.cs +++ b/test/Dap.Tests/Integration/CustomRequestsTests.cs @@ -58,9 +58,9 @@ await client.RequestAttach( var call = fake.ReceivedCalls().Single(); var args = call.GetArguments(); var request = args[0].Should().BeOfType().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] @@ -120,7 +120,7 @@ await client.RequestLaunch( var call = fake.ReceivedCalls().Single(); var args = call.GetArguments(); var request = args[0].Should().BeOfType().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] @@ -182,9 +182,9 @@ await client.RequestAttach( var call = fake.ReceivedCalls().Single(); var args = call.GetArguments(); var request = args[0].Should().BeOfType().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] @@ -244,7 +244,7 @@ await client.RequestLaunch( var call = fake.ReceivedCalls().Single(); var args = call.GetArguments(); var request = args[0].Should().BeOfType().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] diff --git a/test/Lsp.Tests/Integration/TypedCodeActionTests.cs b/test/Lsp.Tests/Integration/TypedCodeActionTests.cs index 2ccb077c9..ce657ac18 100644 --- a/test/Lsp.Tests/Integration/TypedCodeActionTests.cs +++ b/test/Lsp.Tests/Integration/TypedCodeActionTests.cs @@ -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( diff --git a/test/Lsp.Tests/Integration/TypedCodeLensTests.cs b/test/Lsp.Tests/Integration/TypedCodeLensTests.cs index 8f52e5a2a..06a4b20ea 100644 --- a/test/Lsp.Tests/Integration/TypedCodeLensTests.cs +++ b/test/Lsp.Tests/Integration/TypedCodeLensTests.cs @@ -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( diff --git a/test/Lsp.Tests/Integration/TypedCompletionTests.cs b/test/Lsp.Tests/Integration/TypedCompletionTests.cs index df40d3ed6..aa2de3946 100644 --- a/test/Lsp.Tests/Integration/TypedCompletionTests.cs +++ b/test/Lsp.Tests/Integration/TypedCompletionTests.cs @@ -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( diff --git a/test/Lsp.Tests/Integration/TypedDocumentLinkTests.cs b/test/Lsp.Tests/Integration/TypedDocumentLinkTests.cs index ef8c00b88..ad6b5b36b 100644 --- a/test/Lsp.Tests/Integration/TypedDocumentLinkTests.cs +++ b/test/Lsp.Tests/Integration/TypedDocumentLinkTests.cs @@ -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(