提交 bd46eb0f 编写于 作者: C CyrusNajmabadi 提交者: GitHub

Merge pull request #19913 from CyrusNajmabadi/stronglyTypedJson

Make json converters strongly typed.
......@@ -16,11 +16,9 @@ internal partial class AggregateJsonConverter : JsonConverter
builder.Add(typeof(TodoComment), new TodoCommentJsonConverter());
}
private class TodoCommentDescriptorJsonConverter : BaseJsonConverter
private class TodoCommentDescriptorJsonConverter : BaseJsonConverter<TodoCommentDescriptor>
{
public override bool CanConvert(Type objectType) => typeof(TodoCommentDescriptor) == objectType;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
protected override TodoCommentDescriptor ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject);
......@@ -34,10 +32,8 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
return new TodoCommentDescriptor(text, (int)priority);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
protected override void WriteValue(JsonWriter writer, TodoCommentDescriptor descriptor, JsonSerializer serializer)
{
var descriptor = (TodoCommentDescriptor)value;
writer.WriteStartObject();
writer.WritePropertyName("text");
......@@ -50,11 +46,9 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
}
}
private class TodoCommentJsonConverter : BaseJsonConverter
private class TodoCommentJsonConverter : BaseJsonConverter<TodoComment>
{
public override bool CanConvert(Type objectType) => typeof(TodoComment) == objectType;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
protected override TodoComment ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject);
......@@ -69,10 +63,8 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
return new TodoComment(descriptor, message, (int)position);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
protected override void WriteValue(JsonWriter writer, TodoComment todoComment, JsonSerializer serializer)
{
var todoComment = (TodoComment)value;
writer.WriteStartObject();
writer.WritePropertyName("descriptor");
......
......@@ -8,7 +8,7 @@ namespace Microsoft.CodeAnalysis.Remote
{
internal partial class AggregateJsonConverter : JsonConverter
{
private abstract class WorkspaceIdJsonConverter : BaseJsonConverter
private abstract class WorkspaceIdJsonConverter<T> : BaseJsonConverter<T>
{
protected (Guid, string) ReadFromJsonObject(JsonReader reader)
{
......@@ -47,45 +47,33 @@ protected static void WriteIdAndName(JsonWriter writer, Guid id, string debugNam
}
}
private class SolutionIdJsonConverter : WorkspaceIdJsonConverter
private class SolutionIdJsonConverter : WorkspaceIdJsonConverter<SolutionId>
{
public override bool CanConvert(Type objectType) => typeof(SolutionId) == objectType;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
protected override SolutionId ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var (id, debugName) = ReadFromJsonObject(reader);
return SolutionId.CreateFromSerialized(id, debugName);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var solutionId = (SolutionId)value;
WriteToJsonObject(writer, solutionId.Id, solutionId.DebugName);
}
protected override void WriteValue(JsonWriter writer, SolutionId solutionId, JsonSerializer serializer)
=> WriteToJsonObject(writer, solutionId.Id, solutionId.DebugName);
}
private class ProjectIdJsonConverter : WorkspaceIdJsonConverter
private class ProjectIdJsonConverter : WorkspaceIdJsonConverter<ProjectId>
{
public override bool CanConvert(Type objectType) => typeof(ProjectId) == objectType;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
protected override ProjectId ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var (id, debugName) = ReadFromJsonObject(reader);
return ProjectId.CreateFromSerialized(id, debugName);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var projectId = (ProjectId)value;
WriteToJsonObject(writer, projectId.Id, projectId.DebugName);
}
protected override void WriteValue(JsonWriter writer, ProjectId projectId, JsonSerializer serializer)
=> WriteToJsonObject(writer, projectId.Id, projectId.DebugName);
}
private class DocumentIdJsonConverter : WorkspaceIdJsonConverter
private class DocumentIdJsonConverter : WorkspaceIdJsonConverter<DocumentId>
{
public override bool CanConvert(Type objectType) => typeof(DocumentId) == objectType;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
protected override DocumentId ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject);
......@@ -99,10 +87,8 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
return DocumentId.CreateFromSerialized(projectId, id, debugName);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
protected override void WriteValue(JsonWriter writer, DocumentId documentId, JsonSerializer serializer)
{
var documentId = (DocumentId)value;
writer.WriteStartObject();
writer.WritePropertyName("projectId");
......@@ -114,4 +100,4 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
}
}
}
}
}
\ No newline at end of file
......@@ -55,34 +55,43 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
return builder.ToImmutable();
}
private abstract class BaseJsonConverter : JsonConverter
private abstract class BaseJsonConverter<T> : JsonConverter
{
protected static T ReadProperty<T>(JsonSerializer serializer, JsonReader reader)
public sealed override bool CanConvert(Type objectType) => typeof(T) == objectType;
public sealed override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
=> ReadValue(reader, objectType, existingValue, serializer);
public sealed override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
=> WriteValue(writer, (T)value, serializer);
protected abstract T ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer);
protected abstract void WriteValue(JsonWriter writer, T value, JsonSerializer serializer);
protected static U ReadProperty<U>(JsonSerializer serializer, JsonReader reader)
{
// read property
Contract.ThrowIfFalse(reader.Read());
Contract.ThrowIfFalse(reader.TokenType == JsonToken.PropertyName);
Contract.ThrowIfFalse(reader.Read());
return serializer.Deserialize<T>(reader);
return serializer.Deserialize<U>(reader);
}
protected static T ReadProperty<T>(JsonReader reader)
protected static U ReadProperty<U>(JsonReader reader)
{
// read property
Contract.ThrowIfFalse(reader.Read());
Contract.ThrowIfFalse(reader.TokenType == JsonToken.PropertyName);
Contract.ThrowIfFalse(reader.Read());
return (T)reader.Value;
return (U)reader.Value;
}
}
private class TextSpanJsonConverter : BaseJsonConverter
private class TextSpanJsonConverter : BaseJsonConverter<TextSpan>
{
public override bool CanConvert(Type objectType) => typeof(TextSpan) == objectType;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
protected override TextSpan ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject);
......@@ -96,10 +105,8 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
return new TextSpan((int)start, (int)length);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
protected override void WriteValue(JsonWriter writer, TextSpan span, JsonSerializer serializer)
{
var span = (TextSpan)value;
writer.WriteStartObject();
writer.WritePropertyName("start");
......@@ -112,15 +119,49 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
}
}
private class SymbolKeyJsonConverter : BaseJsonConverter
private class TextChangeJsonConverter : BaseJsonConverter<TextChange>
{
public override bool CanConvert(Type objectType) => typeof(SymbolKey) == objectType;
protected override TextChange ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
// all integer is long
var start = ReadProperty<long>(reader);
var length = ReadProperty<long>(reader);
var newText = ReadProperty<string>(reader);
Contract.ThrowIfFalse(reader.Read());
Contract.ThrowIfFalse(reader.TokenType == JsonToken.EndObject);
return new TextChange(new TextSpan((int)start, (int)length), newText);
}
protected override void WriteValue(JsonWriter writer, TextChange change, JsonSerializer serializer)
{
var span = change.Span;
writer.WriteStartObject();
writer.WritePropertyName("start");
writer.WriteValue(span.Start);
writer.WritePropertyName("length");
writer.WriteValue(span.Length);
writer.WritePropertyName("newText");
writer.WriteValue(change.NewText);
writer.WriteEndObject();
}
}
private class SymbolKeyJsonConverter : BaseJsonConverter<SymbolKey>
{
protected override SymbolKey ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
=> new SymbolKey((string)reader.Value);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) =>
writer.WriteValue(value.ToString());
protected override void WriteValue(JsonWriter writer, SymbolKey value, JsonSerializer serializer)
=> writer.WriteValue(value.ToString());
}
private class ChecksumJsonConverter : JsonConverter
......@@ -139,4 +180,4 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
}
}
}
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册