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

Add json converters for core Add-Using type.

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