diff --git a/src/EditorFeatures/CSharpTest/AddUsing/AddUsingTests_NuGet.cs b/src/EditorFeatures/CSharpTest/AddUsing/AddUsingTests_NuGet.cs index 216c38468cc82f68a559a4d1e148a001c8ad6ca4..73c02e0dc70494fa0afff158680fed9d4aa8dba8 100644 --- a/src/EditorFeatures/CSharpTest/AddUsing/AddUsingTests_NuGet.cs +++ b/src/EditorFeatures/CSharpTest/AddUsing/AddUsingTests_NuGet.cs @@ -258,7 +258,7 @@ public async Task TestFailedInstallRollsBackFile() } private Task> CreateSearchResult( - string packageName, string typeName, IReadOnlyList containingNamespaceNames) + string packageName, string typeName, ImmutableArray containingNamespaceNames) { return CreateSearchResult(new PackageWithTypeResult( packageName: packageName, typeName: typeName, version: null, @@ -268,6 +268,6 @@ public async Task TestFailedInstallRollsBackFile() private Task> CreateSearchResult(params PackageWithTypeResult[] results) => Task.FromResult(ImmutableArray.Create(results)); - private IReadOnlyList CreateNameParts(params string[] parts) => parts; + private ImmutableArray CreateNameParts(params string[] parts) => parts.ToImmutableArray(); } } \ No newline at end of file diff --git a/src/EditorFeatures/Core/SymbolSearch/SymbolSearchUpdateEngine.cs b/src/EditorFeatures/Core/SymbolSearch/SymbolSearchUpdateEngine.cs index 5134564c6797a24842fd53a36dc5b295d8097a28..721e112cd6d340965c991418af8ec9c37aeba957 100644 --- a/src/EditorFeatures/Core/SymbolSearch/SymbolSearchUpdateEngine.cs +++ b/src/EditorFeatures/Core/SymbolSearch/SymbolSearchUpdateEngine.cs @@ -175,10 +175,11 @@ public SymbolSearchUpdateEngine(ISymbolSearchLogService logService) // Only look at reference assembly results. if (type.PackageName.ToString() == MicrosoftAssemblyReferencesName) { - var nameParts = new List(); + var nameParts = ArrayBuilder.GetInstance(); GetFullName(nameParts, type.FullName.Parent); var result = new ReferenceAssemblyWithTypeResult( - type.AssemblyName.ToString(), type.Name.ToString(), containingNamespaceNames: nameParts); + type.AssemblyName.ToString(), type.Name.ToString(), + containingNamespaceNames: nameParts.ToImmutableAndFree()); results.Add(result); } } @@ -200,7 +201,7 @@ where this.IsType(symbol) && !this.IsType(symbol.Parent()) private PackageWithTypeResult CreateResult(AddReferenceDatabase database, Symbol type) { - var nameParts = new List(); + var nameParts = ArrayBuilder.GetInstance(); GetFullName(nameParts, type.FullName.Parent); var packageName = type.PackageName.ToString(); @@ -212,7 +213,7 @@ private PackageWithTypeResult CreateResult(AddReferenceDatabase database, Symbol typeName: type.Name.ToString(), version: version, rank: GetRank(type), - containingNamespaceNames: nameParts); + containingNamespaceNames: nameParts.ToImmutableAndFree()); } private int GetRank(Symbol symbol) @@ -260,7 +261,7 @@ private bool IsType(Symbol symbol) return symbol.Type.IsType(); } - private void GetFullName(List nameParts, Path8 path) + private void GetFullName(ArrayBuilder nameParts, Path8 path) { if (!path.IsEmpty) { diff --git a/src/EditorFeatures/Core/SymbolSearch/SymbolSearchUpdateEngineFactory.cs b/src/EditorFeatures/Core/SymbolSearch/SymbolSearchUpdateEngineFactory.cs index dbf289fb1a9af12ed5ea565fa19a7534227fcf44..d70a3c089fb12272904f12f954e536bb53993010 100644 --- a/src/EditorFeatures/Core/SymbolSearch/SymbolSearchUpdateEngineFactory.cs +++ b/src/EditorFeatures/Core/SymbolSearch/SymbolSearchUpdateEngineFactory.cs @@ -124,11 +124,11 @@ private async Task TryGetSessionAsync() return ImmutableArray.Empty; } - var results = await session.InvokeAsync( + var results = await session.InvokeAsync>( nameof(IRemoteSymbolSearchUpdateEngine.FindPackagesWithTypeAsync), source, name, arity).ConfigureAwait(false); - return results.Select(r => r.Rehydrate()).ToImmutableArray(); + return results; } public async Task> FindPackagesWithAssemblyAsync( @@ -141,11 +141,11 @@ private async Task TryGetSessionAsync() return ImmutableArray.Empty; } - var results = await session.InvokeAsync( + var results = await session.InvokeAsync>( nameof(IRemoteSymbolSearchUpdateEngine.FindPackagesWithAssemblyAsync), source, assemblyName).ConfigureAwait(false); - return results.Select(r => r.Rehydrate()).ToImmutableArray(); + return results; } public async Task> FindReferenceAssembliesWithTypeAsync( @@ -158,11 +158,11 @@ private async Task TryGetSessionAsync() return ImmutableArray.Empty; } - var results = await session.InvokeAsync( + var results = await session.InvokeAsync>( nameof(IRemoteSymbolSearchUpdateEngine.FindReferenceAssembliesWithTypeAsync), name, arity).ConfigureAwait(false); - return results.Select(r => r.Rehydrate()).ToImmutableArray(); + return results; } public async Task UpdateContinuouslyAsync( diff --git a/src/EditorFeatures/VisualBasicTest/Diagnostics/AddImport/AddImportTests_NuGet.vb b/src/EditorFeatures/VisualBasicTest/Diagnostics/AddImport/AddImportTests_NuGet.vb index 929c5e84c2b987c399b6c313ba27c212adb2306f..7592a2fe5210f28ce09ee69244c35a16ac724c82 100644 --- a/src/EditorFeatures/VisualBasicTest/Diagnostics/AddImport/AddImportTests_NuGet.vb +++ b/src/EditorFeatures/VisualBasicTest/Diagnostics/AddImport/AddImportTests_NuGet.vb @@ -239,7 +239,7 @@ End Class", fixProviderData:=New ProviderData(installerServiceMock.Object, packa installerServiceMock.Verify() End Function - Private Function CreateSearchResult(packageName As String, typeName As String, nameParts As IReadOnlyList(Of String)) As Task(Of ImmutableArray(Of PackageWithTypeResult)) + Private Function CreateSearchResult(packageName As String, typeName As String, nameParts As ImmutableArray(Of String)) As Task(Of ImmutableArray(Of PackageWithTypeResult)) Return CreateSearchResult(New PackageWithTypeResult( packageName:=packageName, typeName:=typeName, @@ -252,8 +252,8 @@ End Class", fixProviderData:=New ProviderData(installerServiceMock.Object, packa Return Task.FromResult(ImmutableArray.Create(results)) End Function - Private Function CreateNameParts(ParamArray parts As String()) As IReadOnlyList(Of String) - Return parts + Private Function CreateNameParts(ParamArray parts As String()) As ImmutableArray(Of String) + Return parts.ToImmutableArray() End Function End Class End Namespace \ No newline at end of file diff --git a/src/Features/Core/Portable/DesignerAttributes/IRemoteDesignerAttributeService.cs b/src/Features/Core/Portable/DesignerAttributes/IRemoteDesignerAttributeService.cs index e17055ec67a63be493b20d9f1fd7c6ffc456dccf..b86dac82f84e4648ca451df64cbb0476ed756af2 100644 --- a/src/Features/Core/Portable/DesignerAttributes/IRemoteDesignerAttributeService.cs +++ b/src/Features/Core/Portable/DesignerAttributes/IRemoteDesignerAttributeService.cs @@ -1,11 +1,12 @@ // 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.Threading.Tasks; namespace Microsoft.CodeAnalysis.DesignerAttributes { internal interface IRemoteDesignerAttributeService { - Task ScanDesignerAttributesAsync(ProjectId projectId); + Task> ScanDesignerAttributesAsync(ProjectId projectId); } -} +} \ No newline at end of file diff --git a/src/Features/Core/Portable/DocumentHighlighting/AbstractDocumentHighlightsService.cs b/src/Features/Core/Portable/DocumentHighlighting/AbstractDocumentHighlightsService.cs index b886b69ba216dc2bffc8022f7773fb66738dae47..430644d4ec8cf2029006749f995008d7a18b832a 100644 --- a/src/Features/Core/Portable/DocumentHighlighting/AbstractDocumentHighlightsService.cs +++ b/src/Features/Core/Portable/DocumentHighlighting/AbstractDocumentHighlightsService.cs @@ -48,12 +48,12 @@ internal abstract partial class AbstractDocumentHighlightsService : IDocumentHig return (succeeded: false, ImmutableArray.Empty); } - var result = await session.InvokeAsync( + var result = await session.InvokeAsync>( nameof(IRemoteDocumentHighlights.GetDocumentHighlightsAsync), document.Id, position, documentsToSearch.Select(d => d.Id).ToArray()).ConfigureAwait(false); - return (true, SerializableDocumentHighlights.Rehydrate(result, document.Project.Solution)); + return (true, result.SelectAsArray(h => h.Rehydrate(document.Project.Solution))); } } diff --git a/src/Features/Core/Portable/DocumentHighlighting/IRemoteDocumentHighlights.cs b/src/Features/Core/Portable/DocumentHighlighting/IRemoteDocumentHighlights.cs index b58c6f35a18fd281e54a896e2401a0b51c208e33..b2da370d4cd81bf37a26dee960d97865d6157c27 100644 --- a/src/Features/Core/Portable/DocumentHighlighting/IRemoteDocumentHighlights.cs +++ b/src/Features/Core/Portable/DocumentHighlighting/IRemoteDocumentHighlights.cs @@ -1,94 +1,30 @@ // 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 { internal interface IRemoteDocumentHighlights { - Task GetDocumentHighlightsAsync( + Task> GetDocumentHighlightsAsync( DocumentId documentId, int position, DocumentId[] documentIdsToSearch); } internal struct SerializableDocumentHighlights { public DocumentId DocumentId; - public SerializableHighlightSpan[] HighlightSpans; + public ImmutableArray HighlightSpans; - public static ImmutableArray Rehydrate(SerializableDocumentHighlights[] array, Solution solution) - { - var result = ArrayBuilder.GetInstance(array.Length); - foreach (var dehydrated in array) - { - result.Push(dehydrated.Rehydrate(solution)); - } - - return result.ToImmutableAndFree(); - } - - private DocumentHighlights Rehydrate(Solution solution) - => new DocumentHighlights(solution.GetDocument(DocumentId), SerializableHighlightSpan.Rehydrate(HighlightSpans)); - - public static SerializableDocumentHighlights[] Dehydrate(ImmutableArray array) - { - var result = new SerializableDocumentHighlights[array.Length]; - var index = 0; - foreach (var highlights in array) - { - result[index] = Dehydrate(highlights); - index++; - } + public DocumentHighlights Rehydrate(Solution solution) + => new DocumentHighlights(solution.GetDocument(DocumentId), HighlightSpans.ToImmutableArray()); - return result; - } - - private static SerializableDocumentHighlights Dehydrate(DocumentHighlights highlights) + public static SerializableDocumentHighlights Dehydrate(DocumentHighlights highlights) => new SerializableDocumentHighlights { DocumentId = highlights.Document.Id, - HighlightSpans = SerializableHighlightSpan.Dehydrate(highlights.HighlightSpans) + HighlightSpans = highlights.HighlightSpans }; } - - internal struct SerializableHighlightSpan - { - public TextSpan TextSpan; - public HighlightSpanKind Kind; - - internal static SerializableHighlightSpan[] Dehydrate(ImmutableArray 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 Rehydrate(SerializableHighlightSpan[] array) - { - var result = ArrayBuilder.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 diff --git a/src/Features/Core/Portable/NavigateTo/AbstractNavigateToSearchService.Remote.cs b/src/Features/Core/Portable/NavigateTo/AbstractNavigateToSearchService.Remote.cs index e1d4b93dae3ec6d73b2cee3b109f1618f20d8bec..f33c8f786617a0488df124403e3f181fdc59f029 100644 --- a/src/Features/Core/Portable/NavigateTo/AbstractNavigateToSearchService.Remote.cs +++ b/src/Features/Core/Portable/NavigateTo/AbstractNavigateToSearchService.Remote.cs @@ -15,23 +15,21 @@ internal abstract partial class AbstractNavigateToSearchService private async Task> SearchDocumentInRemoteProcessAsync( RemoteHostClient.Session session, Document document, string searchPattern, CancellationToken cancellationToken) { - var serializableResults = await session.InvokeAsync( + var serializableResults = await session.InvokeAsync>( nameof(IRemoteNavigateToSearchService.SearchDocumentAsync), new object[] { document.Id, searchPattern }, cancellationToken).ConfigureAwait(false); - serializableResults = serializableResults ?? Array.Empty(); - return serializableResults.Select(r => r.Rehydrate(document.Project.Solution)).ToImmutableArray(); + return serializableResults.SelectAsArray(r => r.Rehydrate(document.Project.Solution)); } private async Task> SearchProjectInRemoteProcessAsync( RemoteHostClient.Session session, Project project, string searchPattern, CancellationToken cancellationToken) { - var serializableResults = await session.InvokeAsync( + var serializableResults = await session.InvokeAsync>( nameof(IRemoteNavigateToSearchService.SearchProjectAsync), new object[] { project.Id, searchPattern }, cancellationToken).ConfigureAwait(false); - serializableResults = serializableResults ?? Array.Empty(); - return serializableResults.Select(r => r.Rehydrate(project.Solution)).ToImmutableArray(); + return serializableResults.SelectAsArray(r => r.Rehydrate(project.Solution)); } private static Task GetRemoteHostSessionAsync(Project project, CancellationToken cancellationToken) diff --git a/src/Features/Core/Portable/NavigateTo/IRemoteNavigateToSearchService.cs b/src/Features/Core/Portable/NavigateTo/IRemoteNavigateToSearchService.cs index 574d55e4b016495924ae4b480bc5c259add857c0..6ee8530cc7a91f1bcb5d0210e958d9aebe572a0f 100644 --- a/src/Features/Core/Portable/NavigateTo/IRemoteNavigateToSearchService.cs +++ b/src/Features/Core/Portable/NavigateTo/IRemoteNavigateToSearchService.cs @@ -1,5 +1,6 @@ // 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.Threading.Tasks; using Microsoft.CodeAnalysis.Remote; @@ -7,7 +8,7 @@ namespace Microsoft.CodeAnalysis.NavigateTo { internal interface IRemoteNavigateToSearchService { - Task SearchDocumentAsync(DocumentId documentId, string searchPattern); - Task SearchProjectAsync(ProjectId projectId, string searchPattern); + Task> SearchDocumentAsync(DocumentId documentId, string searchPattern); + Task> SearchProjectAsync(ProjectId projectId, string searchPattern); } } diff --git a/src/Features/Core/Portable/Remote/RemoteArguments.cs b/src/Features/Core/Portable/Remote/RemoteArguments.cs index ac01a08432e5957da623ad3ce21f6b3ccde77fc3..0172cff8e8c62aa48db4e7c775afe26c81914b74 100644 --- a/src/Features/Core/Portable/Remote/RemoteArguments.cs +++ b/src/Features/Core/Portable/Remote/RemoteArguments.cs @@ -1,34 +1,12 @@ // 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 Microsoft.CodeAnalysis.NavigateTo; using Microsoft.CodeAnalysis.Navigation; using Microsoft.CodeAnalysis.Text; 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 displayTaggedParts) - { - return displayTaggedParts.Select(Dehydrate).ToArray(); - } - - public TaggedText Rehydrate() - { - return new TaggedText(Tag, Text); - } - } - #region NavigateTo internal class SerializableNavigateToSearchResult @@ -39,7 +17,7 @@ internal class SerializableNavigateToSearchResult public NavigateToMatchKind MatchKind; public bool IsCaseSensitive; public string Name; - public TextSpan[] NameMatchSpans; + public ImmutableArray NameMatchSpans; public string SecondarySort; public string Summary; @@ -54,7 +32,7 @@ internal static SerializableNavigateToSearchResult Dehydrate(INavigateToSearchRe MatchKind = result.MatchKind, IsCaseSensitive = result.IsCaseSensitive, Name = result.Name, - NameMatchSpans = result.NameMatchSpans.ToArray(), + NameMatchSpans = result.NameMatchSpans, SecondarySort = result.SecondarySort, Summary = result.Summary, NavigableItem = SerializableNavigableItem.Dehydrate(result.NavigableItem) @@ -104,7 +82,7 @@ internal class SerializableNavigableItem { public Glyph Glyph; - public SerializableTaggedText[] DisplayTaggedParts; + public ImmutableArray DisplayTaggedParts; public bool DisplayFileLocation; @@ -113,34 +91,29 @@ internal class SerializableNavigableItem public DocumentId Document; public TextSpan SourceSpan; - SerializableNavigableItem[] ChildItems; + ImmutableArray ChildItems; public static SerializableNavigableItem Dehydrate(INavigableItem item) { return new SerializableNavigableItem { Glyph = item.Glyph, - DisplayTaggedParts = SerializableTaggedText.Dehydrate(item.DisplayTaggedParts), + DisplayTaggedParts = item.DisplayTaggedParts, DisplayFileLocation = item.DisplayFileLocation, IsImplicitlyDeclared = item.IsImplicitlyDeclared, Document = item.Document.Id, SourceSpan = item.SourceSpan, - ChildItems = SerializableNavigableItem.Dehydrate(item.ChildItems) + ChildItems = item.ChildItems.SelectAsArray(Dehydrate) }; } - private static SerializableNavigableItem[] Dehydrate(ImmutableArray childItems) - { - return childItems.Select(Dehydrate).ToArray(); - } - public INavigableItem Rehydrate(Solution solution) { var childItems = ChildItems == null ? ImmutableArray.Empty - : ChildItems.Select(c => c.Rehydrate(solution)).ToImmutableArray(); + : ChildItems.SelectAsArray(c => c.Rehydrate(solution)); return new NavigableItem( - Glyph, DisplayTaggedParts.Select(p => p.Rehydrate()).ToImmutableArray(), + Glyph, DisplayTaggedParts.ToImmutableArray(), DisplayFileLocation, IsImplicitlyDeclared, solution.GetDocument(Document), SourceSpan, diff --git a/src/VisualStudio/Core/Def/Implementation/DesignerAttribute/DesignerAttributeIncrementalAnalyzer.cs b/src/VisualStudio/Core/Def/Implementation/DesignerAttribute/DesignerAttributeIncrementalAnalyzer.cs index 11897a6425c13618e2098574680ea40c569d439e..25670a77c3816ebeca062febd3071b7ec7e5587d 100644 --- a/src/VisualStudio/Core/Def/Implementation/DesignerAttribute/DesignerAttributeIncrementalAnalyzer.cs +++ b/src/VisualStudio/Core/Def/Implementation/DesignerAttribute/DesignerAttributeIncrementalAnalyzer.cs @@ -121,7 +121,7 @@ public async Task AnalyzeProjectAsync(Project project, bool semanticsChanged, In return null; } - var serializedResults = await session.InvokeAsync( + var serializedResults = await session.InvokeAsync>( nameof(IRemoteDesignerAttributeService.ScanDesignerAttributesAsync), project.Id).ConfigureAwait(false); var data = serializedResults.ToImmutableDictionary(kvp => kvp.FilePath); diff --git a/src/VisualStudio/Core/Test.Next/Services/ServiceHubServicesTests.cs b/src/VisualStudio/Core/Test.Next/Services/ServiceHubServicesTests.cs index 94df904ea4f9057776e8a9d6a464f29664dbffb4..4830f76dd3ef7456c4cca8328f8b4f2a53afd299 100644 --- a/src/VisualStudio/Core/Test.Next/Services/ServiceHubServicesTests.cs +++ b/src/VisualStudio/Core/Test.Next/Services/ServiceHubServicesTests.cs @@ -93,7 +93,7 @@ class Test { }"; var solution = workspace.CurrentSolution; - var result = await client.RunCodeAnalysisServiceOnRemoteHostAsync( + var result = await client.RunCodeAnalysisServiceOnRemoteHostAsync>( solution, nameof(IRemoteDesignerAttributeService.ScanDesignerAttributesAsync), solution.Projects.First().Id, CancellationToken.None); diff --git a/src/Workspaces/Core/Portable/FindSymbols/Declarations/DeclarationFinder_AllDeclarations.cs b/src/Workspaces/Core/Portable/FindSymbols/Declarations/DeclarationFinder_AllDeclarations.cs index 515fe0757fd8d1b3c44b8b3d3d72185a379352e1..188088e5a28a6081a1f9fc0a6ece29c2b1a07ca2 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/Declarations/DeclarationFinder_AllDeclarations.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/Declarations/DeclarationFinder_AllDeclarations.cs @@ -98,7 +98,7 @@ internal static partial class DeclarationFinder { if (session != null) { - var result = await session.InvokeAsync( + var result = await session.InvokeAsync>( nameof(IRemoteSymbolFinder.FindAllDeclarationsWithNormalQueryAsync), project.Id, query.Name, query.Kind, criteria).ConfigureAwait(false); @@ -113,7 +113,7 @@ internal static partial class DeclarationFinder } private static async Task> RehydrateAsync( - Solution solution, SerializableSymbolAndProjectId[] array, CancellationToken cancellationToken) + Solution solution, ImmutableArray array, CancellationToken cancellationToken) { var result = ArrayBuilder.GetInstance(array.Length); diff --git a/src/Workspaces/Core/Portable/FindSymbols/Declarations/DeclarationFinder_SourceDeclarations.cs b/src/Workspaces/Core/Portable/FindSymbols/Declarations/DeclarationFinder_SourceDeclarations.cs index 0b3b97066249d128dad9b713ed6698e188744dbf..12f54f688e5796d69cbb7dd6eb3eea252f89f809 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/Declarations/DeclarationFinder_SourceDeclarations.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/Declarations/DeclarationFinder_SourceDeclarations.cs @@ -118,7 +118,7 @@ internal static partial class DeclarationFinder { if (session != null) { - var result = await session.InvokeAsync( + var result = await session.InvokeAsync>( nameof(IRemoteSymbolFinder.FindSolutionSourceDeclarationsWithNormalQueryAsync), name, ignoreCase, criteria).ConfigureAwait(false); @@ -139,7 +139,7 @@ internal static partial class DeclarationFinder { if (session != null) { - var result = await session.InvokeAsync( + var result = await session.InvokeAsync>( nameof(IRemoteSymbolFinder.FindProjectSourceDeclarationsWithNormalQueryAsync), project.Id, name, ignoreCase, criteria).ConfigureAwait(false); @@ -160,7 +160,7 @@ internal static partial class DeclarationFinder { if (session != null) { - var result = await session.InvokeAsync( + var result = await session.InvokeAsync>( nameof(IRemoteSymbolFinder.FindProjectSourceDeclarationsWithPatternAsync), project.Id, pattern, criteria).ConfigureAwait(false); diff --git a/src/Workspaces/Core/Portable/FindSymbols/IRemoteSymbolFinder.cs b/src/Workspaces/Core/Portable/FindSymbols/IRemoteSymbolFinder.cs index 482c6430e4725c7787e433f177c02b8a4e2e294d..00043271eae2ef536841201f6646c43e371c3a79 100644 --- a/src/Workspaces/Core/Portable/FindSymbols/IRemoteSymbolFinder.cs +++ b/src/Workspaces/Core/Portable/FindSymbols/IRemoteSymbolFinder.cs @@ -1,5 +1,6 @@ // 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.Threading.Tasks; using Microsoft.CodeAnalysis.Remote; @@ -10,16 +11,16 @@ internal interface IRemoteSymbolFinder Task FindReferencesAsync(SerializableSymbolAndProjectId symbolAndProjectIdArg, DocumentId[] documentArgs); Task FindLiteralReferencesAsync(object value); - Task FindAllDeclarationsWithNormalQueryAsync( + Task> FindAllDeclarationsWithNormalQueryAsync( ProjectId projectId, string name, SearchKind searchKind, SymbolFilter criteria); - Task FindSolutionSourceDeclarationsWithNormalQueryAsync( + Task> FindSolutionSourceDeclarationsWithNormalQueryAsync( string name, bool ignoreCase, SymbolFilter criteria); - Task FindProjectSourceDeclarationsWithNormalQueryAsync( + Task> FindProjectSourceDeclarationsWithNormalQueryAsync( ProjectId projectId, string name, bool ignoreCase, SymbolFilter criteria); - Task FindProjectSourceDeclarationsWithPatternAsync( + Task> FindProjectSourceDeclarationsWithPatternAsync( ProjectId projectId, string pattern, SymbolFilter criteria); } } \ No newline at end of file diff --git a/src/Workspaces/Core/Portable/Remote/RemoteArguments.cs b/src/Workspaces/Core/Portable/Remote/RemoteArguments.cs index 4e214eeb2d9c8c2b0665df9ead9f18707a27df2e..bb4bdd6fd7ecb4aecd10ab1911aca398d1179e80 100644 --- a/src/Workspaces/Core/Portable/Remote/RemoteArguments.cs +++ b/src/Workspaces/Core/Portable/Remote/RemoteArguments.cs @@ -1,13 +1,10 @@ // 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 diff --git a/src/Workspaces/Core/Portable/SymbolSearch/IRemoteSymbolSearchUpdateEngine.cs b/src/Workspaces/Core/Portable/SymbolSearch/IRemoteSymbolSearchUpdateEngine.cs index bb80164a5ca573db6e4e48a665bdf702ee5dea57..367c86972b4a5232bc9967d8cfa4fe424f5d3fa5 100644 --- a/src/Workspaces/Core/Portable/SymbolSearch/IRemoteSymbolSearchUpdateEngine.cs +++ b/src/Workspaces/Core/Portable/SymbolSearch/IRemoteSymbolSearchUpdateEngine.cs @@ -1,7 +1,7 @@ // 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.Threading.Tasks; -using Microsoft.CodeAnalysis.Remote; namespace Microsoft.CodeAnalysis.SymbolSearch { @@ -9,8 +9,8 @@ internal interface IRemoteSymbolSearchUpdateEngine { Task UpdateContinuouslyAsync(string sourceName, string localSettingsDirectory); - Task FindPackagesWithTypeAsync(string source, string name, int arity); - Task FindPackagesWithAssemblyAsync(string source, string name); - Task FindReferenceAssembliesWithTypeAsync(string name, int arity); + Task> FindPackagesWithTypeAsync(string source, string name, int arity); + Task> FindPackagesWithAssemblyAsync(string source, string name); + Task> FindReferenceAssembliesWithTypeAsync(string name, int arity); } } \ No newline at end of file diff --git a/src/Workspaces/Core/Portable/SymbolSearch/ISymbolSearchService.cs b/src/Workspaces/Core/Portable/SymbolSearch/ISymbolSearchService.cs index 9fd1fff277ef521514b096c7d0604fb9394298a5..d1b2838f5d558dbfad06a716b7157efdd4d5909d 100644 --- a/src/Workspaces/Core/Portable/SymbolSearch/ISymbolSearchService.cs +++ b/src/Workspaces/Core/Portable/SymbolSearch/ISymbolSearchService.cs @@ -64,7 +64,7 @@ protected PackageResult(string packageName, int rank) internal class PackageWithTypeResult : PackageResult { - public readonly IReadOnlyList ContainingNamespaceNames; + public readonly ImmutableArray ContainingNamespaceNames; public readonly string TypeName; public readonly string Version; @@ -73,7 +73,7 @@ internal class PackageWithTypeResult : PackageResult string typeName, string version, int rank, - IReadOnlyList containingNamespaceNames) + ImmutableArray containingNamespaceNames) : base(packageName, rank) { TypeName = typeName; @@ -118,14 +118,14 @@ public int CompareTo(PackageWithAssemblyResult other) internal class ReferenceAssemblyWithTypeResult { - public readonly IReadOnlyList ContainingNamespaceNames; + public readonly ImmutableArray ContainingNamespaceNames; public readonly string AssemblyName; public readonly string TypeName; public ReferenceAssemblyWithTypeResult( string assemblyName, string typeName, - IReadOnlyList containingNamespaceNames) + ImmutableArray containingNamespaceNames) { AssemblyName = assemblyName; TypeName = typeName; diff --git a/src/Workspaces/Remote/ServiceHub/Services/CodeAnalysisService_DesignerAttributes.cs b/src/Workspaces/Remote/ServiceHub/Services/CodeAnalysisService_DesignerAttributes.cs index f1cfbaa0565c2b56ebbeea8ace8c71037ddb51c6..399b4263ee1ce6de546f85cd9afb82ba6e0d972c 100644 --- a/src/Workspaces/Remote/ServiceHub/Services/CodeAnalysisService_DesignerAttributes.cs +++ b/src/Workspaces/Remote/ServiceHub/Services/CodeAnalysisService_DesignerAttributes.cs @@ -1,5 +1,6 @@ // 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.DesignerAttributes; @@ -16,7 +17,7 @@ internal partial class CodeAnalysisService : IRemoteDesignerAttributeService /// /// This will be called by ServiceHub/JsonRpc framework /// - public async Task ScanDesignerAttributesAsync(ProjectId projectId) + public async Task> ScanDesignerAttributesAsync(ProjectId projectId) { using (RoslynLogger.LogBlock(FunctionId.CodeAnalysisService_GetDesignerAttributesAsync, projectId.DebugName, CancellationToken)) { @@ -25,7 +26,7 @@ public async Task ScanDesignerAttributesAsync(P var data = await AbstractDesignerAttributeService.TryAnalyzeProjectInCurrentProcessAsync( project, CancellationToken).ConfigureAwait(false); - return data.Values.ToArray(); + return data.Values.ToImmutableArray(); } } } diff --git a/src/Workspaces/Remote/ServiceHub/Services/CodeAnalysisService_DocumentHighlights.cs b/src/Workspaces/Remote/ServiceHub/Services/CodeAnalysisService_DocumentHighlights.cs index b98c8e58a914639996f41da129b2b0b7cf1c232d..7385b9499513ce838b43fa1504b2327867b4720e 100644 --- a/src/Workspaces/Remote/ServiceHub/Services/CodeAnalysisService_DocumentHighlights.cs +++ b/src/Workspaces/Remote/ServiceHub/Services/CodeAnalysisService_DocumentHighlights.cs @@ -11,7 +11,7 @@ namespace Microsoft.CodeAnalysis.Remote // root level service for all Roslyn services internal partial class CodeAnalysisService : IRemoteDocumentHighlights { - public async Task GetDocumentHighlightsAsync( + public async Task> GetDocumentHighlightsAsync( DocumentId documentId, int position, DocumentId[] documentIdsToSearch) { var solution = await GetSolutionAsync().ConfigureAwait(false); @@ -22,7 +22,7 @@ internal partial class CodeAnalysisService : IRemoteDocumentHighlights var result = await service.GetDocumentHighlightsAsync( document, position, documentsToSearch, CancellationToken).ConfigureAwait(false); - return SerializableDocumentHighlights.Dehydrate(result); + return result.SelectAsArray(SerializableDocumentHighlights.Dehydrate); } } } \ No newline at end of file diff --git a/src/Workspaces/Remote/ServiceHub/Services/CodeAnalysisService_NavigateTo.cs b/src/Workspaces/Remote/ServiceHub/Services/CodeAnalysisService_NavigateTo.cs index 06ae344f6a9d0669386f739321d100d179e2ec6b..3aef635b2c13378c7aabbb9907ecdb3091c74730 100644 --- a/src/Workspaces/Remote/ServiceHub/Services/CodeAnalysisService_NavigateTo.cs +++ b/src/Workspaces/Remote/ServiceHub/Services/CodeAnalysisService_NavigateTo.cs @@ -9,7 +9,7 @@ namespace Microsoft.CodeAnalysis.Remote { internal partial class CodeAnalysisService : IRemoteNavigateToSearchService { - public async Task SearchDocumentAsync( + public async Task> SearchDocumentAsync( DocumentId documentId, string searchPattern) { using (UserOperationBooster.Boost()) @@ -24,7 +24,7 @@ internal partial class CodeAnalysisService : IRemoteNavigateToSearchService } } - public async Task SearchProjectAsync( + public async Task> SearchProjectAsync( ProjectId projectId, string searchPattern) { using (UserOperationBooster.Boost()) @@ -39,10 +39,10 @@ internal partial class CodeAnalysisService : IRemoteNavigateToSearchService } } - private SerializableNavigateToSearchResult[] Convert( + private ImmutableArray Convert( ImmutableArray result) { - return result.Select(SerializableNavigateToSearchResult.Dehydrate).ToArray(); + return result.SelectAsArray(SerializableNavigateToSearchResult.Dehydrate); } } } \ No newline at end of file diff --git a/src/Workspaces/Remote/ServiceHub/Services/CodeAnalysisService_SymbolFinder.cs b/src/Workspaces/Remote/ServiceHub/Services/CodeAnalysisService_SymbolFinder.cs index 77e7982ce9263ae9f58ac93d089ce52c6f1aa805..e4ec2c390589420f8ac991844ffd3e305c863d09 100644 --- a/src/Workspaces/Remote/ServiceHub/Services/CodeAnalysisService_SymbolFinder.cs +++ b/src/Workspaces/Remote/ServiceHub/Services/CodeAnalysisService_SymbolFinder.cs @@ -44,7 +44,7 @@ public async Task FindLiteralReferencesAsync(object value) value, solution, progressCallback, CancellationToken).ConfigureAwait(false); } - public async Task FindAllDeclarationsWithNormalQueryAsync( + public async Task> FindAllDeclarationsWithNormalQueryAsync( ProjectId projectId, string name, SearchKind searchKind, SymbolFilter criteria) { var solution = await GetSolutionAsync().ConfigureAwait(false); @@ -55,21 +55,21 @@ public async Task FindLiteralReferencesAsync(object value) var result = await DeclarationFinder.FindAllDeclarationsWithNormalQueryInCurrentProcessAsync( project, query, criteria, this.CancellationToken).ConfigureAwait(false); - return result.Select(SerializableSymbolAndProjectId.Dehydrate).ToArray(); + return result.SelectAsArray(SerializableSymbolAndProjectId.Dehydrate); } } - public async Task FindSolutionSourceDeclarationsWithNormalQueryAsync( + public async Task> FindSolutionSourceDeclarationsWithNormalQueryAsync( string name, bool ignoreCase, SymbolFilter criteria) { var solution = await GetSolutionAsync().ConfigureAwait(false); var result = await DeclarationFinder.FindSourceDeclarationsWithNormalQueryInCurrentProcessAsync( solution, name, ignoreCase, criteria, CancellationToken).ConfigureAwait(false); - return result.Select(SerializableSymbolAndProjectId.Dehydrate).ToArray(); + return result.SelectAsArray(SerializableSymbolAndProjectId.Dehydrate); } - public async Task FindProjectSourceDeclarationsWithNormalQueryAsync( + public async Task> FindProjectSourceDeclarationsWithNormalQueryAsync( ProjectId projectId, string name, bool ignoreCase, SymbolFilter criteria) { var solution = await GetSolutionAsync().ConfigureAwait(false); @@ -78,10 +78,10 @@ public async Task FindLiteralReferencesAsync(object value) var result = await DeclarationFinder.FindSourceDeclarationsWithNormalQueryInCurrentProcessAsync( project, name, ignoreCase, criteria, CancellationToken).ConfigureAwait(false); - return result.Select(SerializableSymbolAndProjectId.Dehydrate).ToArray(); + return result.SelectAsArray(SerializableSymbolAndProjectId.Dehydrate); } - public async Task FindProjectSourceDeclarationsWithPatternAsync( + public async Task> FindProjectSourceDeclarationsWithPatternAsync( ProjectId projectId, string pattern, SymbolFilter criteria) { var solution = await GetSolutionAsync().ConfigureAwait(false); @@ -90,7 +90,7 @@ public async Task FindLiteralReferencesAsync(object value) var result = await DeclarationFinder.FindSourceDeclarationsWithPatternInCurrentProcessAsync( project, pattern, criteria, CancellationToken).ConfigureAwait(false); - return result.Select(SerializableSymbolAndProjectId.Dehydrate).ToArray(); + return result.SelectAsArray(SerializableSymbolAndProjectId.Dehydrate); } private class FindLiteralReferencesProgressCallback : IStreamingFindLiteralReferencesProgress diff --git a/src/Workspaces/Remote/ServiceHub/Services/RemoteSymbolSearchUpdateEngine.cs b/src/Workspaces/Remote/ServiceHub/Services/RemoteSymbolSearchUpdateEngine.cs index 523710d6f02f1db6f46f8c0677d4b7f511de0a9a..29d28cbdb1da6ac9a4b76aa5db6fde2c23f272f9 100644 --- a/src/Workspaces/Remote/ServiceHub/Services/RemoteSymbolSearchUpdateEngine.cs +++ b/src/Workspaces/Remote/ServiceHub/Services/RemoteSymbolSearchUpdateEngine.cs @@ -1,8 +1,8 @@ // 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.Collections.Immutable; using System.IO; -using System.Linq; using System.Threading.Tasks; using Microsoft.CodeAnalysis.SymbolSearch; @@ -26,28 +26,28 @@ public Task UpdateContinuouslyAsync(string sourceName, string localSettingsDirec return _updateEngine.UpdateContinuouslyAsync(sourceName, localSettingsDirectory); } - public async Task FindPackagesWithTypeAsync(string source, string name, int arity) + public async Task> FindPackagesWithTypeAsync(string source, string name, int arity) { var results = await _updateEngine.FindPackagesWithTypeAsync( source, name, arity).ConfigureAwait(false); - var serializedResults = results.Select(SerializablePackageWithTypeResult.Dehydrate).ToArray(); - return serializedResults; + + return results; } - public async Task FindPackagesWithAssemblyAsync(string source, string assemblyName) + public async Task> FindPackagesWithAssemblyAsync(string source, string assemblyName) { var results = await _updateEngine.FindPackagesWithAssemblyAsync( source, assemblyName).ConfigureAwait(false); - var serializedResults = results.Select(SerializablePackageWithAssemblyResult.Dehydrate).ToArray(); - return serializedResults; + + return results; } - public async Task FindReferenceAssembliesWithTypeAsync(string name, int arity) + public async Task> FindReferenceAssembliesWithTypeAsync(string name, int arity) { var results = await _updateEngine.FindReferenceAssembliesWithTypeAsync( name, arity).ConfigureAwait(false); - var serializedResults = results.Select(SerializableReferenceAssemblyWithTypeResult.Dehydrate).ToArray(); - return serializedResults; + + return results; } private class LogService : ISymbolSearchLogService diff --git a/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.RoslynOnly.cs b/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.RoslynOnly.cs index 62fdc35d147c767cefb54d5b3da1634759f1010f..d2a6a45aed585ba9633bd000eb05ce3e7e8f9556 100644 --- a/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.RoslynOnly.cs +++ b/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.RoslynOnly.cs @@ -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.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 @@ -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 + { + protected override HighlightSpan ReadValue(JsonReader reader, JsonSerializer serializer) + { + Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject); + + var textSpan = ReadProperty(serializer, reader); + var kind = (HighlightSpanKind)ReadProperty(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 + { + protected override PackageWithTypeResult ReadValue(JsonReader reader, JsonSerializer serializer) + { + Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject); + + var packageName = ReadProperty(reader); + var typeName = ReadProperty(reader); + var version = ReadProperty(reader); + var rank = (int)ReadProperty(reader); + var containingNamespaceNames = ReadProperty>(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)); + serializer.Serialize(writer, source.ContainingNamespaceNames); + + writer.WriteEndObject(); + } + } + + private class PackageWithAssemblyResultJsonConverter : BaseJsonConverter + { + protected override PackageWithAssemblyResult ReadValue(JsonReader reader, JsonSerializer serializer) + { + Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject); + + var packageName = ReadProperty(reader); + var version = ReadProperty(reader); + var rank = (int)ReadProperty(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 + { + protected override ReferenceAssemblyWithTypeResult ReadValue(JsonReader reader, JsonSerializer serializer) + { + Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject); + + var assemblyName = ReadProperty(reader); + var typeName = ReadProperty(reader); + var containingNamespaceNames = ReadProperty>(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)); + serializer.Serialize(writer, source.ContainingNamespaceNames); + + writer.WriteEndObject(); + } + } + + private class TaggedTextJsonConverter : BaseJsonConverter + { + protected override TaggedText ReadValue(JsonReader reader, JsonSerializer serializer) + { + Contract.ThrowIfFalse(reader.TokenType == JsonToken.StartObject); + + var tag = ReadProperty(reader); + var text = ReadProperty(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 diff --git a/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.cs b/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.cs index 23a43d963cd56025620024c511e1beff31863408..e50f2731d78c3fa4dfdbbd6853812d3078abcbb9 100644 --- a/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.cs +++ b/src/Workspaces/Remote/ServiceHub/Shared/RoslynJsonConverter.cs @@ -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();