提交 ecf4d83a 编写于 作者: C CyrusNajmabadi

Use json serialization for some of our OOP types to simplify things.

上级 e3f5e072
......@@ -124,11 +124,11 @@ private async Task<RemoteHostClient.Session> TryGetSessionAsync()
return ImmutableArray<PackageWithTypeResult>.Empty;
}
var results = await session.InvokeAsync<SerializablePackageWithTypeResult[]>(
var results = await session.InvokeAsync<PackageWithTypeResult[]>(
nameof(IRemoteSymbolSearchUpdateEngine.FindPackagesWithTypeAsync),
source, name, arity).ConfigureAwait(false);
return results.Select(r => r.Rehydrate()).ToImmutableArray();
return results.ToImmutableArray();
}
public async Task<ImmutableArray<PackageWithAssemblyResult>> FindPackagesWithAssemblyAsync(
......@@ -141,11 +141,11 @@ private async Task<RemoteHostClient.Session> TryGetSessionAsync()
return ImmutableArray<PackageWithAssemblyResult>.Empty;
}
var results = await session.InvokeAsync<SerializablePackageWithAssemblyResult[]>(
var results = await session.InvokeAsync<PackageWithAssemblyResult[]>(
nameof(IRemoteSymbolSearchUpdateEngine.FindPackagesWithAssemblyAsync),
source, assemblyName).ConfigureAwait(false);
return results.Select(r => r.Rehydrate()).ToImmutableArray();
return results.ToImmutableArray();
}
public async Task<ImmutableArray<ReferenceAssemblyWithTypeResult>> FindReferenceAssembliesWithTypeAsync(
......@@ -158,11 +158,11 @@ private async Task<RemoteHostClient.Session> TryGetSessionAsync()
return ImmutableArray<ReferenceAssemblyWithTypeResult>.Empty;
}
var results = await session.InvokeAsync<SerializableReferenceAssemblyWithTypeResult[]>(
var results = await session.InvokeAsync<ReferenceAssemblyWithTypeResult[]>(
nameof(IRemoteSymbolSearchUpdateEngine.FindReferenceAssembliesWithTypeAsync),
name, arity).ConfigureAwait(false);
return results.Select(r => r.Rehydrate()).ToImmutableArray();
return results.ToImmutableArray();
}
public async Task UpdateContinuouslyAsync(
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Text;
namespace Microsoft.CodeAnalysis.DocumentHighlighting
{
......@@ -15,7 +15,7 @@ internal interface IRemoteDocumentHighlights
internal struct SerializableDocumentHighlights
{
public DocumentId DocumentId;
public SerializableHighlightSpan[] HighlightSpans;
public HighlightSpan[] HighlightSpans;
public static ImmutableArray<DocumentHighlights> Rehydrate(SerializableDocumentHighlights[] array, Solution solution)
{
......@@ -29,7 +29,7 @@ public static ImmutableArray<DocumentHighlights> Rehydrate(SerializableDocumentH
}
private DocumentHighlights Rehydrate(Solution solution)
=> new DocumentHighlights(solution.GetDocument(DocumentId), SerializableHighlightSpan.Rehydrate(HighlightSpans));
=> new DocumentHighlights(solution.GetDocument(DocumentId), HighlightSpans.ToImmutableArray());
public static SerializableDocumentHighlights[] Dehydrate(ImmutableArray<DocumentHighlights> array)
{
......@@ -48,47 +48,7 @@ private static SerializableDocumentHighlights Dehydrate(DocumentHighlights highl
=> new SerializableDocumentHighlights
{
DocumentId = highlights.Document.Id,
HighlightSpans = SerializableHighlightSpan.Dehydrate(highlights.HighlightSpans)
HighlightSpans = highlights.HighlightSpans.ToArray()
};
}
internal struct SerializableHighlightSpan
{
public TextSpan TextSpan;
public HighlightSpanKind Kind;
internal static SerializableHighlightSpan[] Dehydrate(ImmutableArray<HighlightSpan> array)
{
var result = new SerializableHighlightSpan[array.Length];
var index = 0;
foreach (var span in array)
{
result[index] = Dehydrate(span);
index++;
}
return result;
}
private static SerializableHighlightSpan Dehydrate(HighlightSpan span)
=> new SerializableHighlightSpan
{
Kind = span.Kind,
TextSpan = span.TextSpan
};
internal static ImmutableArray<HighlightSpan> Rehydrate(SerializableHighlightSpan[] array)
{
var result = ArrayBuilder<HighlightSpan>.GetInstance(array.Length);
foreach (var dehydrated in array)
{
result.Push(dehydrated.Rehydrate());
}
return result.ToImmutableAndFree();
}
private HighlightSpan Rehydrate()
=> new HighlightSpan(TextSpan, Kind);
}
}
\ No newline at end of file
......@@ -8,27 +8,6 @@
namespace Microsoft.CodeAnalysis.Remote
{
internal class SerializableTaggedText
{
public string Tag;
public string Text;
public static SerializableTaggedText Dehydrate(TaggedText taggedText)
{
return new SerializableTaggedText { Tag = taggedText.Tag, Text = taggedText.Text };
}
internal static SerializableTaggedText[] Dehydrate(ImmutableArray<TaggedText> displayTaggedParts)
{
return displayTaggedParts.Select(Dehydrate).ToArray();
}
public TaggedText Rehydrate()
{
return new TaggedText(Tag, Text);
}
}
#region NavigateTo
internal class SerializableNavigateToSearchResult
......@@ -104,7 +83,7 @@ internal class SerializableNavigableItem
{
public Glyph Glyph;
public SerializableTaggedText[] DisplayTaggedParts;
public TaggedText[] DisplayTaggedParts;
public bool DisplayFileLocation;
......@@ -120,7 +99,7 @@ public static SerializableNavigableItem Dehydrate(INavigableItem item)
return new SerializableNavigableItem
{
Glyph = item.Glyph,
DisplayTaggedParts = SerializableTaggedText.Dehydrate(item.DisplayTaggedParts),
DisplayTaggedParts = item.DisplayTaggedParts.ToArray(),
DisplayFileLocation = item.DisplayFileLocation,
IsImplicitlyDeclared = item.IsImplicitlyDeclared,
Document = item.Document.Id,
......@@ -140,7 +119,7 @@ public INavigableItem Rehydrate(Solution solution)
? ImmutableArray<INavigableItem>.Empty
: ChildItems.Select(c => c.Rehydrate(solution)).ToImmutableArray();
return new NavigableItem(
Glyph, DisplayTaggedParts.Select(p => p.Rehydrate()).ToImmutableArray(),
Glyph, DisplayTaggedParts.ToImmutableArray(),
DisplayFileLocation, IsImplicitlyDeclared,
solution.GetDocument(Document),
SourceSpan,
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.ErrorReporting;
using Microsoft.CodeAnalysis.FindSymbols;
using Microsoft.CodeAnalysis.SymbolSearch;
using Microsoft.CodeAnalysis.Text;
using Roslyn.Utilities;
......@@ -133,78 +130,4 @@ internal class SerializableReferenceLocation
}
#endregion
#region SymbolSearch
internal class SerializablePackageWithTypeResult
{
public string PackageName;
public string TypeName;
public string Version;
public int Rank;
public string[] ContainingNamespaceNames;
public static SerializablePackageWithTypeResult Dehydrate(PackageWithTypeResult result)
{
return new SerializablePackageWithTypeResult
{
PackageName = result.PackageName,
TypeName = result.TypeName,
Version = result.Version,
Rank = result.Rank,
ContainingNamespaceNames = result.ContainingNamespaceNames.ToArray(),
};
}
public PackageWithTypeResult Rehydrate()
{
return new PackageWithTypeResult(
PackageName, TypeName, Version, Rank, ContainingNamespaceNames);
}
}
internal class SerializablePackageWithAssemblyResult
{
public string PackageName;
public string Version;
public int Rank;
public static SerializablePackageWithAssemblyResult Dehydrate(PackageWithAssemblyResult result)
{
return new SerializablePackageWithAssemblyResult
{
PackageName = result.PackageName,
Version = result.Version,
Rank = result.Rank,
};
}
public PackageWithAssemblyResult Rehydrate()
=> new PackageWithAssemblyResult(PackageName, Version, Rank);
}
internal class SerializableReferenceAssemblyWithTypeResult
{
public string AssemblyName;
public string TypeName;
public string[] ContainingNamespaceNames;
public static SerializableReferenceAssemblyWithTypeResult Dehydrate(
ReferenceAssemblyWithTypeResult result)
{
return new SerializableReferenceAssemblyWithTypeResult
{
ContainingNamespaceNames = result.ContainingNamespaceNames.ToArray(),
AssemblyName = result.AssemblyName,
TypeName = result.TypeName
};
}
public ReferenceAssemblyWithTypeResult Rehydrate()
{
return new ReferenceAssemblyWithTypeResult(AssemblyName, TypeName, ContainingNamespaceNames);
}
}
#endregion
}
\ No newline at end of file
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Remote;
namespace Microsoft.CodeAnalysis.SymbolSearch
{
......@@ -9,8 +8,8 @@ internal interface IRemoteSymbolSearchUpdateEngine
{
Task UpdateContinuouslyAsync(string sourceName, string localSettingsDirectory);
Task<SerializablePackageWithTypeResult[]> FindPackagesWithTypeAsync(string source, string name, int arity);
Task<SerializablePackageWithAssemblyResult[]> FindPackagesWithAssemblyAsync(string source, string name);
Task<SerializableReferenceAssemblyWithTypeResult[]> FindReferenceAssembliesWithTypeAsync(string name, int arity);
Task<PackageWithTypeResult[]> FindPackagesWithTypeAsync(string source, string name, int arity);
Task<PackageWithAssemblyResult[]> FindPackagesWithAssemblyAsync(string source, string name);
Task<ReferenceAssemblyWithTypeResult[]> FindReferenceAssembliesWithTypeAsync(string name, int arity);
}
}
\ No newline at end of file
......@@ -26,27 +26,27 @@ public Task UpdateContinuouslyAsync(string sourceName, string localSettingsDirec
return _updateEngine.UpdateContinuouslyAsync(sourceName, localSettingsDirectory);
}
public async Task<SerializablePackageWithTypeResult[]> FindPackagesWithTypeAsync(string source, string name, int arity)
public async Task<PackageWithTypeResult[]> FindPackagesWithTypeAsync(string source, string name, int arity)
{
var results = await _updateEngine.FindPackagesWithTypeAsync(
source, name, arity).ConfigureAwait(false);
var serializedResults = results.Select(SerializablePackageWithTypeResult.Dehydrate).ToArray();
var serializedResults = results.ToArray();
return serializedResults;
}
public async Task<SerializablePackageWithAssemblyResult[]> FindPackagesWithAssemblyAsync(string source, string assemblyName)
public async Task<PackageWithAssemblyResult[]> FindPackagesWithAssemblyAsync(string source, string assemblyName)
{
var results = await _updateEngine.FindPackagesWithAssemblyAsync(
source, assemblyName).ConfigureAwait(false);
var serializedResults = results.Select(SerializablePackageWithAssemblyResult.Dehydrate).ToArray();
var serializedResults = results.ToArray();
return serializedResults;
}
public async Task<SerializableReferenceAssemblyWithTypeResult[]> FindReferenceAssembliesWithTypeAsync(string name, int arity)
public async Task<ReferenceAssemblyWithTypeResult[]> FindReferenceAssembliesWithTypeAsync(string name, int arity)
{
var results = await _updateEngine.FindReferenceAssembliesWithTypeAsync(
name, arity).ConfigureAwait(false);
var serializedResults = results.Select(SerializableReferenceAssemblyWithTypeResult.Dehydrate).ToArray();
var serializedResults = results.ToArray();
return serializedResults;
}
......
......@@ -2,7 +2,11 @@
using System;
using System.Collections.Immutable;
using System.Linq;
using Microsoft.CodeAnalysis.DocumentHighlighting;
using Microsoft.CodeAnalysis.Packaging;
using Microsoft.CodeAnalysis.SymbolSearch;
using Microsoft.CodeAnalysis.Text;
using Microsoft.CodeAnalysis.TodoComments;
using Newtonsoft.Json;
using Roslyn.Utilities;
......@@ -13,9 +17,16 @@ internal partial class AggregateJsonConverter : JsonConverter
{
partial void AppendRoslynSpecificJsonConverters(ImmutableDictionary<Type, JsonConverter>.Builder builder)
{
Add(builder, new HighlightSpanJsonConverter());
Add(builder, new TaggedTextJsonConverter());
Add(builder, new TodoCommentDescriptorJsonConverter());
Add(builder, new TodoCommentJsonConverter());
Add(builder, new PackageSourceJsonConverter());
Add(builder, new PackageWithTypeResultJsonConverter());
Add(builder, new PackageWithAssemblyResultJsonConverter());
Add(builder, new ReferenceAssemblyWithTypeResultJsonConverter());
}
private class TodoCommentDescriptorJsonConverter : BaseJsonConverter<TodoCommentDescriptor>
......@@ -69,13 +80,13 @@ protected override void WriteValue(JsonWriter writer, TodoComment todoComment, J
{
writer.WriteStartObject();
writer.WritePropertyName("descriptor");
writer.WritePropertyName(nameof(TodoComment.Descriptor));
serializer.Serialize(writer, todoComment.Descriptor);
writer.WritePropertyName("message");
writer.WritePropertyName(nameof(TodoComment.Message));
writer.WriteValue(todoComment.Message);
writer.WritePropertyName("position");
writer.WritePropertyName(nameof(TodoComment.Position));
writer.WriteValue(todoComment.Position);
writer.WriteEndObject();
......@@ -101,14 +112,179 @@ protected override void WriteValue(JsonWriter writer, PackageSource source, Json
{
writer.WriteStartObject();
writer.WritePropertyName("name");
writer.WritePropertyName(nameof(PackageSource.Name));
writer.WriteValue(source.Name);
writer.WritePropertyName("source");
writer.WritePropertyName(nameof(PackageSource.Source));
writer.WriteValue(source.Source);
writer.WriteEndObject();
}
}
private class HighlightSpanJsonConverter : BaseJsonConverter<HighlightSpan>
{
protected override HighlightSpan ReadValue(JsonReader reader, JsonSerializer serializer)
{
Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject);
var textSpan = ReadProperty<TextSpan>(serializer, reader);
var kind = (HighlightSpanKind)ReadProperty<long>(reader);
Contract.ThrowIfFalse(reader.Read());
Contract.ThrowIfFalse(reader.TokenType == JsonToken.EndObject);
return new HighlightSpan(textSpan, kind);
}
protected override void WriteValue(JsonWriter writer, HighlightSpan source, JsonSerializer serializer)
{
writer.WriteStartObject();
writer.WritePropertyName(nameof(HighlightSpan.TextSpan));
serializer.Serialize(writer, source.TextSpan);
writer.WritePropertyName(nameof(HighlightSpan.Kind));
writer.WriteValue(source.Kind);
writer.WriteEndObject();
}
}
private class PackageWithTypeResultJsonConverter : BaseJsonConverter<PackageWithTypeResult>
{
protected override PackageWithTypeResult ReadValue(JsonReader reader, JsonSerializer serializer)
{
Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject);
var packageName = ReadProperty<string>(reader);
var typeName = ReadProperty<string>(reader);
var version = ReadProperty<string>(reader);
var rank = (int)ReadProperty<long>(reader);
var containingNamespaceNames = ReadProperty<string[]>(serializer, reader);
Contract.ThrowIfFalse(reader.Read());
Contract.ThrowIfFalse(reader.TokenType == JsonToken.EndObject);
return new PackageWithTypeResult(packageName, typeName, version, rank, containingNamespaceNames);
}
protected override void WriteValue(JsonWriter writer, PackageWithTypeResult source, JsonSerializer serializer)
{
writer.WriteStartObject();
writer.WritePropertyName(nameof(PackageWithTypeResult.PackageName));
writer.WriteValue(source.PackageName);
writer.WritePropertyName(nameof(PackageWithTypeResult.TypeName));
writer.WriteValue(source.TypeName);
writer.WritePropertyName(nameof(PackageWithTypeResult.Version));
writer.WriteValue(source.Version);
writer.WritePropertyName(nameof(PackageWithTypeResult.Rank));
writer.WriteValue(source.Rank);
writer.WritePropertyName(nameof(PackageWithTypeResult.ContainingNamespaceNames));
writer.WriteValue(source.ContainingNamespaceNames.ToArray());
writer.WriteEndObject();
}
}
private class PackageWithAssemblyResultJsonConverter : BaseJsonConverter<PackageWithAssemblyResult>
{
protected override PackageWithAssemblyResult ReadValue(JsonReader reader, JsonSerializer serializer)
{
Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject);
var packageName = ReadProperty<string>(reader);
var version = ReadProperty<string>(reader);
var rank = (int)ReadProperty<long>(reader);
Contract.ThrowIfFalse(reader.Read());
Contract.ThrowIfFalse(reader.TokenType == JsonToken.EndObject);
return new PackageWithAssemblyResult(packageName, version, rank);
}
protected override void WriteValue(JsonWriter writer, PackageWithAssemblyResult source, JsonSerializer serializer)
{
writer.WriteStartObject();
writer.WritePropertyName(nameof(PackageWithAssemblyResult.PackageName));
writer.WriteValue(source.PackageName);
writer.WritePropertyName(nameof(PackageWithAssemblyResult.Version));
writer.WriteValue(source.Version);
writer.WritePropertyName(nameof(PackageWithAssemblyResult.Rank));
writer.WriteValue(source.Rank);
writer.WriteEndObject();
}
}
private class ReferenceAssemblyWithTypeResultJsonConverter : BaseJsonConverter<ReferenceAssemblyWithTypeResult>
{
protected override ReferenceAssemblyWithTypeResult ReadValue(JsonReader reader, JsonSerializer serializer)
{
Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject);
var assemblyName = ReadProperty<string>(reader);
var typeName = ReadProperty<string>(reader);
var containingNamespaceNames = ReadProperty<string[]>(serializer, reader);
Contract.ThrowIfFalse(reader.Read());
Contract.ThrowIfFalse(reader.TokenType == JsonToken.EndObject);
return new ReferenceAssemblyWithTypeResult(assemblyName, typeName, containingNamespaceNames);
}
protected override void WriteValue(JsonWriter writer, ReferenceAssemblyWithTypeResult source, JsonSerializer serializer)
{
writer.WriteStartObject();
writer.WritePropertyName(nameof(ReferenceAssemblyWithTypeResult.AssemblyName));
writer.WriteValue(source.AssemblyName);
writer.WritePropertyName(nameof(ReferenceAssemblyWithTypeResult.TypeName));
writer.WriteValue(source.TypeName);
writer.WritePropertyName(nameof(ReferenceAssemblyWithTypeResult.ContainingNamespaceNames));
writer.WriteValue(source.ContainingNamespaceNames.ToArray());
writer.WriteEndObject();
}
}
private class TaggedTextJsonConverter : BaseJsonConverter<TaggedText>
{
protected override TaggedText ReadValue(JsonReader reader, JsonSerializer serializer)
{
Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject);
var tag = ReadProperty<string>(reader);
var text = ReadProperty<string>(reader);
Contract.ThrowIfFalse(reader.Read());
Contract.ThrowIfFalse(reader.TokenType == JsonToken.EndObject);
return new TaggedText(tag, text);
}
protected override void WriteValue(JsonWriter writer, TaggedText source, JsonSerializer serializer)
{
writer.WriteStartObject();
writer.WritePropertyName(nameof(TaggedText.Tag));
writer.WriteValue(source.Tag);
writer.WritePropertyName(nameof(TaggedText.Text));
writer.WriteValue(source.Text);
writer.WriteEndObject();
}
}
}
}
\ No newline at end of file
......@@ -111,10 +111,10 @@ protected override void WriteValue(JsonWriter writer, TextSpan span, JsonSeriali
{
writer.WriteStartObject();
writer.WritePropertyName("start");
writer.WritePropertyName(nameof(TextSpan.Start));
writer.WriteValue(span.Start);
writer.WritePropertyName("length");
writer.WritePropertyName(nameof(TextSpan.Length));
writer.WriteValue(span.Length);
writer.WriteEndObject();
......@@ -144,13 +144,13 @@ protected override void WriteValue(JsonWriter writer, TextChange change, JsonSer
writer.WriteStartObject();
writer.WritePropertyName("start");
writer.WritePropertyName(nameof(TextSpan.Start));
writer.WriteValue(span.Start);
writer.WritePropertyName("length");
writer.WritePropertyName(nameof(TextSpan.Length));
writer.WriteValue(span.Length);
writer.WritePropertyName("newText");
writer.WritePropertyName(nameof(TextChange.NewText));
writer.WriteValue(change.NewText);
writer.WriteEndObject();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册