From 03f4507af9c59af9ecbff27a237089501d28e9ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Bj=C3=B6rkstr=C3=B6m?= Date: Tue, 16 Apr 2019 23:01:31 +0300 Subject: [PATCH 1/2] Make BooleanOr class instead of struct to fix ignore null value when serializing --- src/Protocol/Models/BooleanOr.cs | 2 +- .../Converters/BooleanOrConverter.cs | 8 ++++---- .../Server/ServerCapabilitiesTests.cs | 17 +++++++++++++++++ .../ServerCapabilitiesTests_$Optional.json | 11 +++++++++++ .../ServerCapabilitiesTests_$SimpleTest.json | 8 ++++---- .../InitializeResultTests_$SimpleTest.json | 6 +----- 6 files changed, 38 insertions(+), 14 deletions(-) create mode 100644 test/Lsp.Tests/Capabilities/Server/ServerCapabilitiesTests_$Optional.json diff --git a/src/Protocol/Models/BooleanOr.cs b/src/Protocol/Models/BooleanOr.cs index b0a6c0c8f..e9998d1b0 100644 --- a/src/Protocol/Models/BooleanOr.cs +++ b/src/Protocol/Models/BooleanOr.cs @@ -1,6 +1,6 @@ namespace OmniSharp.Extensions.LanguageServer.Protocol.Models { - public struct BooleanOr + public class BooleanOr { private T _value; private bool? _bool; diff --git a/src/Protocol/Serialization/Converters/BooleanOrConverter.cs b/src/Protocol/Serialization/Converters/BooleanOrConverter.cs index e579f08a6..590ae63fb 100644 --- a/src/Protocol/Serialization/Converters/BooleanOrConverter.cs +++ b/src/Protocol/Serialization/Converters/BooleanOrConverter.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Reflection; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -29,7 +29,7 @@ private static void WriteJsonGeneric(JsonWriter writer, BooleanOr value, J return; } - if (value.IsBool && value.Bool) + if (value.IsBool) { new JValue(value.Bool).WriteTo(writer); return; @@ -57,11 +57,11 @@ private static BooleanOr ReadJsonGeneric(JsonReader reader, object existin return new BooleanOr(JObject.Load(reader).ToObject(serializer)); } - return new BooleanOr(); + return new BooleanOr(default(T)); } public override bool CanRead => true; public override bool CanConvert(Type objectType) => objectType.GetTypeInfo().IsGenericType && objectType.GetTypeInfo().GetGenericTypeDefinition() == typeof(BooleanOr<>); } -} \ No newline at end of file +} diff --git a/test/Lsp.Tests/Capabilities/Server/ServerCapabilitiesTests.cs b/test/Lsp.Tests/Capabilities/Server/ServerCapabilitiesTests.cs index 4998c557f..e5f2dedae 100644 --- a/test/Lsp.Tests/Capabilities/Server/ServerCapabilitiesTests.cs +++ b/test/Lsp.Tests/Capabilities/Server/ServerCapabilitiesTests.cs @@ -59,6 +59,10 @@ public void SimpleTest(string expected) WillSaveWaitUntil = true }), WorkspaceSymbolProvider = true, + ColorProvider = true, + FoldingRangeProvider = true, + ImplementationProvider = true, + TypeDefinitionProvider = true }; var result = Fixture.SerializeObject(model); @@ -67,5 +71,18 @@ public void SimpleTest(string expected) var deresult = new Serializer(ClientVersion.Lsp3).DeserializeObject(expected); deresult.Should().BeEquivalentTo(model); } + + [Theory, JsonFixture] + public void Optional(string expected) + { + var model = new ServerCapabilities(); + + var result = Fixture.SerializeObject(model); + + result.Should().Be(expected); + + var deresult = new Serializer(ClientVersion.Lsp3).DeserializeObject(expected); + deresult.Should().BeEquivalentTo(model); + } } } diff --git a/test/Lsp.Tests/Capabilities/Server/ServerCapabilitiesTests_$Optional.json b/test/Lsp.Tests/Capabilities/Server/ServerCapabilitiesTests_$Optional.json new file mode 100644 index 000000000..35e551e8f --- /dev/null +++ b/test/Lsp.Tests/Capabilities/Server/ServerCapabilitiesTests_$Optional.json @@ -0,0 +1,11 @@ +{ + "hoverProvider": false, + "definitionProvider": false, + "referencesProvider": false, + "documentHighlightProvider": false, + "documentSymbolProvider": false, + "workspaceSymbolProvider": false, + "documentFormattingProvider": false, + "documentRangeFormattingProvider": false, + "experimental": {} +} diff --git a/test/Lsp.Tests/Capabilities/Server/ServerCapabilitiesTests_$SimpleTest.json b/test/Lsp.Tests/Capabilities/Server/ServerCapabilitiesTests_$SimpleTest.json index 6382ada38..d20a13f2e 100644 --- a/test/Lsp.Tests/Capabilities/Server/ServerCapabilitiesTests_$SimpleTest.json +++ b/test/Lsp.Tests/Capabilities/Server/ServerCapabilitiesTests_$SimpleTest.json @@ -54,8 +54,8 @@ "experimental": { "abc": "123" }, - "typeDefinitionProvider": null, - "implementationProvider": null, - "colorProvider": null, - "foldingRangeProvider": null + "typeDefinitionProvider": true, + "implementationProvider": true, + "colorProvider": true, + "foldingRangeProvider": true } diff --git a/test/Lsp.Tests/Models/InitializeResultTests_$SimpleTest.json b/test/Lsp.Tests/Models/InitializeResultTests_$SimpleTest.json index 73bcc9a79..7f553ba93 100644 --- a/test/Lsp.Tests/Models/InitializeResultTests_$SimpleTest.json +++ b/test/Lsp.Tests/Models/InitializeResultTests_$SimpleTest.json @@ -54,10 +54,6 @@ }, "experimental": { "abc": "123" - }, - "typeDefinitionProvider": null, - "implementationProvider": null, - "colorProvider": null, - "foldingRangeProvider": null + } } } From 649246fa5ec50f00aaa1608316e832d896989f94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Bj=C3=B6rkstr=C3=B6m?= Date: Wed, 22 May 2019 16:07:36 +0300 Subject: [PATCH 2/2] Fix implicit cast of null and BooleanOr --- src/Protocol/Models/BooleanOr.cs | 2 +- .../Lsp.Tests/Capabilities/Server/ServerCapabilitiesTests.cs | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Protocol/Models/BooleanOr.cs b/src/Protocol/Models/BooleanOr.cs index e9998d1b0..129783625 100644 --- a/src/Protocol/Models/BooleanOr.cs +++ b/src/Protocol/Models/BooleanOr.cs @@ -48,7 +48,7 @@ public object RawValue public static implicit operator BooleanOr(T value) { - return new BooleanOr(value); + return value != null ? new BooleanOr(value) : null; } public static implicit operator BooleanOr(bool value) diff --git a/test/Lsp.Tests/Capabilities/Server/ServerCapabilitiesTests.cs b/test/Lsp.Tests/Capabilities/Server/ServerCapabilitiesTests.cs index e5f2dedae..9ba80eb92 100644 --- a/test/Lsp.Tests/Capabilities/Server/ServerCapabilitiesTests.cs +++ b/test/Lsp.Tests/Capabilities/Server/ServerCapabilitiesTests.cs @@ -5,6 +5,7 @@ using Newtonsoft.Json.Linq; using OmniSharp.Extensions.LanguageServer.Protocol; using OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities; +using OmniSharp.Extensions.LanguageServer.Protocol.Models; using OmniSharp.Extensions.LanguageServer.Protocol.Serialization; using OmniSharp.Extensions.LanguageServer.Protocol.Server.Capabilities; using Xunit; @@ -75,7 +76,9 @@ public void SimpleTest(string expected) [Theory, JsonFixture] public void Optional(string expected) { - var model = new ServerCapabilities(); + var model = new ServerCapabilities { + ColorProvider = (ColorOptions)null + }; var result = Fixture.SerializeObject(model);