Skip to content

Commit a0f0bcb

Browse files
Added JsonConverter attributes where appropriate to allow for more ad… (#271)
* Added JsonConverter attributes where appropriate to allow for more adhoc serialziation in things like commands for example * Updated converters
1 parent bfe5f1c commit a0f0bcb

24 files changed

+123
-48
lines changed

src/Protocol/DocumentUri.cs

+3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Runtime.InteropServices;
4+
using Newtonsoft.Json;
45
using OmniSharp.Extensions.LanguageServer.Protocol.Models;
6+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
57

68
namespace OmniSharp.Extensions.LanguageServer.Protocol
79
{
@@ -25,6 +27,7 @@ namespace OmniSharp.Extensions.LanguageServer.Protocol
2527
/// This class describes a document uri as defined by https://microsoft.github.io/language-server-protocol/specifications/specification-current/#uri
2628
/// </summary>
2729
/// <remarks>This exists because of some non-standard serialization in vscode around uris and .NET's behavior when deserializing those uris</remarks>
30+
[JsonConverter(typeof(DocumentUriConverter))]
2831
public partial class DocumentUri : IEquatable<DocumentUri>
2932
{
3033
/// <summary>

src/Protocol/Models/BooleanNumberString.cs

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
using Newtonsoft.Json;
2+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
3+
14
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models
25
{
6+
[JsonConverter(typeof(BooleanNumberStringConverter))]
37
public struct BooleanNumberString
48
{
59
private long? _long;

src/Protocol/Models/BooleanString.cs

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
using Newtonsoft.Json;
2+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
3+
14
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models
25
{
6+
[JsonConverter(typeof(BooleanStringConverter))]
37
public struct BooleanString
48
{
59
private string _string;

src/Protocol/Models/CommandOrCodeAction.cs

+3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
using System.Diagnostics;
2+
using Newtonsoft.Json;
3+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
24

35
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models
46
{
7+
[JsonConverter(typeof(CommandOrCodeActionConverter))]
58
[DebuggerDisplay("{" + nameof(DebuggerDisplay) + ",nq}")]
69
public struct CommandOrCodeAction
710
{

src/Protocol/Models/CompletionList.cs

+3
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@
22
using System.Collections.ObjectModel;
33
using System.ComponentModel;
44
using System.Linq;
5+
using Newtonsoft.Json;
56
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization;
7+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
68

79
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models
810
{
911
/// <summary>
1012
/// Represents a collection of [completion items](#CompletionItem) to be presented
1113
/// in the editor.
1214
/// </summary>
15+
[JsonConverter(typeof(CompletionListConverter))]
1316
public class CompletionList : Container<CompletionItem>
1417
{
1518
public CompletionList() : base(Enumerable.Empty<CompletionItem>()) { }

src/Protocol/Models/DiagnosticCode.cs

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
using Newtonsoft.Json;
2+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
3+
14
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models
25
{
6+
[JsonConverter(typeof(DiagnosticCodeConverter))]
37
public struct DiagnosticCode
48
{
59
public DiagnosticCode(long value)

src/Protocol/Models/LocationOrLocationLink.cs

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
using Newtonsoft.Json;
2+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
3+
14
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models
25
{
6+
[JsonConverter(typeof(LocationOrLocationLinkConverter))]
37
public struct LocationOrLocationLink {
48

59
public LocationOrLocationLink(Location location)

src/Protocol/Models/LocationOrLocationLinks.cs

+3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
using System.Collections.Generic;
22
using System.Collections.ObjectModel;
33
using System.Linq;
4+
using Newtonsoft.Json;
5+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
46

57
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models
68
{
9+
[JsonConverter(typeof(LocationOrLocationLinksConverter))]
710
public class LocationOrLocationLinks : Container<LocationOrLocationLink>
811
{
912
public LocationOrLocationLinks() : this(Enumerable.Empty<LocationOrLocationLink>())

src/Protocol/Models/MarkedString.cs

+3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System.Diagnostics;
2+
using Newtonsoft.Json;
23
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization;
4+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
35

46
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models
57
{
@@ -16,6 +18,7 @@ namespace OmniSharp.Extensions.LanguageServer.Protocol.Models
1618
///
1719
/// Note that markdown strings will be sanitized - that means html will be escaped.
1820
/// </summary>
21+
[JsonConverter(typeof(MarkedStringConverter))]
1922
[DebuggerDisplay("{" + nameof(DebuggerDisplay) + ",nq}")]
2023
public class MarkedString
2124
{

src/Protocol/Models/MarkedStringsOrMarkupContent.cs

+3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
using System.Collections.Generic;
22
using System.Diagnostics;
33
using System.Linq;
4+
using Newtonsoft.Json;
5+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
46

57
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models
68
{
9+
[JsonConverter(typeof(MarkedStringsOrMarkupContentConverter))]
710
[DebuggerDisplay("{" + nameof(DebuggerDisplay) + ",nq}")]
811
public class MarkedStringsOrMarkupContent
912
{

src/Protocol/Models/ParameterInformationLabel.cs

+3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
using System.Diagnostics;
2+
using Newtonsoft.Json;
3+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
24

35
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models
46
{
7+
[JsonConverter(typeof(ParameterInformationLabelConverter))]
58
[DebuggerDisplay("{" + nameof(DebuggerDisplay) + ",nq}")]
69
public class ParameterInformationLabel
710
{

src/Protocol/Models/ProgressToken.cs

+2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
using System.Collections.Generic;
33
using System.Diagnostics;
44
using Newtonsoft.Json;
5+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
56

67
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models
78
{
9+
[JsonConverter(typeof(ProgressTokenConverter))]
810
[DebuggerDisplay("{" + nameof(DebuggerDisplay) + ",nq}")]
911
public class ProgressToken : IEquatable<ProgressToken>, IEquatable<long>, IEquatable<string>
1012
{

src/Protocol/Models/Proposals/SemanticTokensFullOrDelta.cs

+3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
using System;
2+
using Newtonsoft.Json;
3+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
24

35
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models.Proposals
46
{
57
[Obsolete(Constants.Proposal)]
8+
[JsonConverter(typeof(SemanticTokensFullOrDeltaConverter))]
69
public struct SemanticTokensFullOrDelta
710
{
811
public SemanticTokensFullOrDelta(SemanticTokensDelta delta)

src/Protocol/Models/Proposals/SemanticTokensFullOrDeltaPartialResult.cs

+3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
using System;
2+
using Newtonsoft.Json;
3+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
24

35
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models.Proposals
46
{
57
[Obsolete(Constants.Proposal)]
8+
[JsonConverter(typeof(SemanticTokensFullOrDeltaPartialResultConverter))]
69
public struct SemanticTokensFullOrDeltaPartialResult
710
{
811
public SemanticTokensFullOrDeltaPartialResult(

src/Protocol/Models/RangeOrPlaceholderRange.cs

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
using Newtonsoft.Json;
2+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
3+
14
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models
25
{
6+
[JsonConverter(typeof(RangeOrPlaceholderRangeConverter))]
37
public class RangeOrPlaceholderRange
48
{
59

src/Protocol/Models/StringOrMarkupContent.cs

+3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
using System.Diagnostics;
2+
using Newtonsoft.Json;
3+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
24

35
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models
46
{
7+
[JsonConverter(typeof(StringOrMarkupContentConverter))]
58
[DebuggerDisplay("{" + nameof(DebuggerDisplay) + ",nq}")]
69
public class StringOrMarkupContent
710
{

src/Protocol/Models/SymbolInformationOrDocumentSymbol.cs

+3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
using System.Diagnostics;
2+
using Newtonsoft.Json;
3+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
24

35
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models
46
{
7+
[JsonConverter(typeof(SymbolInformationOrDocumentSymbolConverter))]
58
[DebuggerDisplay("{" + nameof(DebuggerDisplay) + ",nq}")]
69
public struct SymbolInformationOrDocumentSymbol
710
{

src/Protocol/Models/WorkspaceEditDocumentChange.cs

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
using Newtonsoft.Json;
2+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
3+
14
namespace OmniSharp.Extensions.LanguageServer.Protocol.Models
25
{
6+
[JsonConverter(typeof(WorkspaceEditDocumentChangeConverter))]
37
public struct WorkspaceEditDocumentChange
48
{
59
public WorkspaceEditDocumentChange(TextDocumentEdit textDocumentEdit)

src/Protocol/Serialization/Converters/DiagnosticCodeConverter.cs

-34
Original file line numberDiff line numberDiff line change
@@ -30,38 +30,4 @@ public override DiagnosticCode ReadJson(JsonReader reader, Type objectType, Diag
3030

3131
public override bool CanRead => true;
3232
}
33-
34-
class NullableDiagnosticCodeConverter : JsonConverter<DiagnosticCode?>
35-
{
36-
public override void WriteJson(JsonWriter writer, DiagnosticCode? value, JsonSerializer serializer)
37-
{
38-
if (!value.HasValue)
39-
{
40-
writer.WriteNull();
41-
}
42-
else
43-
{
44-
if (value.Value.IsLong) serializer.Serialize(writer, value.Value.Long);
45-
if (value.Value.IsString) serializer.Serialize(writer, value.Value.String);
46-
}
47-
}
48-
49-
public override DiagnosticCode? ReadJson(JsonReader reader, Type objectType, DiagnosticCode? existingValue,
50-
bool hasExistingValue, JsonSerializer serializer)
51-
{
52-
if (reader.TokenType == JsonToken.String)
53-
{
54-
return new DiagnosticCode((string) reader.Value);
55-
}
56-
57-
if (reader.TokenType == JsonToken.Integer)
58-
{
59-
return new DiagnosticCode((long) reader.Value);
60-
}
61-
62-
return null;
63-
}
64-
65-
public override bool CanRead => true;
66-
}
6733
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using System;
2+
using Newtonsoft.Json;
3+
using OmniSharp.Extensions.LanguageServer.Protocol.Models;
4+
5+
namespace OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters
6+
{
7+
class NullableDiagnosticCodeConverter : JsonConverter<DiagnosticCode?>
8+
{
9+
public override void WriteJson(JsonWriter writer, DiagnosticCode? value, JsonSerializer serializer)
10+
{
11+
if (!value.HasValue)
12+
{
13+
writer.WriteNull();
14+
}
15+
else
16+
{
17+
if (value.Value.IsLong) serializer.Serialize(writer, value.Value.Long);
18+
if (value.Value.IsString) serializer.Serialize(writer, value.Value.String);
19+
}
20+
}
21+
22+
public override DiagnosticCode? ReadJson(JsonReader reader, Type objectType, DiagnosticCode? existingValue,
23+
bool hasExistingValue, JsonSerializer serializer)
24+
{
25+
if (reader.TokenType == JsonToken.String)
26+
{
27+
return new DiagnosticCode((string) reader.Value);
28+
}
29+
30+
if (reader.TokenType == JsonToken.Integer)
31+
{
32+
return new DiagnosticCode((long) reader.Value);
33+
}
34+
35+
return null;
36+
}
37+
38+
public override bool CanRead => true;
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System;
2+
using Newtonsoft.Json;
3+
using Newtonsoft.Json.Linq;
4+
5+
namespace OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters
6+
{
7+
class ValueTupleContractResolver<T1, T2> : JsonConverter<(T1, T2)>
8+
{
9+
public override void WriteJson(JsonWriter writer, (T1, T2) value, JsonSerializer serializer)
10+
{
11+
serializer.Serialize(writer, new object[] { value.Item1, value.Item2 });
12+
}
13+
14+
public override (T1, T2) ReadJson(JsonReader reader, Type objectType, (T1, T2) existingValue, bool hasExistingValue, JsonSerializer serializer)
15+
{
16+
var a = JArray.Load(reader);
17+
return (a.ToObject<T1>(), a.ToObject<T2>());
18+
}
19+
}
20+
}

src/Protocol/Serialization/Converters/WorkspaceEditDocumentChangeConverter.cs

-14
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,4 @@ public override WorkspaceEditDocumentChange ReadJson(JsonReader reader, Type obj
4141

4242
public override bool CanRead => true;
4343
}
44-
45-
class ValueTupleContractResolver<T1, T2> : JsonConverter<ValueTuple<T1, T2>>
46-
{
47-
public override void WriteJson(JsonWriter writer, (T1, T2) value, JsonSerializer serializer)
48-
{
49-
serializer.Serialize(writer, new object[] { value.Item1, value.Item2 });
50-
}
51-
52-
public override (T1, T2) ReadJson(JsonReader reader, Type objectType, (T1, T2) existingValue, bool hasExistingValue, JsonSerializer serializer)
53-
{
54-
var a = JArray.Load(reader);
55-
return (a.ToObject<T1>(), a.ToObject<T2>());
56-
}
57-
}
5844
}

src/Protocol/Server/Capabilities/TextDocumentSync.cs

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
using Newtonsoft.Json;
2+
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization.Converters;
3+
14
namespace OmniSharp.Extensions.LanguageServer.Protocol.Server.Capabilities
25
{
6+
[JsonConverter(typeof(TextDocumentSyncConverter))]
37
public class TextDocumentSync
48
{
59
public TextDocumentSync(TextDocumentSyncKind kind)

0 commit comments

Comments
 (0)