提交 9f5e8fd9 编写于 作者: C CyrusNajmabadi

Add json converters for core Add-Using type.

上级 0e986170
......@@ -2,6 +2,7 @@
using System;
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.Packaging;
using Microsoft.CodeAnalysis.TodoComments;
using Newtonsoft.Json;
using Roslyn.Utilities;
......@@ -12,13 +13,14 @@ internal partial class AggregateJsonConverter : JsonConverter
{
partial void AppendRoslynSpecificJsonConverters(ImmutableDictionary<Type, JsonConverter>.Builder builder)
{
builder.Add(typeof(TodoCommentDescriptor), new TodoCommentDescriptorJsonConverter());
builder.Add(typeof(TodoComment), new TodoCommentJsonConverter());
Add(builder, new TodoCommentDescriptorJsonConverter());
Add(builder, new TodoCommentJsonConverter());
Add(builder, new PackageSourceJsonConverter());
}
private class TodoCommentDescriptorJsonConverter : BaseJsonConverter<TodoCommentDescriptor>
{
protected override TodoCommentDescriptor ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
protected override TodoCommentDescriptor ReadValue(JsonReader reader, JsonSerializer serializer)
{
Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject);
......@@ -48,7 +50,7 @@ protected override void WriteValue(JsonWriter writer, TodoCommentDescriptor desc
private class TodoCommentJsonConverter : BaseJsonConverter<TodoComment>
{
protected override TodoComment ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
protected override TodoComment ReadValue(JsonReader reader, JsonSerializer serializer)
{
Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject);
......@@ -79,5 +81,34 @@ protected override void WriteValue(JsonWriter writer, TodoComment todoComment, J
writer.WriteEndObject();
}
}
private class PackageSourceJsonConverter : BaseJsonConverter<PackageSource>
{
protected override PackageSource ReadValue(JsonReader reader, JsonSerializer serializer)
{
Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject);
var name = ReadProperty<string>(reader);
var source = ReadProperty<string>(reader);
Contract.ThrowIfFalse(reader.Read());
Contract.ThrowIfFalse(reader.TokenType == JsonToken.EndObject);
return new PackageSource(name, source);
}
protected override void WriteValue(JsonWriter writer, PackageSource source, JsonSerializer serializer)
{
writer.WriteStartObject();
writer.WritePropertyName("name");
writer.WriteValue(source.Name);
writer.WritePropertyName("source");
writer.WriteValue(source.Source);
writer.WriteEndObject();
}
}
}
}
}
\ No newline at end of file
......@@ -49,7 +49,7 @@ protected static void WriteIdAndName(JsonWriter writer, Guid id, string debugNam
private class SolutionIdJsonConverter : WorkspaceIdJsonConverter<SolutionId>
{
protected override SolutionId ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
protected override SolutionId ReadValue(JsonReader reader, JsonSerializer serializer)
{
var (id, debugName) = ReadFromJsonObject(reader);
return SolutionId.CreateFromSerialized(id, debugName);
......@@ -61,7 +61,7 @@ protected override void WriteValue(JsonWriter writer, SolutionId solutionId, Jso
private class ProjectIdJsonConverter : WorkspaceIdJsonConverter<ProjectId>
{
protected override ProjectId ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
protected override ProjectId ReadValue(JsonReader reader, JsonSerializer serializer)
{
var (id, debugName) = ReadFromJsonObject(reader);
return ProjectId.CreateFromSerialized(id, debugName);
......@@ -73,7 +73,7 @@ protected override void WriteValue(JsonWriter writer, ProjectId projectId, JsonS
private class DocumentIdJsonConverter : WorkspaceIdJsonConverter<DocumentId>
{
protected override DocumentId ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
protected override DocumentId ReadValue(JsonReader reader, JsonSerializer serializer)
{
Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject);
......
......@@ -20,52 +20,54 @@ private AggregateJsonConverter()
}
public override bool CanConvert(Type objectType)
{
return _map.ContainsKey(objectType);
}
=> _map.ContainsKey(objectType);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return _map[objectType].ReadJson(reader, objectType, existingValue, serializer);
}
=> _map[objectType].ReadJson(reader, objectType, existingValue, serializer);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
_map[value.GetType()].WriteJson(writer, value, serializer);
}
=> _map[value.GetType()].WriteJson(writer, value, serializer);
// this type is shared by multiple teams such as Razor, LUT and etc which have either separated/shared/shim repo
// so some types might not available to those context. this partial method let us add Roslyn specific types
// without breaking them
// this type is shared by multiple teams such as Razor, LUT and etc which have either
// separated/shared/shim repo so some types might not available to those context. this
// partial method let us add Roslyn specific types without breaking them
partial void AppendRoslynSpecificJsonConverters(ImmutableDictionary<Type, JsonConverter>.Builder builder);
private ImmutableDictionary<Type, JsonConverter> CreateConverterMap()
{
var builder = ImmutableDictionary.CreateBuilder<Type, JsonConverter>();
builder.Add(typeof(Checksum), new ChecksumJsonConverter());
builder.Add(typeof(SolutionId), new SolutionIdJsonConverter());
builder.Add(typeof(ProjectId), new ProjectIdJsonConverter());
builder.Add(typeof(DocumentId), new DocumentIdJsonConverter());
builder.Add(typeof(TextSpan), new TextSpanJsonConverter());
builder.Add(typeof(SymbolKey), new SymbolKeyJsonConverter());
Add(builder, new ChecksumJsonConverter());
Add(builder, new SolutionIdJsonConverter());
Add(builder, new ProjectIdJsonConverter());
Add(builder, new DocumentIdJsonConverter());
Add(builder, new TextSpanJsonConverter());
Add(builder, new TextChangeJsonConverter());
Add(builder, new SymbolKeyJsonConverter());
AppendRoslynSpecificJsonConverters(builder);
return builder.ToImmutable();
}
private static void Add<T>(
ImmutableDictionary<Type, JsonConverter>.Builder builder,
BaseJsonConverter<T> converter)
{
builder.Add(typeof(T), converter);
}
private abstract class BaseJsonConverter<T> : JsonConverter
{
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);
=> ReadValue(reader, 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 T ReadValue(JsonReader reader, JsonSerializer serializer);
protected abstract void WriteValue(JsonWriter writer, T value, JsonSerializer serializer);
protected static U ReadProperty<U>(JsonSerializer serializer, JsonReader reader)
......@@ -91,7 +93,7 @@ protected static U ReadProperty<U>(JsonReader reader)
private class TextSpanJsonConverter : BaseJsonConverter<TextSpan>
{
protected override TextSpan ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
protected override TextSpan ReadValue(JsonReader reader, JsonSerializer serializer)
{
Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject);
......@@ -121,7 +123,7 @@ protected override void WriteValue(JsonWriter writer, TextSpan span, JsonSeriali
private class TextChangeJsonConverter : BaseJsonConverter<TextChange>
{
protected override TextChange ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
protected override TextChange ReadValue(JsonReader reader, JsonSerializer serializer)
{
Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject);
......@@ -157,27 +159,23 @@ protected override void WriteValue(JsonWriter writer, TextChange change, JsonSer
private class SymbolKeyJsonConverter : BaseJsonConverter<SymbolKey>
{
protected override SymbolKey ReadValue(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
protected override SymbolKey ReadValue(JsonReader reader, JsonSerializer serializer)
=> new SymbolKey((string)reader.Value);
protected override void WriteValue(JsonWriter writer, SymbolKey value, JsonSerializer serializer)
=> writer.WriteValue(value.ToString());
}
private class ChecksumJsonConverter : JsonConverter
private class ChecksumJsonConverter : BaseJsonConverter<Checksum>
{
public override bool CanConvert(Type objectType) => typeof(Checksum) == objectType;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
protected override Checksum ReadValue(JsonReader reader, JsonSerializer serializer)
{
var value = (string)reader.Value;
return value == null ? null : new Checksum(Convert.FromBase64String(value));
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(value?.ToString());
}
protected override void WriteValue(JsonWriter writer, Checksum value, JsonSerializer serializer)
=> writer.WriteValue(value?.ToString());
}
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册