diff --git a/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.RoslynOnly.cs b/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.RoslynOnly.cs index 0c1ceb2c5c9cbec779ae4f3bcc3a7b4304276c47..62fdc35d147c767cefb54d5b3da1634759f1010f 100644 --- a/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.RoslynOnly.cs +++ b/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.RoslynOnly.cs @@ -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.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 { - 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 { - 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 + { + protected override PackageSource ReadValue(JsonReader reader, JsonSerializer serializer) + { + Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject); + + var name = ReadProperty(reader); + var source = ReadProperty(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 diff --git a/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.SolutionIdConverters.cs b/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.SolutionIdConverters.cs index 05122914b5933b7ef5eaf5278945d777012cac53..dcd2e0b21748506d5d1980660f8e930a5b2f2a2c 100644 --- a/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.SolutionIdConverters.cs +++ b/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.SolutionIdConverters.cs @@ -49,7 +49,7 @@ protected static void WriteIdAndName(JsonWriter writer, Guid id, string debugNam private class SolutionIdJsonConverter : WorkspaceIdJsonConverter { - 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 { - 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 { - 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); diff --git a/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.cs b/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.cs index 1e59e5e82c8a6e26146145f02deeb5fb86bd7b41..23a43d963cd56025620024c511e1beff31863408 100644 --- a/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.cs +++ b/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.cs @@ -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.Builder builder); private ImmutableDictionary CreateConverterMap() { var builder = ImmutableDictionary.CreateBuilder(); - 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( + ImmutableDictionary.Builder builder, + BaseJsonConverter converter) + { + builder.Add(typeof(T), converter); + } + private abstract class BaseJsonConverter : 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(JsonSerializer serializer, JsonReader reader) @@ -91,7 +93,7 @@ protected static U ReadProperty(JsonReader reader) private class TextSpanJsonConverter : BaseJsonConverter { - 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 { - 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 { - 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 { - 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