diff --git a/src/Protocol/Models/BooleanOr.cs b/src/Protocol/Models/BooleanOr.cs index b0a6c0c8f..129783625 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; @@ -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/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..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; @@ -59,6 +60,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 +72,20 @@ 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 { + ColorProvider = (ColorOptions)null + }; + + 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 + } } }