From 36c2448bd3539e067bec1e7b97c9cdff389b7a1a Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Tue, 31 Mar 2020 11:07:08 -0700 Subject: [PATCH] Serialize project state from VS to project.razor.json (dotnet/aspnetcore-tooling#1711) Serialize project state to project.razor.json\n\nCommit migrated from https://github.com/dotnet/aspnetcore-tooling/commit/fef50ba62387cb87d34970b4c88290c233361927 --- .../src/DiscoverCommand.cs | 1 + .../src/GenerateCommand.cs | 2 +- .../Microsoft.AspNetCore.Razor.Tools.csproj | 2 +- .../Properties/AssemblyInfo.cs | 1 + .../TagHelperDescriptorJsonConverter.cs | 442 ++++++++++++++++++ 5 files changed, 446 insertions(+), 2 deletions(-) create mode 100644 src/Shared/RazorShared/TagHelperDescriptorJsonConverter.cs diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Tools/src/DiscoverCommand.cs b/src/Razor/Microsoft.AspNetCore.Razor.Tools/src/DiscoverCommand.cs index 91ac10fea3..1c96b83e85 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Tools/src/DiscoverCommand.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Tools/src/DiscoverCommand.cs @@ -11,6 +11,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.Language; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Razor; +using Microsoft.CodeAnalysis.Razor.Serialization; using Microsoft.Extensions.CommandLineUtils; using Microsoft.VisualStudio.LanguageServices.Razor.Serialization; using Newtonsoft.Json; diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Tools/src/GenerateCommand.cs b/src/Razor/Microsoft.AspNetCore.Razor.Tools/src/GenerateCommand.cs index 7ebc74cb73..0406225fc8 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Tools/src/GenerateCommand.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Tools/src/GenerateCommand.cs @@ -7,9 +7,9 @@ using System.Diagnostics; using System.IO; using System.Threading.Tasks; using Microsoft.AspNetCore.Razor.Language; -using Microsoft.AspNetCore.Razor.Language.Components; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Razor; +using Microsoft.CodeAnalysis.Razor.Serialization; using Microsoft.Extensions.CommandLineUtils; using Microsoft.VisualStudio.LanguageServices.Razor.Serialization; using Newtonsoft.Json; diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Tools/src/Microsoft.AspNetCore.Razor.Tools.csproj b/src/Razor/Microsoft.AspNetCore.Razor.Tools/src/Microsoft.AspNetCore.Razor.Tools.csproj index a7a3a4d347..ffda95c107 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Tools/src/Microsoft.AspNetCore.Razor.Tools.csproj +++ b/src/Razor/Microsoft.AspNetCore.Razor.Tools/src/Microsoft.AspNetCore.Razor.Tools.csproj @@ -23,7 +23,7 @@ - + Shared\TagHelperDescriptorJsonConverter.cs diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common/Properties/AssemblyInfo.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common/Properties/AssemblyInfo.cs index 098d7b5b27..145a421a52 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common/Properties/AssemblyInfo.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common/Properties/AssemblyInfo.cs @@ -12,4 +12,5 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Microsoft.CodeAnalysis.Razor.Workspaces.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.VisualStudio.Editor.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("Microsoft.VisualStudio.LanguageServices.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] +[assembly: InternalsVisibleTo("Microsoft.VisualStudio.LanguageServerClient.Razor.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] diff --git a/src/Shared/RazorShared/TagHelperDescriptorJsonConverter.cs b/src/Shared/RazorShared/TagHelperDescriptorJsonConverter.cs new file mode 100644 index 0000000000..3e610c08c7 --- /dev/null +++ b/src/Shared/RazorShared/TagHelperDescriptorJsonConverter.cs @@ -0,0 +1,442 @@ +// Copyright (c) .NET Foundation. 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.Generic; +using Microsoft.AspNetCore.Razor.Language; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Microsoft.CodeAnalysis.Razor.Serialization +{ + internal class TagHelperDescriptorJsonConverter : JsonConverter + { + public static readonly TagHelperDescriptorJsonConverter Instance = new TagHelperDescriptorJsonConverter(); + + public override bool CanConvert(Type objectType) + { + return typeof(TagHelperDescriptor).IsAssignableFrom(objectType); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType != JsonToken.StartObject) + { + return null; + } + + var descriptor = JObject.Load(reader); + var descriptorKind = descriptor[nameof(TagHelperDescriptor.Kind)].Value(); + var typeName = descriptor[nameof(TagHelperDescriptor.Name)].Value(); + var assemblyName = descriptor[nameof(TagHelperDescriptor.AssemblyName)].Value(); + var tagMatchingRules = descriptor[nameof(TagHelperDescriptor.TagMatchingRules)].Value(); + var boundAttributes = descriptor[nameof(TagHelperDescriptor.BoundAttributes)].Value(); + var childTags = descriptor[nameof(TagHelperDescriptor.AllowedChildTags)].Value(); + var documentation = descriptor[nameof(TagHelperDescriptor.Documentation)].Value(); + var tagOutputHint = descriptor[nameof(TagHelperDescriptor.TagOutputHint)].Value(); + var caseSensitive = descriptor[nameof(TagHelperDescriptor.CaseSensitive)].Value(); + var diagnostics = descriptor[nameof(TagHelperDescriptor.Diagnostics)].Value(); + var metadata = descriptor[nameof(TagHelperDescriptor.Metadata)].Value(); + + var builder = TagHelperDescriptorBuilder.Create(descriptorKind, typeName, assemblyName); + + builder.Documentation = documentation; + builder.TagOutputHint = tagOutputHint; + builder.CaseSensitive = caseSensitive; + + foreach (var tagMatchingRule in tagMatchingRules) + { + var rule = tagMatchingRule.Value(); + builder.TagMatchingRule(b => ReadTagMatchingRule(b, rule, serializer)); + } + + foreach (var boundAttribute in boundAttributes) + { + var attribute = boundAttribute.Value(); + builder.BindAttribute(b => ReadBoundAttribute(b, attribute, serializer)); + } + + foreach (var childTag in childTags) + { + var tag = childTag.Value(); + builder.AllowChildTag(childTagBuilder => ReadAllowedChildTag(childTagBuilder, tag, serializer)); + } + + foreach (var diagnostic in diagnostics) + { + var diagnosticReader = diagnostic.CreateReader(); + var diagnosticObject = serializer.Deserialize(diagnosticReader); + builder.Diagnostics.Add(diagnosticObject); + } + + var metadataReader = metadata.CreateReader(); + var metadataValue = serializer.Deserialize>(metadataReader); + foreach (var item in metadataValue) + { + builder.Metadata[item.Key] = item.Value; + } + + return builder.Build(); + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + var tagHelper = (TagHelperDescriptor)value; + + writer.WriteStartObject(); + + writer.WritePropertyName(nameof(TagHelperDescriptor.Kind)); + writer.WriteValue(tagHelper.Kind); + + writer.WritePropertyName(nameof(TagHelperDescriptor.Name)); + writer.WriteValue(tagHelper.Name); + + writer.WritePropertyName(nameof(TagHelperDescriptor.AssemblyName)); + writer.WriteValue(tagHelper.AssemblyName); + + writer.WritePropertyName(nameof(TagHelperDescriptor.Documentation)); + writer.WriteValue(tagHelper.Documentation); + + writer.WritePropertyName(nameof(TagHelperDescriptor.TagOutputHint)); + writer.WriteValue(tagHelper.TagOutputHint); + + writer.WritePropertyName(nameof(TagHelperDescriptor.CaseSensitive)); + writer.WriteValue(tagHelper.CaseSensitive); + + writer.WritePropertyName(nameof(TagHelperDescriptor.TagMatchingRules)); + writer.WriteStartArray(); + foreach (var ruleDescriptor in tagHelper.TagMatchingRules) + { + WriteTagMatchingRule(writer, ruleDescriptor, serializer); + } + writer.WriteEndArray(); + + writer.WritePropertyName(nameof(TagHelperDescriptor.BoundAttributes)); + writer.WriteStartArray(); + foreach (var boundAttribute in tagHelper.BoundAttributes) + { + WriteBoundAttribute(writer, boundAttribute, serializer); + } + writer.WriteEndArray(); + + writer.WritePropertyName(nameof(TagHelperDescriptor.AllowedChildTags)); + writer.WriteStartArray(); + foreach (var allowedChildTag in tagHelper.AllowedChildTags) + { + WriteAllowedChildTags(writer, allowedChildTag, serializer); + } + writer.WriteEndArray(); + + writer.WritePropertyName(nameof(TagHelperDescriptor.Diagnostics)); + serializer.Serialize(writer, tagHelper.Diagnostics); + + writer.WritePropertyName(nameof(TagHelperDescriptor.Metadata)); + WriteMetadata(writer, tagHelper.Metadata); + + writer.WriteEndObject(); + } + + private static void WriteAllowedChildTags(JsonWriter writer, AllowedChildTagDescriptor allowedChildTag, JsonSerializer serializer) + { + writer.WriteStartObject(); + + writer.WritePropertyName(nameof(AllowedChildTagDescriptor.Name)); + writer.WriteValue(allowedChildTag.Name); + + writer.WritePropertyName(nameof(AllowedChildTagDescriptor.DisplayName)); + writer.WriteValue(allowedChildTag.DisplayName); + + writer.WritePropertyName(nameof(AllowedChildTagDescriptor.Diagnostics)); + serializer.Serialize(writer, allowedChildTag.Diagnostics); + + writer.WriteEndObject(); + } + + private static void WriteBoundAttribute(JsonWriter writer, BoundAttributeDescriptor boundAttribute, JsonSerializer serializer) + { + writer.WriteStartObject(); + + writer.WritePropertyName(nameof(BoundAttributeDescriptor.Kind)); + writer.WriteValue(boundAttribute.Kind); + + writer.WritePropertyName(nameof(BoundAttributeDescriptor.Name)); + writer.WriteValue(boundAttribute.Name); + + writer.WritePropertyName(nameof(BoundAttributeDescriptor.TypeName)); + writer.WriteValue(boundAttribute.TypeName); + + writer.WritePropertyName(nameof(BoundAttributeDescriptor.IsEnum)); + writer.WriteValue(boundAttribute.IsEnum); + + writer.WritePropertyName(nameof(BoundAttributeDescriptor.IndexerNamePrefix)); + writer.WriteValue(boundAttribute.IndexerNamePrefix); + + writer.WritePropertyName(nameof(BoundAttributeDescriptor.IndexerTypeName)); + writer.WriteValue(boundAttribute.IndexerTypeName); + + writer.WritePropertyName(nameof(BoundAttributeDescriptor.Documentation)); + writer.WriteValue(boundAttribute.Documentation); + + writer.WritePropertyName(nameof(BoundAttributeDescriptor.Diagnostics)); + serializer.Serialize(writer, boundAttribute.Diagnostics); + + writer.WritePropertyName(nameof(BoundAttributeDescriptor.Metadata)); + WriteMetadata(writer, boundAttribute.Metadata); + + writer.WritePropertyName(nameof(BoundAttributeDescriptor.BoundAttributeParameters)); + writer.WriteStartArray(); + foreach (var boundAttributeParameter in boundAttribute.BoundAttributeParameters) + { + WriteBoundAttributeParameter(writer, boundAttributeParameter, serializer); + } + writer.WriteEndArray(); + + writer.WriteEndObject(); + } + + private static void WriteBoundAttributeParameter(JsonWriter writer, BoundAttributeParameterDescriptor boundAttributeParameter, JsonSerializer serializer) + { + writer.WriteStartObject(); + + writer.WritePropertyName(nameof(BoundAttributeParameterDescriptor.Kind)); + writer.WriteValue(boundAttributeParameter.Kind); + + writer.WritePropertyName(nameof(BoundAttributeParameterDescriptor.Name)); + writer.WriteValue(boundAttributeParameter.Name); + + writer.WritePropertyName(nameof(BoundAttributeParameterDescriptor.TypeName)); + writer.WriteValue(boundAttributeParameter.TypeName); + + writer.WritePropertyName(nameof(BoundAttributeParameterDescriptor.IsEnum)); + writer.WriteValue(boundAttributeParameter.IsEnum); + + writer.WritePropertyName(nameof(BoundAttributeParameterDescriptor.Documentation)); + writer.WriteValue(boundAttributeParameter.Documentation); + + writer.WritePropertyName(nameof(BoundAttributeParameterDescriptor.Diagnostics)); + serializer.Serialize(writer, boundAttributeParameter.Diagnostics); + + writer.WritePropertyName(nameof(BoundAttributeParameterDescriptor.Metadata)); + WriteMetadata(writer, boundAttributeParameter.Metadata); + + writer.WriteEndObject(); + } + + private static void WriteMetadata(JsonWriter writer, IReadOnlyDictionary metadata) + { + writer.WriteStartObject(); + foreach (var kvp in metadata) + { + writer.WritePropertyName(kvp.Key); + writer.WriteValue(kvp.Value); + } + writer.WriteEndObject(); + } + + private static void WriteTagMatchingRule(JsonWriter writer, TagMatchingRuleDescriptor ruleDescriptor, JsonSerializer serializer) + { + writer.WriteStartObject(); + + writer.WritePropertyName(nameof(TagMatchingRuleDescriptor.TagName)); + writer.WriteValue(ruleDescriptor.TagName); + + writer.WritePropertyName(nameof(TagMatchingRuleDescriptor.ParentTag)); + writer.WriteValue(ruleDescriptor.ParentTag); + + writer.WritePropertyName(nameof(TagMatchingRuleDescriptor.TagStructure)); + writer.WriteValue(ruleDescriptor.TagStructure); + + writer.WritePropertyName(nameof(TagMatchingRuleDescriptor.Attributes)); + writer.WriteStartArray(); + foreach (var requiredAttribute in ruleDescriptor.Attributes) + { + WriteRequiredAttribute(writer, requiredAttribute, serializer); + } + writer.WriteEndArray(); + + writer.WritePropertyName(nameof(TagMatchingRuleDescriptor.Diagnostics)); + serializer.Serialize(writer, ruleDescriptor.Diagnostics); + + writer.WriteEndObject(); + } + + private static void WriteRequiredAttribute(JsonWriter writer, RequiredAttributeDescriptor requiredAttribute, JsonSerializer serializer) + { + writer.WriteStartObject(); + + writer.WritePropertyName(nameof(RequiredAttributeDescriptor.Name)); + writer.WriteValue(requiredAttribute.Name); + + writer.WritePropertyName(nameof(RequiredAttributeDescriptor.NameComparison)); + writer.WriteValue(requiredAttribute.NameComparison); + + writer.WritePropertyName(nameof(RequiredAttributeDescriptor.Value)); + writer.WriteValue(requiredAttribute.Value); + + writer.WritePropertyName(nameof(RequiredAttributeDescriptor.ValueComparison)); + writer.WriteValue(requiredAttribute.ValueComparison); + + writer.WritePropertyName(nameof(RequiredAttributeDescriptor.Diagnostics)); + serializer.Serialize(writer, requiredAttribute.Diagnostics); + + writer.WritePropertyName(nameof(RequiredAttributeDescriptor.Metadata)); + WriteMetadata(writer, requiredAttribute.Metadata); + + writer.WriteEndObject(); + } + + private static void ReadTagMatchingRule(TagMatchingRuleDescriptorBuilder builder, JObject rule, JsonSerializer serializer) + { + var tagName = rule[nameof(TagMatchingRuleDescriptor.TagName)].Value(); + var attributes = rule[nameof(TagMatchingRuleDescriptor.Attributes)].Value(); + var parentTag = rule[nameof(TagMatchingRuleDescriptor.ParentTag)].Value(); + var tagStructure = rule[nameof(TagMatchingRuleDescriptor.TagStructure)].Value(); + var diagnostics = rule[nameof(TagMatchingRuleDescriptor.Diagnostics)].Value(); + + builder.TagName = tagName; + builder.ParentTag = parentTag; + builder.TagStructure = (TagStructure)tagStructure; + + foreach (var attribute in attributes) + { + var attibuteValue = attribute.Value(); + builder.Attribute(b => ReadRequiredAttribute(b, attibuteValue, serializer)); + } + + foreach (var diagnostic in diagnostics) + { + var diagnosticReader = diagnostic.CreateReader(); + var diagnosticObject = serializer.Deserialize(diagnosticReader); + builder.Diagnostics.Add(diagnosticObject); + } + } + + private static void ReadRequiredAttribute(RequiredAttributeDescriptorBuilder builder, JObject attribute, JsonSerializer serializer) + { + var name = attribute[nameof(RequiredAttributeDescriptor.Name)].Value(); + var nameComparison = attribute[nameof(RequiredAttributeDescriptor.NameComparison)].Value(); + var value = attribute[nameof(RequiredAttributeDescriptor.Value)].Value(); + var valueComparison = attribute[nameof(RequiredAttributeDescriptor.ValueComparison)].Value(); + var diagnostics = attribute[nameof(RequiredAttributeDescriptor.Diagnostics)].Value(); + var metadata = attribute[nameof(RequiredAttributeDescriptor.Metadata)].Value(); + + builder.Name = name; + builder.NameComparisonMode = (RequiredAttributeDescriptor.NameComparisonMode)nameComparison; + builder.Value = value; + builder.ValueComparisonMode = (RequiredAttributeDescriptor.ValueComparisonMode)valueComparison; + + foreach (var diagnostic in diagnostics) + { + var diagnosticReader = diagnostic.CreateReader(); + var diagnosticObject = serializer.Deserialize(diagnosticReader); + builder.Diagnostics.Add(diagnosticObject); + } + + var metadataReader = metadata.CreateReader(); + var metadataValue = serializer.Deserialize>(metadataReader); + foreach (var item in metadataValue) + { + builder.Metadata[item.Key] = item.Value; + } + } + + private static void ReadAllowedChildTag(AllowedChildTagDescriptorBuilder builder, JObject childTag, JsonSerializer serializer) + { + var name = childTag[nameof(AllowedChildTagDescriptor.Name)].Value(); + var displayName = childTag[nameof(AllowedChildTagDescriptor.DisplayName)].Value(); + var diagnostics = childTag[nameof(AllowedChildTagDescriptor.Diagnostics)].Value(); + + builder.Name = name; + builder.DisplayName = displayName; + + foreach (var diagnostic in diagnostics) + { + var diagnosticReader = diagnostic.CreateReader(); + var diagnosticObject = serializer.Deserialize(diagnosticReader); + builder.Diagnostics.Add(diagnosticObject); + } + } + + private static void ReadBoundAttribute(BoundAttributeDescriptorBuilder builder, JObject attribute, JsonSerializer serializer) + { + var descriptorKind = attribute[nameof(BoundAttributeDescriptor.Kind)].Value(); + var name = attribute[nameof(BoundAttributeDescriptor.Name)].Value(); + var typeName = attribute[nameof(BoundAttributeDescriptor.TypeName)].Value(); + var isEnum = attribute[nameof(BoundAttributeDescriptor.IsEnum)].Value(); + var indexerNamePrefix = attribute[nameof(BoundAttributeDescriptor.IndexerNamePrefix)].Value(); + var indexerTypeName = attribute[nameof(BoundAttributeDescriptor.IndexerTypeName)].Value(); + var documentation = attribute[nameof(BoundAttributeDescriptor.Documentation)].Value(); + var diagnostics = attribute[nameof(BoundAttributeDescriptor.Diagnostics)].Value(); + var metadata = attribute[nameof(BoundAttributeDescriptor.Metadata)].Value(); + var boundAttributeParameters = attribute[nameof(BoundAttributeDescriptor.BoundAttributeParameters)].Value(); + + builder.Name = name; + builder.TypeName = typeName; + builder.Documentation = documentation; + + if (indexerNamePrefix != null) + { + builder.AsDictionary(indexerNamePrefix, indexerTypeName); + } + + if (isEnum) + { + builder.IsEnum = true; + } + + foreach (var diagnostic in diagnostics) + { + var diagnosticReader = diagnostic.CreateReader(); + var diagnosticObject = serializer.Deserialize(diagnosticReader); + builder.Diagnostics.Add(diagnosticObject); + } + + var metadataReader = metadata.CreateReader(); + var metadataValue = serializer.Deserialize>(metadataReader); + foreach (var item in metadataValue) + { + builder.Metadata[item.Key] = item.Value; + } + + foreach (var boundAttributeParameter in boundAttributeParameters) + { + var parameter = boundAttributeParameter.Value(); + builder.BindAttributeParameter(b => ReadBoundAttributeParameter(b, parameter, serializer)); + } + } + + private static void ReadBoundAttributeParameter(BoundAttributeParameterDescriptorBuilder builder, JObject parameter, JsonSerializer serializer) + { + var descriptorKind = parameter[nameof(BoundAttributeParameterDescriptor.Kind)].Value(); + var name = parameter[nameof(BoundAttributeParameterDescriptor.Name)].Value(); + var typeName = parameter[nameof(BoundAttributeParameterDescriptor.TypeName)].Value(); + var isEnum = parameter[nameof(BoundAttributeParameterDescriptor.IsEnum)].Value(); + var documentation = parameter[nameof(BoundAttributeParameterDescriptor.Documentation)].Value(); + var diagnostics = parameter[nameof(BoundAttributeParameterDescriptor.Diagnostics)].Value(); + var metadata = parameter[nameof(BoundAttributeParameterDescriptor.Metadata)].Value(); + + builder.Name = name; + builder.TypeName = typeName; + builder.Documentation = documentation; + + if (isEnum) + { + builder.IsEnum = true; + } + + foreach (var diagnostic in diagnostics) + { + var diagnosticReader = diagnostic.CreateReader(); + var diagnosticObject = serializer.Deserialize(diagnosticReader); + builder.Diagnostics.Add(diagnosticObject); + } + + var metadataReader = metadata.CreateReader(); + var metadataValue = serializer.Deserialize>(metadataReader); + foreach (var item in metadataValue) + { + builder.Metadata[item.Key] = item.Value; + } + } + } +}