Skip to content

Commit 0ea948d

Browse files
Do not seralize unsupported items for textdocumentclientcapabilites and workspaceclientcapabilites
1 parent fed2134 commit 0ea948d

9 files changed

+102
-8
lines changed

src/Lsp/Capabilities/Client/Supports.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using Newtonsoft.Json;
33
using OmniSharp.Extensions.LanguageServer.Converters;
44

@@ -38,8 +38,9 @@ public static implicit operator Supports<T>(T value)
3838
public static class Supports
3939
{
4040
public static Supports<T> OfValue<T>(T value)
41+
where T : class
4142
{
42-
return new Supports<T>(true, value);
43+
return new Supports<T>(value != null, value);
4344
}
4445

4546
public static Supports<T> OfBoolean<T>(bool isSupported)

src/Lsp/Capabilities/Client/TextDocumentClientCapabilities.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.ComponentModel;
12
using Newtonsoft.Json;
23
using Newtonsoft.Json.Serialization;
34

@@ -8,74 +9,119 @@ public class TextDocumentClientCapabilities
89
{
910
public Supports<SynchronizationCapability> Synchronization { get; set; }
1011

12+
[EditorBrowsable(EditorBrowsableState.Never)]
13+
public bool ShouldSerializeSynchronization() => Synchronization.IsSupported;
14+
1115
/// <summary>
1216
/// Capabilities specific to the `textDocument/completion`
1317
/// </summary>
1418
public Supports<CompletionCapability> Completion { get; set; }
1519

20+
[EditorBrowsable(EditorBrowsableState.Never)]
21+
public bool ShouldSerializeCompletion() => Completion.IsSupported;
22+
1623
/// <summary>
1724
/// Capabilities specific to the `textDocument/hover`
1825
/// </summary>
1926
public Supports<HoverCapability> Hover { get; set; }
2027

28+
[EditorBrowsable(EditorBrowsableState.Never)]
29+
public bool ShouldSerializeHover() => Hover.IsSupported;
30+
2131
/// <summary>
2232
/// Capabilities specific to the `textDocument/signatureHelp`
2333
/// </summary>
2434
public Supports<SignatureHelpCapability> SignatureHelp { get; set; }
2535

36+
[EditorBrowsable(EditorBrowsableState.Never)]
37+
public bool ShouldSerializeSignatureHelp() => SignatureHelp.IsSupported;
38+
2639
/// <summary>
2740
/// Capabilities specific to the `textDocument/references`
2841
/// </summary>
2942
public Supports<ReferencesCapability> References { get; set; }
3043

44+
[EditorBrowsable(EditorBrowsableState.Never)]
45+
public bool ShouldSerializeReferences() => References.IsSupported;
46+
3147
/// <summary>
3248
/// Capabilities specific to the `textDocument/documentHighlight`
3349
/// </summary>
3450
public Supports<DocumentHighlightCapability> DocumentHighlight { get; set; }
3551

52+
[EditorBrowsable(EditorBrowsableState.Never)]
53+
public bool ShouldSerializeDocumentHighlight() => DocumentHighlight.IsSupported;
54+
3655
/// <summary>
3756
/// Capabilities specific to the `textDocument/documentSymbol`
3857
/// </summary>
3958
public Supports<DocumentSymbolCapability> DocumentSymbol { get; set; }
4059

60+
[EditorBrowsable(EditorBrowsableState.Never)]
61+
public bool ShouldSerializeDocumentSymbol() => DocumentSymbol.IsSupported;
62+
4163
/// <summary>
4264
/// Capabilities specific to the `textDocument/formatting`
4365
/// </summary>
4466
public Supports<DocumentFormattingCapability> Formatting { get; set; }
4567

68+
[EditorBrowsable(EditorBrowsableState.Never)]
69+
public bool ShouldSerializeFormatting() => Formatting.IsSupported;
70+
4671
/// <summary>
4772
/// Capabilities specific to the `textDocument/rangeFormatting`
4873
/// </summary>
4974
public Supports<DocumentRangeFormattingCapability> RangeFormatting { get; set; }
5075

76+
[EditorBrowsable(EditorBrowsableState.Never)]
77+
public bool ShouldSerializeRangeFormatting() => RangeFormatting.IsSupported;
78+
5179
/// <summary>
5280
/// Capabilities specific to the `textDocument/onTypeFormatting`
5381
/// </summary>
5482
public Supports<DocumentOnTypeFormattingCapability> OnTypeFormatting { get; set; }
5583

84+
[EditorBrowsable(EditorBrowsableState.Never)]
85+
public bool ShouldSerializeOnTypeFormatting() => OnTypeFormatting.IsSupported;
86+
5687
/// <summary>
5788
/// Capabilities specific to the `textDocument/definition`
5889
/// </summary>
5990
public Supports<DefinitionCapability> Definition { get; set; }
6091

92+
[EditorBrowsable(EditorBrowsableState.Never)]
93+
public bool ShouldSerializeDefinition() => Definition.IsSupported;
94+
6195
/// <summary>
6296
/// Capabilities specific to the `textDocument/codeAction`
6397
/// </summary>
6498
public Supports<CodeActionCapability> CodeAction { get; set; }
6599

100+
[EditorBrowsable(EditorBrowsableState.Never)]
101+
public bool ShouldSerializeCodeAction() => CodeAction.IsSupported;
102+
66103
/// <summary>
67104
/// Capabilities specific to the `textDocument/codeLens`
68105
/// </summary>
69106
public Supports<CodeLensCapability> CodeLens { get; set; }
70107

108+
[EditorBrowsable(EditorBrowsableState.Never)]
109+
public bool ShouldSerializeCodeLens() => CodeLens.IsSupported;
110+
71111
/// <summary>
72112
/// Capabilities specific to the `textDocument/documentLink`
73113
/// </summary>
74114
public Supports<DocumentLinkCapability> DocumentLink { get; set; }
75115

116+
[EditorBrowsable(EditorBrowsableState.Never)]
117+
public bool ShouldSerializeDocumentLink() => DocumentLink.IsSupported;
118+
76119
/// <summary>
77120
/// Capabilities specific to the `textDocument/rename`
78121
/// </summary>
79122
public Supports<RenameCapability> Rename { get; set; }
123+
124+
[EditorBrowsable(EditorBrowsableState.Never)]
125+
public bool ShouldSerializeRename() => Rename.IsSupported;
80126
}
81127
}

