From 5cec8ff68d3bbb68ed37916b49d7dcbf3b636a61 Mon Sep 17 00:00:00 2001 From: filzrev <103790468+filzrev@users.noreply.github.com> Date: Fri, 27 Sep 2024 07:38:56 +0900 Subject: [PATCH] chore: add ManagedReference YAML roundtrip tests --- src/Docfx.Common/Json/JsonUtility.cs | 4 +++- .../JTokenConverter.cs | 20 +++++++++++++++++++ .../ReferenceViewModel.cs | 14 +++++++++++-- .../ManagedReference/Models/ItemViewModel.cs | 14 +++++++++++-- .../Models/SyntaxDetailViewModel.cs | 14 +++++++++++-- test/docfx.Tests/Api.verified.cs | 3 +++ 6 files changed, 62 insertions(+), 7 deletions(-) diff --git a/src/Docfx.Common/Json/JsonUtility.cs b/src/Docfx.Common/Json/JsonUtility.cs index 0f0b3c471e4..e20b0df1983 100644 --- a/src/Docfx.Common/Json/JsonUtility.cs +++ b/src/Docfx.Common/Json/JsonUtility.cs @@ -91,9 +91,11 @@ private static bool IsSupported() { // TODO: Return `true` for types that support serialize/deserializenon with System.Text.Json. case "Docfx.Build.Engine.XRefMap": - case "Docfx.DataContracts.ManagedReference.PageViewModel": return true; + case "Docfx.DataContracts.ManagedReference.PageViewModel": + return true; // TODO: Need to support ExtensionData + // Intermediate types for tests. it's expected to be removed later (And return true by default). case "Docfx.Plugins.MarkdownServiceProperties": return true; diff --git a/src/Docfx.DataContracts.Common/JTokenConverter.cs b/src/Docfx.DataContracts.Common/JTokenConverter.cs index d8d170127e8..9510b2a8cb0 100644 --- a/src/Docfx.DataContracts.Common/JTokenConverter.cs +++ b/src/Docfx.DataContracts.Common/JTokenConverter.cs @@ -1,6 +1,9 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Reflection; +using System.Text.Json; +using Docfx.Common; using Newtonsoft.Json.Linq; namespace Docfx.DataContracts.Common; @@ -18,6 +21,23 @@ public static T Convert(object obj) { return jToken.ToObject(); } + + + var type = typeof(T); + + // Try to convert `List` to T (`ObjectToInferredTypesConverter`) + // Currently `ObjectToInferredTypesConverter` convert item to List. So it need to convert type. + if (obj is List list + && type.GetTypeInfo().IsGenericType + && type.GetGenericTypeDefinition() == typeof(List<>)) + { + // TODO: performance optimization. + var json = JsonUtility.Serialize(list); + var result = JsonUtility.Deserialize(new StringReader(json)); + return result; + } + + throw new InvalidCastException(); } } diff --git a/src/Docfx.DataContracts.Common/ReferenceViewModel.cs b/src/Docfx.DataContracts.Common/ReferenceViewModel.cs index 71e1f36b81a..7810640f850 100644 --- a/src/Docfx.DataContracts.Common/ReferenceViewModel.cs +++ b/src/Docfx.DataContracts.Common/ReferenceViewModel.cs @@ -86,10 +86,14 @@ public class ReferenceViewModel [YamlIgnore] [Newtonsoft.Json.JsonExtensionData] [System.Text.Json.Serialization.JsonExtensionData] + [System.Text.Json.Serialization.JsonInclude] [UniqueIdentityReferenceIgnore] [MarkdownContentIgnore] - public CompositeDictionary AdditionalJson => - CompositeDictionary + public CompositeDictionary AdditionalJson + { + get + { + return CompositeDictionary .CreateBuilder() .Add(Constants.ExtensionMemberPrefix.Name, NameInDevLangs, JTokenConverter.Convert) .Add(Constants.ExtensionMemberPrefix.NameWithType, NameWithTypeInDevLangs, JTokenConverter.Convert) @@ -97,6 +101,12 @@ public class ReferenceViewModel .Add(Constants.ExtensionMemberPrefix.Spec, Specs, JTokenConverter.Convert>) .Add(string.Empty, Additional) .Create(); + } + private init + { + // init or getter is required for deserialize data with System.Text.Json. + } + } public ReferenceViewModel Clone() { diff --git a/src/Docfx.Dotnet/ManagedReference/Models/ItemViewModel.cs b/src/Docfx.Dotnet/ManagedReference/Models/ItemViewModel.cs index 80252839716..d86d942c69c 100644 --- a/src/Docfx.Dotnet/ManagedReference/Models/ItemViewModel.cs +++ b/src/Docfx.Dotnet/ManagedReference/Models/ItemViewModel.cs @@ -378,14 +378,24 @@ public string FullNameForVB [YamlIgnore] [Newtonsoft.Json.JsonExtensionData] [System.Text.Json.Serialization.JsonExtensionData] + [System.Text.Json.Serialization.JsonInclude] [UniqueIdentityReferenceIgnore] [MarkdownContentIgnore] - public IDictionary ExtensionData => - CompositeDictionary + public IDictionary ExtensionData + { + get + { + return CompositeDictionary .CreateBuilder() .Add(Constants.ExtensionMemberPrefix.Name, Names, JTokenConverter.Convert) .Add(Constants.ExtensionMemberPrefix.NameWithType, NamesWithType, JTokenConverter.Convert) .Add(Constants.ExtensionMemberPrefix.FullName, FullNames, JTokenConverter.Convert) .Add(string.Empty, Metadata) .Create(); + } + private init + { + // init or getter is required for deserialize data with System.Text.Json. + } + } } diff --git a/src/Docfx.Dotnet/ManagedReference/Models/SyntaxDetailViewModel.cs b/src/Docfx.Dotnet/ManagedReference/Models/SyntaxDetailViewModel.cs index 330470f034b..8aa49b39a22 100644 --- a/src/Docfx.Dotnet/ManagedReference/Models/SyntaxDetailViewModel.cs +++ b/src/Docfx.Dotnet/ManagedReference/Models/SyntaxDetailViewModel.cs @@ -89,11 +89,21 @@ public string ContentForVB [YamlIgnore] [Newtonsoft.Json.JsonExtensionData] [System.Text.Json.Serialization.JsonExtensionData] + [System.Text.Json.Serialization.JsonInclude] [UniqueIdentityReferenceIgnore] [MarkdownContentIgnore] - public IDictionary ExtensionData => - CompositeDictionary + public IDictionary ExtensionData + { + get + { + return CompositeDictionary .CreateBuilder() .Add(Constants.ExtensionMemberPrefix.Content, Contents, JTokenConverter.Convert) .Create(); + } + private init + { + // init or getter is required for deserialize data with System.Text.Json. + } + } } diff --git a/test/docfx.Tests/Api.verified.cs b/test/docfx.Tests/Api.verified.cs index 126141a7185..ce9d5f0f674 100644 --- a/test/docfx.Tests/Api.verified.cs +++ b/test/docfx.Tests/Api.verified.cs @@ -2503,6 +2503,7 @@ public ReferenceViewModel() { } [Docfx.DataContracts.Common.UniqueIdentityReferenceIgnore] [Newtonsoft.Json.JsonExtensionData] [System.Text.Json.Serialization.JsonExtensionData] + [System.Text.Json.Serialization.JsonInclude] [YamlDotNet.Serialization.YamlIgnore] public Docfx.Common.CompositeDictionary AdditionalJson { get; } [Newtonsoft.Json.JsonProperty("commentId")] @@ -2877,6 +2878,7 @@ public ItemViewModel() { } [Docfx.DataContracts.Common.UniqueIdentityReferenceIgnore] [Newtonsoft.Json.JsonExtensionData] [System.Text.Json.Serialization.JsonExtensionData] + [System.Text.Json.Serialization.JsonInclude] [YamlDotNet.Serialization.YamlIgnore] public System.Collections.Generic.IDictionary ExtensionData { get; } [Docfx.Common.EntityMergers.MergeOption(Docfx.Common.EntityMergers.MergeOption.Ignore)] @@ -3152,6 +3154,7 @@ public SyntaxDetailViewModel() { } [Docfx.DataContracts.Common.UniqueIdentityReferenceIgnore] [Newtonsoft.Json.JsonExtensionData] [System.Text.Json.Serialization.JsonExtensionData] + [System.Text.Json.Serialization.JsonInclude] [YamlDotNet.Serialization.YamlIgnore] public System.Collections.Generic.IDictionary ExtensionData { get; } [Newtonsoft.Json.JsonProperty("parameters")]