From 55d6362325fc63588afcf512627e79564c9c986c Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Mon, 20 Mar 2017 20:16:06 -0700 Subject: [PATCH] [Fixes #1094] Use custom JsonConverters for serializing/deserializing TagHelperResolutionResult --- .../Microsoft.CodeAnalysis.Remote.Razor.csproj | 4 ++++ .../RazorLanguageService.cs | 3 +++ .../DefaultTagHelperResolver.cs | 18 +++++++++++++++++- .../Properties/Resources.Designer.cs | 14 -------------- .../RazorDiagnosticJsonConverter.cs | 3 +-- .../Resources.resx | 3 --- 6 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/Microsoft.CodeAnalysis.Remote.Razor/Microsoft.CodeAnalysis.Remote.Razor.csproj b/src/Microsoft.CodeAnalysis.Remote.Razor/Microsoft.CodeAnalysis.Remote.Razor.csproj index afa059389a..7a07b15987 100644 --- a/src/Microsoft.CodeAnalysis.Remote.Razor/Microsoft.CodeAnalysis.Remote.Razor.csproj +++ b/src/Microsoft.CodeAnalysis.Remote.Razor/Microsoft.CodeAnalysis.Remote.Razor.csproj @@ -10,9 +10,13 @@ Microsoft.CodeAnalysis.Remote.Razor $(PackageTargetFallback);portable-net45+win8+wp8+wpa81; + + + + diff --git a/src/Microsoft.CodeAnalysis.Remote.Razor/RazorLanguageService.cs b/src/Microsoft.CodeAnalysis.Remote.Razor/RazorLanguageService.cs index fd913b657e..f1d303afb0 100644 --- a/src/Microsoft.CodeAnalysis.Remote.Razor/RazorLanguageService.cs +++ b/src/Microsoft.CodeAnalysis.Remote.Razor/RazorLanguageService.cs @@ -10,6 +10,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.Evolution; using Microsoft.CodeAnalysis.Razor; +using Microsoft.VisualStudio.LanguageServices.Razor; namespace Microsoft.CodeAnalysis.Remote.Razor { @@ -19,11 +20,13 @@ namespace Microsoft.CodeAnalysis.Remote.Razor public RazorLanguageService(Stream stream, IServiceProvider serviceProvider) : base(stream, serviceProvider) { + Rpc.JsonSerializer.Converters.Add(new RazorDiagnosticJsonConverter()); } public RazorLanguageService(IServiceProvider serviceProvider, Stream stream) : base(serviceProvider, stream) { + Rpc.JsonSerializer.Converters.Add(new RazorDiagnosticJsonConverter()); } public async Task GetTagHelpersAsync(Guid projectIdBytes, string projectDebugName, IEnumerable assemblyNameFilters, CancellationToken cancellationToken = default(CancellationToken)) diff --git a/src/Microsoft.VisualStudio.LanguageServices.Razor/DefaultTagHelperResolver.cs b/src/Microsoft.VisualStudio.LanguageServices.Razor/DefaultTagHelperResolver.cs index 59eeb40485..4d377f58b4 100644 --- a/src/Microsoft.VisualStudio.LanguageServices.Razor/DefaultTagHelperResolver.cs +++ b/src/Microsoft.VisualStudio.LanguageServices.Razor/DefaultTagHelperResolver.cs @@ -12,6 +12,8 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Razor; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; namespace Microsoft.VisualStudio.LanguageServices.Razor { @@ -41,10 +43,12 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor { if (session != null) { - result = await session.InvokeAsync( + var jsonObject = await session.InvokeAsync( "GetTagHelpersAsync", new object[] { project.Id.Id, "Foo", assemblyNameFilters, }).ConfigureAwait(false); + result = GetTagHelperResolutionResult(jsonObject); + if (result != null) { // Per https://github.com/dotnet/roslyn/issues/12770 - there's currently no support for documentation in the OOP host @@ -83,6 +87,18 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor } } + private TagHelperResolutionResult GetTagHelperResolutionResult(JObject jsonObject) + { + var serializer = new JsonSerializer(); + serializer.Converters.Add(TagHelperDescriptorJsonConverter.Instance); + serializer.Converters.Add(RazorDiagnosticJsonConverter.Instance); + + using (var reader = jsonObject.CreateReader()) + { + return serializer.Deserialize(reader); + } + } + private IReadOnlyList GetDocumentedTagHelpers(Compilation compilation, IReadOnlyList tagHelpers) { var documentedTagHelpers = new List(); diff --git a/src/Microsoft.VisualStudio.LanguageServices.Razor/Properties/Resources.Designer.cs b/src/Microsoft.VisualStudio.LanguageServices.Razor/Properties/Resources.Designer.cs index 562ff5a7ab..41d599a8d9 100644 --- a/src/Microsoft.VisualStudio.LanguageServices.Razor/Properties/Resources.Designer.cs +++ b/src/Microsoft.VisualStudio.LanguageServices.Razor/Properties/Resources.Designer.cs @@ -10,20 +10,6 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor private static readonly ResourceManager _resourceManager = new ResourceManager("Microsoft.VisualStudio.LanguageServices.Razor.Resources", typeof(Resources).GetTypeInfo().Assembly); - /// - /// Deserialization of {0} type '{1}' is not supported. - /// - internal static string RazorDiagnosticJsonConverter_UnsupportedRazorDiagnosticType - { - get => GetString("RazorDiagnosticJsonConverter_UnsupportedRazorDiagnosticType"); - } - - /// - /// Deserialization of {0} type '{1}' is not supported. - /// - internal static string FormatRazorDiagnosticJsonConverter_UnsupportedRazorDiagnosticType(object p0, object p1) - => string.Format(CultureInfo.CurrentCulture, GetString("RazorDiagnosticJsonConverter_UnsupportedRazorDiagnosticType"), p0, p1); - /// /// An unexpected exception occurred when invoking '{0}.{1}' on the Razor language service. /// diff --git a/src/Microsoft.VisualStudio.LanguageServices.Razor/RazorDiagnosticJsonConverter.cs b/src/Microsoft.VisualStudio.LanguageServices.Razor/RazorDiagnosticJsonConverter.cs index 204a84ab56..976c111f73 100644 --- a/src/Microsoft.VisualStudio.LanguageServices.Razor/RazorDiagnosticJsonConverter.cs +++ b/src/Microsoft.VisualStudio.LanguageServices.Razor/RazorDiagnosticJsonConverter.cs @@ -54,8 +54,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Razor return RazorDiagnostic.Create(error); } - throw new NotSupportedException( - Resources.FormatRazorDiagnosticJsonConverter_UnsupportedRazorDiagnosticType(typeof(RazorDiagnostic).Name, typeName)); + return null; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) diff --git a/src/Microsoft.VisualStudio.LanguageServices.Razor/Resources.resx b/src/Microsoft.VisualStudio.LanguageServices.Razor/Resources.resx index b4189aac42..6783beb144 100644 --- a/src/Microsoft.VisualStudio.LanguageServices.Razor/Resources.resx +++ b/src/Microsoft.VisualStudio.LanguageServices.Razor/Resources.resx @@ -117,9 +117,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Deserialization of {0} type '{1}' is not supported. - An unexpected exception occurred when invoking '{0}.{1}' on the Razor language service.