src/Lsp/Capabilities/Client/WorkspaceClientCapabilites.cs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.ComponentModel;
12
using Newtonsoft.Json;
23
using Newtonsoft.Json.Serialization;
34

@@ -10,30 +11,46 @@ public class WorkspaceClientCapabilites
1011
/// The client supports applying batch edits
1112
/// to the workspace.
1213
/// </summary>
13-
public bool ApplyEdit { get; set; }
14+
public Supports<bool> ApplyEdit { get; set; }
15+
16+
[EditorBrowsable(EditorBrowsableState.Never)]
17+
public bool ShouldSerializeApplyEdit() => ApplyEdit.IsSupported;
1418

1519
public Supports<WorkspaceEditCapability> WorkspaceEdit { get; set; }
1620

17-
private bool ShouldSerializeWorkspaceEdit() => WorkspaceEdit.IsSupported;
21+
[EditorBrowsable(EditorBrowsableState.Never)]
22+
public bool ShouldSerializeWorkspaceEdit() => WorkspaceEdit.IsSupported;
1823

1924
/// <summary>
2025
/// Capabilities specific to the `workspace/didChangeConfiguration` notification.
2126
/// </summary>
2227
public Supports<DidChangeConfigurationCapability> DidChangeConfiguration { get; set; }
2328

29+
[EditorBrowsable(EditorBrowsableState.Never)]
30+
public bool ShouldSerializeDidChangeConfiguration() => DidChangeConfiguration.IsSupported;
31+
2432
/// <summary>
2533
/// Capabilities specific to the `workspace/didChangeWatchedFiles` notification.
2634
/// </summary>
2735
public Supports<DidChangeWatchedFilesCapability> DidChangeWatchedFiles { get; set; }
2836

37+
[EditorBrowsable(EditorBrowsableState.Never)]
38+
public bool ShouldSerializeDidChangeWatchedFiles() => DidChangeWatchedFiles.IsSupported;
39+
2940
/// <summary>
3041
/// Capabilities specific to the `workspace/symbol` request.
3142
/// </summary>
3243
public Supports<WorkspaceSymbolCapability> Symbol { get; set; }
3344

45+
[EditorBrowsable(EditorBrowsableState.Never)]
46+
public bool ShouldSerializeSymbol() => Symbol.IsSupported;
47+
3448
/// <summary>
3549
/// Capabilities specific to the `workspace/executeCommand` request.
3650
/// </summary>
3751
public Supports<ExecuteCommandCapability> ExecuteCommand { get; set; }
52+
53+
[EditorBrowsable(EditorBrowsableState.Never)]
54+
public bool ShouldSerializeExecuteCommand() => ExecuteCommand.IsSupported;
3855
}
3956
}

src/Lsp/Converters/SupportsConverter.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
4444
var targetType = objectType.GetTypeInfo().GetGenericArguments()[0];
4545
if (reader.TokenType == JsonToken.Boolean)
4646
{
47+
if (targetType == typeof(bool))
48+
{
49+
return new Supports<bool>(true, (bool)reader.Value);
50+
}
4751
return OfBooleanMethod
4852
.MakeGenericMethod(targetType)
4953
.Invoke(null, new [] { reader.Value });

test/Lsp.Tests/Capabilities/Client/TextDocumentClientCapabilitiesTests.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using FluentAssertions;
33
using Newtonsoft.Json;
44
using OmniSharp.Extensions.LanguageServer.Capabilities.Client;
@@ -45,5 +45,17 @@ public void SimpleTest(string expected)
4545
var deresult = JsonConvert.DeserializeObject<TextDocumentClientCapabilities>(expected);
4646
deresult.ShouldBeEquivalentTo(model);
4747
}
48+
49+
[Theory, JsonFixture]
50+
public void EmptyTest(string expected)
51+
{
52+
var model = new TextDocumentClientCapabilities();
53+
var result = Fixture.SerializeObject(model);
54+
55+
result.Should().Be(expected);
56+
57+
var deresult = JsonConvert.DeserializeObject<TextDocumentClientCapabilities>(expected);
58+
deresult.ShouldBeEquivalentTo(model);
59+
}
4860
}
4961
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{}

test/Lsp.Tests/Capabilities/Client/WorkspaceClientCapabilitesTests.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using FluentAssertions;
33
using Newtonsoft.Json;
44
using OmniSharp.Extensions.LanguageServer.Capabilities.Client;
@@ -13,7 +13,7 @@ public void SimpleTest(string expected)
1313
{
1414
var model = new WorkspaceClientCapabilites() {
1515
ApplyEdit = true,
16-
WorkspaceEdit = new WorkspaceEditCapability() { DocumentChanges = true},
16+
WorkspaceEdit = new WorkspaceEditCapability() { DocumentChanges = true },
1717
DidChangeConfiguration = new DidChangeConfigurationCapability() { DynamicRegistration = true },
1818
DidChangeWatchedFiles = new DidChangeWatchedFilesCapability() { DynamicRegistration = true },
1919
ExecuteCommand = new ExecuteCommandCapability() { DynamicRegistration = true },
@@ -27,5 +27,18 @@ public void SimpleTest(string expected)
2727
var deresult = JsonConvert.DeserializeObject<WorkspaceClientCapabilites>(expected);
2828
deresult.ShouldBeEquivalentTo(model);
2929
}
30+
31+
[Theory, JsonFixture]
32+
public void EmptyTest(string expected)
33+
{
34+
var model = new WorkspaceClientCapabilites();
35+
36+
var result = Fixture.SerializeObject(model);
37+
38+
result.Should().Be(expected);
39+
40+
var deresult = JsonConvert.DeserializeObject<WorkspaceClientCapabilites>(expected);
41+
deresult.ShouldBeEquivalentTo(model);
42+
}
3043
}
3144
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{}

test/Lsp.Tests/Models/InitializeParamsTests_$SimpleTest.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
"capabilities": {
77
"workspace": {
88
"applyEdit": true,
9-
"workspaceEdit": null,
109
"didChangeConfiguration": {
1110
"dynamicRegistration": true
1211
},

0 commit comments

Comments
 (0)