+ ///
+ /// with unintended identation
// when there is no preceeding text node.
diff --git a/src/Docfx.YamlSerialization/Helpers/ReflectionExtensions.cs b/src/Docfx.YamlSerialization/Helpers/ReflectionExtensions.cs
index a60a1924d29..b5b3ff5d366 100644
--- a/src/Docfx.YamlSerialization/Helpers/ReflectionExtensions.cs
+++ b/src/Docfx.YamlSerialization/Helpers/ReflectionExtensions.cs
@@ -11,12 +11,18 @@ internal static class ReflectionExtensions
/// Determines whether the specified type has a default constructor.
///
/// The type.
+ /// Allow private constructor.
///
/// true if the type has a default constructor; otherwise, false .
///
- public static bool HasDefaultConstructor(this Type type)
+ public static bool HasDefaultConstructor(this Type type, bool allowPrivateConstructors)
{
- return type.IsValueType || type.GetConstructor(BindingFlags.Public | BindingFlags.Instance, null, Type.EmptyTypes, null) != null;
+ var bindingFlags = BindingFlags.Public | BindingFlags.Instance;
+ if (allowPrivateConstructors)
+ {
+ bindingFlags |= BindingFlags.NonPublic;
+ }
+ return type.IsValueType || type.GetConstructor(bindingFlags, null, Type.EmptyTypes, null) != null;
}
public static IEnumerable GetPublicProperties(this Type type)
diff --git a/src/Docfx.YamlSerialization/Helpers/TypeConverterCache.cs b/src/Docfx.YamlSerialization/Helpers/TypeConverterCache.cs
new file mode 100644
index 00000000000..bbdcb2e2b83
--- /dev/null
+++ b/src/Docfx.YamlSerialization/Helpers/TypeConverterCache.cs
@@ -0,0 +1,83 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Collections.Concurrent;
+using System.Diagnostics.CodeAnalysis;
+using YamlDotNet.Serialization;
+
+namespace Docfx.YamlSerialization.Helpers;
+
+///
+/// A cache / map for instances.
+///
+///
+/// This class is copied from following YamlDotNet implementation.
+/// https://github.com/aaubry/YamlDotNet/blob/master/YamlDotNet/Serialization/Utilities/TypeConverterCache.cs
+///
+internal sealed class TypeConverterCache
+{
+ private readonly IYamlTypeConverter[] typeConverters;
+ private readonly ConcurrentDictionary cache = new();
+
+ public TypeConverterCache(IEnumerable? typeConverters)
+ : this(typeConverters?.ToArray() ?? [])
+ {
+ }
+
+ public TypeConverterCache(IYamlTypeConverter[] typeConverters)
+ {
+ this.typeConverters = typeConverters;
+ }
+
+ ///
+ /// Returns the first that accepts the given type.
+ ///
+ /// The to lookup.
+ /// The that accepts this type or if no converter is found.
+ /// if a type converter was found; otherwise.
+ public bool TryGetConverterForType(Type type, [NotNullWhen(true)] out IYamlTypeConverter? typeConverter)
+ {
+ var result = cache.GetOrAdd(type, static (t, tc) => LookupTypeConverter(t, tc), typeConverters);
+
+ typeConverter = result.TypeConverter;
+ return result.HasMatch;
+ }
+
+ ///
+ /// Returns the of the given type.
+ ///
+ /// The type of the converter.
+ /// The of the given type.
+ /// If no type converter of the given type is found.
+ ///
+ /// Note that this method searches on the type of the itself. If you want to find a type converter
+ /// that accepts a given , use instead.
+ ///
+ public IYamlTypeConverter GetConverterByType(Type converter)
+ {
+ // Intentially avoids LINQ as this is on a hot path
+ foreach (var typeConverter in typeConverters)
+ {
+ if (typeConverter.GetType() == converter)
+ {
+ return typeConverter;
+ }
+ }
+
+ throw new ArgumentException($"{nameof(IYamlTypeConverter)} of type {converter.FullName} not found", nameof(converter));
+ }
+
+ private static (bool HasMatch, IYamlTypeConverter? TypeConverter) LookupTypeConverter(Type type, IYamlTypeConverter[] typeConverters)
+ {
+ // Intentially avoids LINQ as this is on a hot path
+ foreach (var typeConverter in typeConverters)
+ {
+ if (typeConverter.Accepts(type))
+ {
+ return (true, typeConverter);
+ }
+ }
+
+ return (false, null);
+ }
+}
diff --git a/src/Docfx.YamlSerialization/NodeDeserializers/EmitArrayNodeDeserializer.cs b/src/Docfx.YamlSerialization/NodeDeserializers/EmitArrayNodeDeserializer.cs
index 0dc273ac031..7f6fc724e95 100644
--- a/src/Docfx.YamlSerialization/NodeDeserializers/EmitArrayNodeDeserializer.cs
+++ b/src/Docfx.YamlSerialization/NodeDeserializers/EmitArrayNodeDeserializer.cs
@@ -12,12 +12,22 @@ namespace Docfx.YamlSerialization.NodeDeserializers;
public class EmitArrayNodeDeserializer : INodeDeserializer
{
+ private readonly INamingConvention _enumNamingConvention;
+ private readonly ITypeInspector _typeDescriptor;
+
private static readonly MethodInfo DeserializeHelperMethod =
typeof(EmitArrayNodeDeserializer).GetMethod(nameof(DeserializeHelper))!;
- private static readonly ConcurrentDictionary, object?>> _funcCache =
+
+ private static readonly ConcurrentDictionary, INamingConvention, ITypeInspector, object?>> _funcCache =
new();
- bool INodeDeserializer.Deserialize(IParser reader, Type expectedType, Func nestedObjectDeserializer, out object? value)
+ public EmitArrayNodeDeserializer(INamingConvention enumNamingConvention, ITypeInspector typeDescriptor)
+ {
+ _enumNamingConvention = enumNamingConvention;
+ _typeDescriptor = typeDescriptor;
+ }
+
+ bool INodeDeserializer.Deserialize(IParser reader, Type expectedType, Func nestedObjectDeserializer, out object? value, ObjectDeserializer rootDeserializer)
{
if (!expectedType.IsArray)
{
@@ -26,27 +36,44 @@ bool INodeDeserializer.Deserialize(IParser reader, Type expectedType, Func(IParser reader, Type expectedType, Func nestedObjectDeserializer)
+ public static TItem[] DeserializeHelper(
+ IParser reader,
+ Type expectedType,
+ Func nestedObjectDeserializer,
+ INamingConvention enumNamingConvention,
+ ITypeInspector typeDescriptor)
{
var items = new List();
- EmitGenericCollectionNodeDeserializer.DeserializeHelper(reader, expectedType, nestedObjectDeserializer, items);
+ EmitGenericCollectionNodeDeserializer.DeserializeHelper(reader, expectedType, nestedObjectDeserializer, items, enumNamingConvention, typeDescriptor);
return items.ToArray();
}
- private static Func, object?> AddItem(Type expectedType)
+ private static Func, INamingConvention, ITypeInspector, object?> AddItem(Type expectedType)
{
- var dm = new DynamicMethod(string.Empty, typeof(object), [typeof(IParser), typeof(Type), typeof(Func)]);
+ var dm = new DynamicMethod(
+ string.Empty,
+ returnType: typeof(object),
+ parameterTypes:
+ [
+ typeof(IParser), // reader
+ typeof(Type), // expectedType
+ typeof(Func), // nestedObjectDeserializer
+ typeof(INamingConvention), // enumNamingConvention
+ typeof(ITypeInspector), // typeDescriptor
+ ]);
var il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Ldarg_2);
+ il.Emit(OpCodes.Ldarg_3);
+ il.Emit(OpCodes.Ldarg_S, (byte)4);
il.Emit(OpCodes.Call, DeserializeHelperMethod.MakeGenericMethod(expectedType.GetElementType()!));
il.Emit(OpCodes.Ret);
- return (Func, object?>)dm.CreateDelegate(typeof(Func, object?>));
+ return (Func, INamingConvention, ITypeInspector, object?>)dm.CreateDelegate(typeof(Func, INamingConvention, ITypeInspector, object?>));
}
}
diff --git a/src/Docfx.YamlSerialization/NodeDeserializers/EmitGenericCollectionNodeDeserializer.cs b/src/Docfx.YamlSerialization/NodeDeserializers/EmitGenericCollectionNodeDeserializer.cs
index 58f5dd74ff2..632ffdaf6c1 100644
--- a/src/Docfx.YamlSerialization/NodeDeserializers/EmitGenericCollectionNodeDeserializer.cs
+++ b/src/Docfx.YamlSerialization/NodeDeserializers/EmitGenericCollectionNodeDeserializer.cs
@@ -7,7 +7,6 @@
using YamlDotNet.Core;
using YamlDotNet.Core.Events;
using YamlDotNet.Serialization;
-using YamlDotNet.Serialization.NamingConventions;
using YamlDotNet.Serialization.Utilities;
using EditorBrowsable = System.ComponentModel.EditorBrowsableAttribute;
using EditorBrowsableState = System.ComponentModel.EditorBrowsableState;
@@ -19,15 +18,21 @@ public class EmitGenericCollectionNodeDeserializer : INodeDeserializer
private static readonly MethodInfo DeserializeHelperMethod =
typeof(EmitGenericCollectionNodeDeserializer).GetMethod(nameof(DeserializeHelper))!;
private readonly IObjectFactory _objectFactory;
- private readonly Dictionary _gpCache = [];
- private readonly Dictionary, object?>> _actionCache = [];
+ private readonly INamingConvention _enumNamingConvention;
+ private readonly ITypeInspector _typeDescriptor;
+ private readonly Dictionary _gpCache =
+ new();
+ private readonly Dictionary, object?, INamingConvention, ITypeInspector>> _actionCache =
+ new();
- public EmitGenericCollectionNodeDeserializer(IObjectFactory objectFactory)
+ public EmitGenericCollectionNodeDeserializer(IObjectFactory objectFactory, INamingConvention enumNamingConvention, ITypeInspector typeDescriptor)
{
_objectFactory = objectFactory;
+ _enumNamingConvention = enumNamingConvention;
+ _typeDescriptor = typeDescriptor;
}
- bool INodeDeserializer.Deserialize(IParser reader, Type expectedType, Func nestedObjectDeserializer, out object? value)
+ bool INodeDeserializer.Deserialize(IParser reader, Type expectedType, Func nestedObjectDeserializer, out object? value, ObjectDeserializer rootDeserializer)
{
if (!_gpCache.TryGetValue(expectedType, out var gp))
{
@@ -55,25 +60,44 @@ bool INodeDeserializer.Deserialize(IParser reader, Type expectedType, Func), typeof(object)]);
+ var dm = new DynamicMethod(
+ string.Empty,
+ returnType: typeof(void),
+ [
+ typeof(IParser),
+ typeof(Type),
+ typeof(Func),
+ typeof(object),
+ typeof(INamingConvention),
+ typeof(ITypeInspector)
+ ]);
+
var il = dm.GetILGenerator();
- il.Emit(OpCodes.Ldarg_0);
- il.Emit(OpCodes.Ldarg_1);
- il.Emit(OpCodes.Ldarg_2);
- il.Emit(OpCodes.Ldarg_3);
+ il.Emit(OpCodes.Ldarg_0); // reader
+ il.Emit(OpCodes.Ldarg_1); // expectedType
+ il.Emit(OpCodes.Ldarg_2); // nestedObjectDeserializer
+ il.Emit(OpCodes.Ldarg_3); // result
il.Emit(OpCodes.Castclass, typeof(ICollection<>).MakeGenericType(gp));
+ il.Emit(OpCodes.Ldarg_S, (byte)4); // enumNamingConvention
+ il.Emit(OpCodes.Ldarg_S, (byte)5); // typeDescriptor
il.Emit(OpCodes.Call, DeserializeHelperMethod.MakeGenericMethod(gp));
il.Emit(OpCodes.Ret);
- action = (Action, object?>)dm.CreateDelegate(typeof(Action, object?>));
+ action = (Action, object?, INamingConvention, ITypeInspector>)dm.CreateDelegate(typeof(Action, object?, INamingConvention, ITypeInspector>));
_actionCache[gp] = action;
}
- action(reader, expectedType, nestedObjectDeserializer, value);
+ action(reader, expectedType, nestedObjectDeserializer, value, _enumNamingConvention, _typeDescriptor);
return true;
}
[EditorBrowsable(EditorBrowsableState.Never)]
- public static void DeserializeHelper(IParser reader, Type expectedType, Func nestedObjectDeserializer, ICollection result)
+ public static void DeserializeHelper(
+ IParser reader,
+ Type expectedType,
+ Func nestedObjectDeserializer,
+ ICollection result,
+ INamingConvention enumNamingConvention,
+ ITypeInspector typeDescriptor)
{
reader.Consume();
while (!reader.Accept(out _))
@@ -81,13 +105,13 @@ public static void DeserializeHelper(IParser reader, Type expectedType, F
var value = nestedObjectDeserializer(reader, typeof(TItem));
if (value is not IValuePromise promise)
{
- result.Add(TypeConverter.ChangeType(value, NullNamingConvention.Instance));
+ result.Add(TypeConverter.ChangeType(value, enumNamingConvention, typeDescriptor));
}
else if (result is IList list)
{
var index = list.Count;
result.Add(default!);
- promise.ValueAvailable += v => list[index] = TypeConverter.ChangeType(v, NullNamingConvention.Instance);
+ promise.ValueAvailable += v => list[index] = TypeConverter.ChangeType(v, enumNamingConvention, typeDescriptor);
}
else
{
diff --git a/src/Docfx.YamlSerialization/NodeDeserializers/EmitGenericDictionaryNodeDeserializer.cs b/src/Docfx.YamlSerialization/NodeDeserializers/EmitGenericDictionaryNodeDeserializer.cs
index 8294a3dd44d..04fe761597c 100644
--- a/src/Docfx.YamlSerialization/NodeDeserializers/EmitGenericDictionaryNodeDeserializer.cs
+++ b/src/Docfx.YamlSerialization/NodeDeserializers/EmitGenericDictionaryNodeDeserializer.cs
@@ -24,7 +24,7 @@ public EmitGenericDictionaryNodeDeserializer(IObjectFactory objectFactory)
_objectFactory = objectFactory;
}
- bool INodeDeserializer.Deserialize(IParser reader, Type expectedType, Func nestedObjectDeserializer, out object? value)
+ bool INodeDeserializer.Deserialize(IParser reader, Type expectedType, Func nestedObjectDeserializer, out object? value, ObjectDeserializer rootDeserializer)
{
if (!_gpCache.TryGetValue(expectedType, out var gp))
{
diff --git a/src/Docfx.YamlSerialization/NodeDeserializers/ExtensibleObjectNodeDeserializer.cs b/src/Docfx.YamlSerialization/NodeDeserializers/ExtensibleObjectNodeDeserializer.cs
index 24980f3120d..c883079bcb4 100644
--- a/src/Docfx.YamlSerialization/NodeDeserializers/ExtensibleObjectNodeDeserializer.cs
+++ b/src/Docfx.YamlSerialization/NodeDeserializers/ExtensibleObjectNodeDeserializer.cs
@@ -4,7 +4,6 @@
using YamlDotNet.Core;
using YamlDotNet.Core.Events;
using YamlDotNet.Serialization;
-using YamlDotNet.Serialization.NamingConventions;
using YamlDotNet.Serialization.Utilities;
namespace Docfx.YamlSerialization.NodeDeserializers;
@@ -14,15 +13,19 @@ public sealed class ExtensibleObjectNodeDeserializer : INodeDeserializer
private readonly IObjectFactory _objectFactory;
private readonly ITypeInspector _typeDescriptor;
private readonly bool _ignoreUnmatched;
+ private readonly bool _caseInsensitivePropertyMatching;
+ private readonly INamingConvention _enumNamingConvention;
- public ExtensibleObjectNodeDeserializer(IObjectFactory objectFactory, ITypeInspector typeDescriptor, bool ignoreUnmatched)
+ public ExtensibleObjectNodeDeserializer(IObjectFactory objectFactory, ITypeInspector typeDescriptor, INamingConvention enumNamingConvention, bool ignoreUnmatched, bool caseInsensitivePropertyMatching)
{
_objectFactory = objectFactory;
_typeDescriptor = typeDescriptor;
+ _enumNamingConvention = enumNamingConvention;
_ignoreUnmatched = ignoreUnmatched;
+ _caseInsensitivePropertyMatching = caseInsensitivePropertyMatching;
}
- bool INodeDeserializer.Deserialize(IParser reader, Type expectedType, Func nestedObjectDeserializer, out object? value)
+ bool INodeDeserializer.Deserialize(IParser reader, Type expectedType, Func nestedObjectDeserializer, out object? value, ObjectDeserializer rootDeserializer)
{
if (!reader.TryConsume(out _))
{
@@ -34,7 +37,7 @@ bool INodeDeserializer.Deserialize(IParser reader, Type expectedType, Func(out _))
{
var propertyName = reader.Consume();
- var property = _typeDescriptor.GetProperty(expectedType, value, propertyName.Value, _ignoreUnmatched);
+ var property = _typeDescriptor.GetProperty(expectedType, value, propertyName.Value, _ignoreUnmatched, _caseInsensitivePropertyMatching);
if (property == null)
{
reader.SkipThisAndNestedEvents();
@@ -44,7 +47,7 @@ bool INodeDeserializer.Deserialize(IParser reader, Type expectedType, Func
{
- var convertedValue = TypeConverter.ChangeType(v, property.Type, NullNamingConvention.Instance);
+ var convertedValue = TypeConverter.ChangeType(v, property.Type, _enumNamingConvention, _typeDescriptor);
property.Write(valueRef, convertedValue);
};
}
diff --git a/src/Docfx.YamlSerialization/ObjectGraphTraversalStrategies/FullObjectGraphTraversalStrategy.cs b/src/Docfx.YamlSerialization/ObjectGraphTraversalStrategies/FullObjectGraphTraversalStrategy.cs
index 29dfdfab69a..0c0d2e2c583 100644
--- a/src/Docfx.YamlSerialization/ObjectGraphTraversalStrategies/FullObjectGraphTraversalStrategy.cs
+++ b/src/Docfx.YamlSerialization/ObjectGraphTraversalStrategies/FullObjectGraphTraversalStrategy.cs
@@ -3,11 +3,12 @@
using System.Collections;
using System.ComponentModel;
-using System.Globalization;
+using System.Diagnostics;
using System.Reflection;
using System.Reflection.Emit;
-using Docfx.YamlSerialization.Helpers;
+using System.Text;
using Docfx.YamlSerialization.ObjectDescriptors;
+using YamlDotNet.Core;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;
using IObjectGraphVisitor = System.Object;
@@ -23,154 +24,223 @@ public class FullObjectGraphTraversalStrategy : IObjectGraphTraversalStrategy
{
private static MethodInfo TraverseGenericDictionaryHelperMethod { get; } =
typeof(FullObjectGraphTraversalStrategy).GetMethod(nameof(TraverseGenericDictionaryHelper))!;
- protected YamlSerializer Serializer { get; }
+
private readonly int _maxRecursion;
private readonly ITypeInspector _typeDescriptor;
private readonly ITypeResolver _typeResolver;
private readonly INamingConvention _namingConvention;
- private readonly Dictionary, Action> _behaviorCache = [];
- private readonly Dictionary, Action> _traverseGenericDictionaryCache = [];
+ private readonly IObjectFactory _objectFactory;
- public FullObjectGraphTraversalStrategy(YamlSerializer serializer, ITypeInspector typeDescriptor, ITypeResolver typeResolver, int maxRecursion, INamingConvention? namingConvention)
- {
- if (maxRecursion <= 0)
- {
- throw new ArgumentOutOfRangeException(nameof(maxRecursion), maxRecursion, "maxRecursion must be greater than 1");
- }
+ // private readonly Dictionary, Action, ObjectSerializer>> _behaviorCache = new();
+ private readonly Dictionary, Action, ObjectSerializer>> _traverseGenericDictionaryCache = new();
+
+ protected YamlSerializer Serializer { get; }
- ArgumentNullException.ThrowIfNull(typeDescriptor);
- ArgumentNullException.ThrowIfNull(typeResolver);
+ public FullObjectGraphTraversalStrategy(YamlSerializer serializer, ITypeInspector typeDescriptor, ITypeResolver typeResolver, int maxRecursion, INamingConvention namingConvention, IObjectFactory objectFactory)
+ {
+ ArgumentOutOfRangeException.ThrowIfNegativeOrZero(maxRecursion);
Serializer = serializer;
+
_typeDescriptor = typeDescriptor;
_typeResolver = typeResolver;
+
_maxRecursion = maxRecursion;
- _namingConvention = namingConvention ?? NullNamingConvention.Instance;
+ _namingConvention = namingConvention;
+ _objectFactory = objectFactory;
}
- void IObjectGraphTraversalStrategy.Traverse(IObjectDescriptor graph, IObjectGraphVisitor visitor, TContext context)
+ void IObjectGraphTraversalStrategy.Traverse(IObjectDescriptor graph, IObjectGraphVisitor visitor, TContext context, ObjectSerializer serializer)
{
- Traverse(graph, visitor, 0, context);
+ Traverse(null, "", graph, visitor, context, new Stack(_maxRecursion), serializer);
}
- protected virtual void Traverse(IObjectDescriptor value, IObjectGraphVisitor visitor, int currentDepth, TContext context)
+ protected virtual void Traverse(IPropertyDescriptor? propertyDescriptor, object name, IObjectDescriptor value, IObjectGraphVisitor visitor, TContext context, Stack path, ObjectSerializer serializer)
{
- if (++currentDepth > _maxRecursion)
+ if (path.Count >= _maxRecursion)
{
- throw new InvalidOperationException("Too much recursion when traversing the object graph");
+ var message = new StringBuilder();
+ message.AppendLine("Too much recursion when traversing the object graph.");
+ message.AppendLine("The path to reach this recursion was:");
+
+ var lines = new Stack>(path.Count);
+ var maxNameLength = 0;
+ foreach (var segment in path)
+ {
+ var segmentName = segment.Name?.ToString() ?? string.Empty;
+ maxNameLength = Math.Max(maxNameLength, segmentName.Length);
+ lines.Push(new KeyValuePair(segmentName, segment.Value.Type.FullName!));
+ }
+
+ foreach (var line in lines)
+ {
+ message
+ .Append(" -> ")
+ .Append(line.Key.PadRight(maxNameLength))
+ .Append(" [")
+ .Append(line.Value)
+ .AppendLine("]");
+ }
+
+ throw new MaximumRecursionLevelReachedException(message.ToString());
}
- if (!visitor.Enter(value, context))
+ if (!visitor.Enter(propertyDescriptor, value, context, serializer))
{
return;
}
- var typeCode = Type.GetTypeCode(value.Type);
- switch (typeCode)
+ path.Push(new ObjectPathSegment(name, value));
+
+ try
{
- case TypeCode.Boolean:
- case TypeCode.Byte:
- case TypeCode.Int16:
- case TypeCode.Int32:
- case TypeCode.Int64:
- case TypeCode.SByte:
- case TypeCode.UInt16:
- case TypeCode.UInt32:
- case TypeCode.UInt64:
- case TypeCode.Single:
- case TypeCode.Double:
- case TypeCode.Decimal:
- case TypeCode.String:
- case TypeCode.Char:
- case TypeCode.DateTime:
- visitor.VisitScalar(value, context);
- break;
- case TypeCode.DBNull:
- visitor.VisitScalar(new BetterObjectDescriptor(null, typeof(object), typeof(object)), context);
- break;
- case TypeCode.Empty:
- throw new NotSupportedException(string.Format(CultureInfo.InvariantCulture, "TypeCode.{0} is not supported.", typeCode));
- default:
- if (value.Value == null || value.Type == typeof(TimeSpan))
- {
- visitor.VisitScalar(value, context);
+ var typeCode = Type.GetTypeCode(value.Type);
+ switch (typeCode)
+ {
+ case TypeCode.Boolean:
+ case TypeCode.Byte:
+ case TypeCode.Int16:
+ case TypeCode.Int32:
+ case TypeCode.Int64:
+ case TypeCode.SByte:
+ case TypeCode.UInt16:
+ case TypeCode.UInt32:
+ case TypeCode.UInt64:
+ case TypeCode.Single:
+ case TypeCode.Double:
+ case TypeCode.Decimal:
+ case TypeCode.String:
+ case TypeCode.Char:
+ case TypeCode.DateTime:
+ visitor.VisitScalar(value, context, serializer);
+ break;
+
+ case TypeCode.DBNull:
+ visitor.VisitScalar(new BetterObjectDescriptor(null, typeof(object), typeof(object)), context, serializer);
+ break;
+
+ case TypeCode.Empty:
+ throw new NotSupportedException($"TypeCode.{typeCode} is not supported.");
+
+ case TypeCode.Object:
+ default:
+ if (value.Value == null || value.Type == typeof(TimeSpan))
+ {
+ visitor.VisitScalar(value, context, serializer);
+ break;
+ }
+
+ var underlyingType = Nullable.GetUnderlyingType(value.Type);
+ if (underlyingType != null)
+ {
+ // This is a nullable type, recursively handle it with its underlying type.
+ // Note that if it contains null, the condition above already took care of it
+ Traverse(
+ propertyDescriptor,
+ "Value",
+ new BetterObjectDescriptor(value.Value, underlyingType, value.Type, value.ScalarStyle),
+ visitor,
+ context,
+ path,
+ serializer
+ );
+ }
+ else
+ {
+ TraverseObject(propertyDescriptor, value, visitor, context, path, serializer);
+ }
break;
- }
-
- var underlyingType = Nullable.GetUnderlyingType(value.Type);
- if (underlyingType != null)
- {
- // This is a nullable type, recursively handle it with its underlying type.
- // Note that if it contains null, the condition above already took care of it
- Traverse(new BetterObjectDescriptor(value.Value, underlyingType, value.Type, value.ScalarStyle), visitor, currentDepth, context);
- }
- else
- {
- TraverseObject(value, visitor, currentDepth, context);
- }
- break;
+ }
+ }
+ finally
+ {
+ path.Pop();
}
}
- protected virtual void TraverseObject(IObjectDescriptor value, IObjectGraphVisitor visitor, int currentDepth, TContext context)
+ protected virtual void TraverseObject(
+ IPropertyDescriptor? propertyDescriptor,
+ IObjectDescriptor value,
+ IObjectGraphVisitor visitor,
+ TContext context,
+ Stack path,
+ ObjectSerializer serializer)
{
+ Debug.Assert(context != null);
+
var key = Tuple.Create(value.Type, typeof(TContext));
- if (!_behaviorCache.TryGetValue(key, out var action))
+
+ if (typeof(IDictionary).IsAssignableFrom(value.Type))
{
- if (typeof(IDictionary).IsAssignableFrom(value.Type))
- {
- action = TraverseDictionary;
- }
- else
- {
- var dictionaryType = ReflectionUtility.GetImplementedGenericInterface(value.Type, typeof(IDictionary<,>));
- if (dictionaryType != null)
- {
- action = (v, vi, d, c) => TraverseGenericDictionary(v, dictionaryType, vi, d, c);
- }
- else if (typeof(IEnumerable).IsAssignableFrom(value.Type))
- {
- action = TraverseList;
- }
- else
- {
- action = TraverseProperties;
- }
- }
- _behaviorCache[key] = action;
+ TraverseDictionary(propertyDescriptor, value, visitor, typeof(object), typeof(object), context, path, serializer);
+ return;
+ }
+
+ if (_objectFactory.GetDictionary(value, out var adaptedDictionary, out var genericArguments))
+ {
+ Debug.Assert(genericArguments != null);
+
+ var objectDescriptor = new ObjectDescriptor(adaptedDictionary, value.Type, value.StaticType, value.ScalarStyle);
+ var dictionaryKeyType = genericArguments[0];
+ var dictionaryValueType = genericArguments[1];
+
+ TraverseDictionary(propertyDescriptor, objectDescriptor, visitor, dictionaryKeyType, dictionaryValueType, context, path, serializer);
+ return;
+ }
+
+ if (typeof(IEnumerable).IsAssignableFrom(value.Type))
+ {
+ TraverseList(propertyDescriptor, value, visitor, context, path, serializer);
+ return;
}
- action(value, visitor, currentDepth, context!);
+
+ TraverseProperties(value, visitor, context, path, serializer);
}
- protected virtual void TraverseDictionary(IObjectDescriptor dictionary, object visitor, int currentDepth, object context)
+ protected virtual void TraverseDictionary(
+ IPropertyDescriptor? propertyDescriptor,
+ IObjectDescriptor dictionary,
+ IObjectGraphVisitor visitor,
+ Type keyType,
+ Type valueType,
+ TContext context,
+ Stack path,
+ ObjectSerializer serializer)
{
- var v = (IObjectGraphVisitor)visitor;
- var c = (TContext)context;
- v.VisitMappingStart(dictionary, typeof(object), typeof(object), c);
+ visitor.VisitMappingStart(dictionary, keyType, valueType, context, serializer);
- foreach (DictionaryEntry entry in (IDictionary)dictionary.NonNullValue())
+ var isDynamic = dictionary.Type.FullName!.Equals("System.Dynamic.ExpandoObject");
+ foreach (DictionaryEntry? entry in (IDictionary)dictionary.NonNullValue())
{
- var key = GetObjectDescriptor(entry.Key, typeof(object));
- var value = GetObjectDescriptor(entry.Value, typeof(object));
+ var entryValue = entry!.Value;
+ var keyValue = isDynamic ? _namingConvention.Apply(entryValue.Key.ToString()!) : entryValue.Key;
+ var key = GetObjectDescriptor(keyValue, keyType);
+ var value = GetObjectDescriptor(entryValue.Value, valueType);
- if (v.EnterMapping(key, value, c))
+ if (visitor.EnterMapping(key, value, context, serializer))
{
- Traverse(key, v, currentDepth, c);
- Traverse(value, v, currentDepth, c);
+ Traverse(propertyDescriptor, keyValue, key, visitor, context, path, serializer);
+ Traverse(propertyDescriptor, keyValue, value, visitor, context, path, serializer);
}
}
- v.VisitMappingEnd(dictionary, c);
+ visitor.VisitMappingEnd(dictionary, context, serializer);
}
- private void TraverseGenericDictionary(IObjectDescriptor dictionary, Type dictionaryType, IObjectGraphVisitor visitor, int currentDepth, IObjectGraphVisitorContext context)
+ private void TraverseGenericDictionary(
+ IObjectDescriptor dictionary,
+ Type dictionaryType,
+ IObjectGraphVisitor visitor,
+ TContext context,
+ Stack path,
+ ObjectSerializer serializer)
{
- var v = (IObjectGraphVisitor)visitor;
- var c = (TContext)context;
+ Debug.Assert(dictionary.Value != null);
+
var entryTypes = dictionaryType.GetGenericArguments();
// dictionaryType is IDictionary
- v.VisitMappingStart(dictionary, entryTypes[0], entryTypes[1], c);
+ visitor.VisitMappingStart(dictionary, entryTypes[0], entryTypes[1], context, serializer);
var key = Tuple.Create(entryTypes[0], entryTypes[1], typeof(TContext));
if (!_traverseGenericDictionaryCache.TryGetValue(key, out var action))
@@ -178,14 +248,26 @@ private void TraverseGenericDictionary(IObjectDescriptor dictionary, T
action = GetTraverseGenericDictionaryHelper(entryTypes[0], entryTypes[1], typeof(TContext));
_traverseGenericDictionaryCache[key] = action;
}
- action(this, dictionary.Value, v, currentDepth, _namingConvention, c);
+ action(this, dictionary.Value, visitor, _namingConvention ?? NullNamingConvention.Instance, context!, path, serializer);
- v.VisitMappingEnd(dictionary, c);
+ visitor.VisitMappingEnd(dictionary, context, serializer);
}
- private static Action GetTraverseGenericDictionaryHelper(Type tkey, Type tvalue, Type tcontext)
+ private static Action, ObjectSerializer> GetTraverseGenericDictionaryHelper(Type tkey, Type tvalue, Type tcontext)
{
- var dm = new DynamicMethod(string.Empty, typeof(void), [typeof(FullObjectGraphTraversalStrategy), typeof(object), typeof(IObjectGraphVisitor), typeof(int), typeof(INamingConvention), typeof(IObjectGraphVisitorContext)]);
+ var dm = new DynamicMethod(
+ string.Empty,
+ returnType: typeof(void),
+ parameterTypes:
+ [
+ typeof(FullObjectGraphTraversalStrategy),
+ typeof(object),
+ typeof(IObjectGraphVisitor),
+ typeof(INamingConvention),
+ typeof(IObjectGraphVisitorContext),
+ typeof(Stack),
+ typeof(ObjectSerializer),
+ ]);
var il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldarg_1);
@@ -196,77 +278,116 @@ private void TraverseGenericDictionary(IObjectDescriptor dictionary, T
il.Emit(OpCodes.Ldarg_S, (byte)5);
il.Emit(OpCodes.Call, TraverseGenericDictionaryHelperMethod.MakeGenericMethod(tkey, tvalue, tcontext));
il.Emit(OpCodes.Ret);
- return (Action)dm.CreateDelegate(typeof(Action));
+ return (Action, ObjectSerializer>)dm.CreateDelegate(typeof(Action, ObjectSerializer>));
}
[EditorBrowsable(EditorBrowsableState.Never)]
- public static void TraverseGenericDictionaryHelper(
+ private static void TraverseGenericDictionaryHelper(
FullObjectGraphTraversalStrategy self,
+ IPropertyDescriptor propertyDescriptor,
IDictionary dictionary,
- IObjectGraphVisitor visitor,
- int currentDepth,
+ IObjectGraphVisitor visitor,
INamingConvention namingConvention,
- IObjectGraphVisitorContext context)
+ TContext context,
+ Stack paths,
+ ObjectSerializer serializer)
{
- var v = (IObjectGraphVisitor)visitor;
- var c = (TContext)context;
+
var isDynamic = dictionary.GetType().FullName!.Equals("System.Dynamic.ExpandoObject");
+
foreach (var entry in dictionary)
{
- var keyString = isDynamic ? namingConvention.Apply(entry.Key!.ToString()!) : entry.Key!.ToString();
+ Debug.Assert(entry.Key != null);
+ Debug.Assert(entry.Value != null);
+
+ var keyString = isDynamic
+ ? namingConvention.Apply(entry.Key!.ToString()!)!
+ : entry.Key.ToString()!;
var key = self.GetObjectDescriptor(keyString, typeof(TKey));
var value = self.GetObjectDescriptor(entry.Value, typeof(TValue));
- if (v.EnterMapping(key, value, c))
+ if (visitor.EnterMapping(key, value, context, serializer))
{
- self.Traverse(key, v, currentDepth, c);
- self.Traverse(value, v, currentDepth, c);
+ self.Traverse(propertyDescriptor, propertyDescriptor.Name, key, visitor, context, paths, serializer);
+ self.Traverse(propertyDescriptor, propertyDescriptor.Name, key, visitor, context, paths, serializer);
}
}
}
- private void TraverseList(IObjectDescriptor value, IObjectGraphVisitor visitor, int currentDepth, IObjectGraphVisitorContext context)
+ private void TraverseList(
+ IPropertyDescriptor? propertyDescriptor,
+ IObjectDescriptor value,
+ IObjectGraphVisitor visitor,
+ TContext context,
+ Stack path,
+ ObjectSerializer serializer)
{
- var v = (IObjectGraphVisitor)visitor;
- var c = (TContext)context;
- var enumerableType = ReflectionUtility.GetImplementedGenericInterface(value.Type, typeof(IEnumerable<>));
- var itemType = enumerableType != null ?
- enumerableType.GetGenericArguments()[0]
- : typeof(object);
+ var itemType = _objectFactory.GetValueType(value.Type);
- v.VisitSequenceStart(value, itemType, c);
+ visitor.VisitSequenceStart(value, itemType, context, serializer);
+
+ var index = 0;
foreach (var item in (IEnumerable)value.NonNullValue())
{
- Traverse(GetObjectDescriptor(item, itemType), v, currentDepth, c);
+ Traverse(propertyDescriptor, index, GetObjectDescriptor(item, itemType), visitor, context, path, serializer);
+ ++index;
}
- v.VisitSequenceEnd(value, c);
+ visitor.VisitSequenceEnd(value, context, serializer);
}
- protected virtual void TraverseProperties(IObjectDescriptor value, IObjectGraphVisitor visitor, int currentDepth, IObjectGraphVisitorContext context)
+ protected virtual void TraverseProperties(
+ IObjectDescriptor value,
+ IObjectGraphVisitor visitor,
+ TContext context,
+ Stack path,
+ ObjectSerializer serializer)
{
- var v = (IObjectGraphVisitor)visitor;
- var c = (TContext)context;
- v.VisitMappingStart(value, typeof(string), typeof(object), c);
+ Debug.Assert(visitor != null);
+ Debug.Assert(context != null);
+ Debug.Assert(value.Value != null);
+
+ if (context.GetType() != typeof(Nothing))
+ {
+ _objectFactory.ExecuteOnSerializing(value.Value);
+ }
+
+ visitor.VisitMappingStart(value, typeof(string), typeof(object), context, serializer);
var source = value.NonNullValue();
- foreach (var propertyDescriptor in _typeDescriptor.GetProperties(value.Type, value.Value))
+ foreach (var propertyDescriptor in _typeDescriptor.GetProperties(value.Type, source))
{
var propertyValue = propertyDescriptor.Read(source);
-
- if (v.EnterMapping(propertyDescriptor, propertyValue, c))
+ if (visitor.EnterMapping(propertyDescriptor, propertyValue, context, serializer))
{
- Traverse(new BetterObjectDescriptor(propertyDescriptor.Name, typeof(string), typeof(string)), v, currentDepth, c);
- Traverse(propertyValue, v, currentDepth, c);
+ Traverse(null, propertyDescriptor.Name, new BetterObjectDescriptor(propertyDescriptor.Name, typeof(string), typeof(string), ScalarStyle.Plain), visitor, context, path, serializer);
+ Traverse(propertyDescriptor, propertyDescriptor.Name, propertyValue, visitor, context, path, serializer);
}
}
- v.VisitMappingEnd(value, c);
+ visitor.VisitMappingEnd(value, context, serializer);
+
+ if (context.GetType() != typeof(Nothing))
+ {
+ _objectFactory.ExecuteOnSerialized(value.Value);
+ }
}
private IObjectDescriptor GetObjectDescriptor(object? value, Type staticType)
{
return new BetterObjectDescriptor(value, _typeResolver.Resolve(staticType, value), staticType);
}
+
+ protected internal readonly struct ObjectPathSegment
+ {
+ public readonly object Name;
+ public readonly IObjectDescriptor Value;
+
+ public ObjectPathSegment(object name, IObjectDescriptor value)
+ {
+ this.Name = name;
+ this.Value = value;
+ }
+ }
}
diff --git a/src/Docfx.YamlSerialization/ObjectGraphTraversalStrategies/RoundtripObjectGraphTraversalStrategy.cs b/src/Docfx.YamlSerialization/ObjectGraphTraversalStrategies/RoundtripObjectGraphTraversalStrategy.cs
index 3e53a587526..53b0a95facc 100644
--- a/src/Docfx.YamlSerialization/ObjectGraphTraversalStrategies/RoundtripObjectGraphTraversalStrategy.cs
+++ b/src/Docfx.YamlSerialization/ObjectGraphTraversalStrategies/RoundtripObjectGraphTraversalStrategy.cs
@@ -1,11 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System.Globalization;
using Docfx.YamlSerialization.Helpers;
using YamlDotNet.Serialization;
-using IObjectGraphVisitor = System.Object;
-using IObjectGraphVisitorContext = System.Object;
namespace Docfx.YamlSerialization.ObjectGraphTraversalStrategies;
@@ -16,18 +13,33 @@ namespace Docfx.YamlSerialization.ObjectGraphTraversalStrategies;
///
public class RoundtripObjectGraphTraversalStrategy : FullObjectGraphTraversalStrategy
{
- public RoundtripObjectGraphTraversalStrategy(YamlSerializer serializer, ITypeInspector typeDescriptor, ITypeResolver typeResolver, int maxRecursion)
- : base(serializer, typeDescriptor, typeResolver, maxRecursion, null)
+ private readonly TypeConverterCache _converters;
+ private readonly Settings _settings;
+
+ public RoundtripObjectGraphTraversalStrategy(IEnumerable converters, YamlSerializer serializer, ITypeInspector typeDescriptor, ITypeResolver typeResolver, int maxRecursion, INamingConvention namingConvention, Settings settings, IObjectFactory objectFactory)
+ : base(serializer, typeDescriptor, typeResolver, maxRecursion, namingConvention, objectFactory)
{
+ _converters = new TypeConverterCache(converters);
+ _settings = settings;
}
- protected override void TraverseProperties(IObjectDescriptor value, IObjectGraphVisitor visitor, int currentDepth, IObjectGraphVisitorContext context)
+ ////protected override void TraverseProperties(IObjectDescriptor value, IObjectGraphVisitor visitor, int currentDepth, IObjectGraphVisitorContext context)
+ ////{
+ //// if (!value.Type.HasDefaultConstructor() && !Serializer.Converters.Any(c => c.Accepts(value.Type)))
+ //// {
+ //// throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Type '{0}' cannot be deserialized because it does not have a default constructor or a type converter.", value.Type));
+ //// }
+
+ //// base.TraverseProperties(value, visitor, currentDepth, context);
+ ////}
+
+ protected override void TraverseProperties(IObjectDescriptor value, IObjectGraphVisitor visitor, TContext context, Stack path, ObjectSerializer serializer)
{
- if (!value.Type.HasDefaultConstructor() && !Serializer.Converters.Any(c => c.Accepts(value.Type)))
+ if (!value.Type.HasDefaultConstructor(_settings.AllowPrivateConstructors) && !_converters.TryGetConverterForType(value.Type, out _))
{
- throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Type '{0}' cannot be deserialized because it does not have a default constructor or a type converter.", value.Type));
+ throw new InvalidOperationException($"Type '{value.Type}' cannot be deserialized because it does not have a default constructor or a type converter.");
}
- base.TraverseProperties(value, visitor, currentDepth, context);
+ base.TraverseProperties(value, visitor, context, path, serializer);
}
}
diff --git a/src/Docfx.YamlSerialization/ObjectGraphVisitors/ExclusiveObjectGraphVisitor.cs b/src/Docfx.YamlSerialization/ObjectGraphVisitors/ExclusiveObjectGraphVisitor.cs
index 0afe1efc7ee..a26e4e67304 100644
--- a/src/Docfx.YamlSerialization/ObjectGraphVisitors/ExclusiveObjectGraphVisitor.cs
+++ b/src/Docfx.YamlSerialization/ObjectGraphVisitors/ExclusiveObjectGraphVisitor.cs
@@ -23,13 +23,13 @@ public ExclusiveObjectGraphVisitor(IObjectGraphVisitor nextVisitor)
return type.IsValueType ? Activator.CreateInstance(type) : null;
}
- public override bool EnterMapping(IPropertyDescriptor key, IObjectDescriptor value, IEmitter context)
+ public override bool EnterMapping(IPropertyDescriptor key, IObjectDescriptor value, IEmitter context, ObjectSerializer serializer)
{
var defaultValueAttribute = key.GetCustomAttribute();
object? defaultValue = defaultValueAttribute != null
? defaultValueAttribute.Value
: GetDefault(key.Type);
- return !Equals(value.Value, defaultValue) && base.EnterMapping(key, value, context);
+ return !Equals(value.Value, defaultValue) && base.EnterMapping(key, value, context, serializer);
}
}
diff --git a/src/Docfx.YamlSerialization/TypeInspectors/EmitTypeInspector.cs b/src/Docfx.YamlSerialization/TypeInspectors/EmitTypeInspector.cs
index bd893e48aed..1dbbc65e60d 100644
--- a/src/Docfx.YamlSerialization/TypeInspectors/EmitTypeInspector.cs
+++ b/src/Docfx.YamlSerialization/TypeInspectors/EmitTypeInspector.cs
@@ -4,6 +4,7 @@
using System.Collections.Concurrent;
using System.Reflection;
using System.Reflection.Emit;
+using System.Runtime.Serialization;
using Docfx.YamlSerialization.Helpers;
using Docfx.YamlSerialization.ObjectDescriptors;
using YamlDotNet.Core;
@@ -15,6 +16,8 @@ public class EmitTypeInspector : ExtensibleTypeInspectorSkeleton
{
private static readonly ConcurrentDictionary _cache = new();
private static readonly ConcurrentDictionary> _propertyDescriptorCache = new();
+ private static readonly ConcurrentDictionary<(Type, string), string> _enumNameCache = new();
+ private static readonly ConcurrentDictionary<(Type, string), string> _enumValueCache = new();
private readonly ITypeResolver _resolver;
public EmitTypeInspector(ITypeResolver resolver)
@@ -62,6 +65,58 @@ where name.StartsWith(ep.Prefix, StringComparison.Ordinal)
select new ExtensiblePropertyDescriptor(ep, name, _resolver)).FirstOrDefault();
}
+ // This code is based on ReflectionTypeInspector implementation(See: https://github.com/aaubry/YamlDotNet/blob/master/YamlDotNet/Serialization/TypeInspectors/ReflectionTypeInspector.cs)
+ public override string GetEnumName(Type enumType, string name)
+ {
+ var key = (enumType, name);
+ if (_enumNameCache.TryGetValue(key, out var result))
+ return result;
+
+ // Try to gets enum name from EnumMemberAttribute and resolve enum name.
+ foreach (var enumMember in enumType.GetMembers())
+ {
+ var attribute = enumMember.GetCustomAttribute(inherit: false);
+ if (attribute != null && attribute.Value == name)
+ {
+ name = enumMember.Name;
+ break;
+ }
+ }
+
+ // Add resolved name to cache
+ _enumNameCache.TryAdd(key, name);
+ return name;
+ }
+
+ public override string GetEnumValue(object enumValue)
+ {
+ var enumType = enumValue.GetType();
+ var valueText = enumValue.ToString()!;
+ var key = (enumType, valueText);
+
+ if (_enumValueCache.TryGetValue(key, out var result))
+ return result;
+
+ // Try to gets enum value from EnumMemberAttribute and resolve enum value.
+ if (enumType.GetCustomAttribute() != null)
+ {
+ var enumMember = enumType.GetMember(valueText).FirstOrDefault();
+ if (enumMember != null)
+ {
+ var attribute = enumMember.GetCustomAttribute(inherit: false);
+ if (attribute?.Value != null)
+ {
+ valueText = attribute.Value;
+ }
+ }
+ }
+
+ // Add resolved text to cache.
+ _enumValueCache.TryAdd(key, valueText);
+
+ return valueText;
+ }
+
private sealed class CachingItem
{
private CachingItem() { }
@@ -401,6 +456,12 @@ public EmitPropertyDescriptor(EmitPropertyDescriptorSkeleton skeleton, ITypeReso
public Type? TypeOverride { get; set; }
+ public bool AllowNulls { get; set; }
+
+ public bool Required { get; set; }
+
+ public Type? ConverterType { get; set; }
+
public T GetCustomAttribute() where T : Attribute => (T)_skeleton.GetCustomAttribute(typeof(T));
public IObjectDescriptor Read(object target)
@@ -461,6 +522,12 @@ public ExtensiblePropertyDescriptor(
public Type? TypeOverride { get; set; }
+ public bool AllowNulls { get; set; }
+
+ public bool Required { get; set; }
+
+ public Type? ConverterType { get; set; }
+
public T? GetCustomAttribute() where T : Attribute => null;
public IObjectDescriptor Read(object target)
diff --git a/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleNamingConventionTypeInspector.cs b/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleNamingConventionTypeInspector.cs
index aeb619b4593..f7fa3fd3eaa 100644
--- a/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleNamingConventionTypeInspector.cs
+++ b/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleNamingConventionTypeInspector.cs
@@ -25,4 +25,10 @@ from p in innerTypeDescriptor.GetProperties(type, container)
public override IPropertyDescriptor? GetProperty(Type type, object? container, string name) =>
innerTypeDescriptor.GetProperty(type, container, name);
+
+ public override string GetEnumName(Type enumType, string name) =>
+ innerTypeDescriptor.GetEnumName(enumType, name);
+
+ public override string GetEnumValue(object enumValue) =>
+ innerTypeDescriptor.GetEnumValue(enumValue);
}
diff --git a/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleReadableAndWritablePropertiesTypeInspector.cs b/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleReadableAndWritablePropertiesTypeInspector.cs
index 1407f50a52a..01ad2ab9f38 100644
--- a/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleReadableAndWritablePropertiesTypeInspector.cs
+++ b/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleReadableAndWritablePropertiesTypeInspector.cs
@@ -21,4 +21,10 @@ where p.CanWrite
public override IPropertyDescriptor? GetProperty(Type type, object? container, string name) =>
_innerTypeDescriptor.GetProperty(type, container, name);
+
+ public override string GetEnumName(Type enumType, string name) =>
+ _innerTypeDescriptor.GetEnumName(enumType, name);
+
+ public override string GetEnumValue(object enumValue) =>
+ _innerTypeDescriptor.GetEnumValue(enumValue);
}
diff --git a/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleTypeInspectorSkeleton.cs b/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleTypeInspectorSkeleton.cs
index 235855130aa..715bec3a57f 100644
--- a/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleTypeInspectorSkeleton.cs
+++ b/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleTypeInspectorSkeleton.cs
@@ -11,12 +11,11 @@ public abstract class ExtensibleTypeInspectorSkeleton : ITypeInspector, IExtensi
{
public abstract IEnumerable GetProperties(Type type, object? container);
- public IPropertyDescriptor GetProperty(Type type, object? container, string name, bool ignoreUnmatched)
+ public IPropertyDescriptor GetProperty(Type type, object? container, string name, bool ignoreUnmatched, bool caseInsensitivePropertyMatching)
{
- var candidates =
- from p in GetProperties(type, container)
- where p.Name == name
- select p;
+ var candidates = caseInsensitivePropertyMatching
+ ? GetProperties(type, container).Where(p => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase))
+ : GetProperties(type, container).Where(p => p.Name == name);
using var enumerator = candidates.GetEnumerator();
if (!enumerator.MoveNext())
@@ -61,4 +60,8 @@ from p in GetProperties(type, container)
}
public virtual IPropertyDescriptor? GetProperty(Type type, object? container, string name) => null;
+
+ public abstract string GetEnumName(Type enumType, string name);
+
+ public abstract string GetEnumValue(object enumValue);
}
diff --git a/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleYamlAttributesTypeInspector.cs b/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleYamlAttributesTypeInspector.cs
index 21878ccdaa2..0fb61db306f 100644
--- a/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleYamlAttributesTypeInspector.cs
+++ b/src/Docfx.YamlSerialization/TypeInspectors/ExtensibleYamlAttributesTypeInspector.cs
@@ -48,4 +48,10 @@ public override IEnumerable GetProperties(Type type, object
public override IPropertyDescriptor? GetProperty(Type type, object? container, string name) =>
innerTypeDescriptor.GetProperty(type, container, name);
+
+ public override string GetEnumName(Type enumType, string name) =>
+ innerTypeDescriptor.GetEnumName(enumType, name);
+
+ public override string GetEnumValue(object enumValue) =>
+ innerTypeDescriptor.GetEnumValue(enumValue);
}
diff --git a/src/Docfx.YamlSerialization/YamlDeserializer.cs b/src/Docfx.YamlSerialization/YamlDeserializer.cs
index 221e8b70d56..71d6fe8f571 100644
--- a/src/Docfx.YamlSerialization/YamlDeserializer.cs
+++ b/src/Docfx.YamlSerialization/YamlDeserializer.cs
@@ -52,20 +52,32 @@ public IEnumerable GetProperties(Type type, object? contain
return TypeDescriptor.GetProperties(type, container);
}
- public IPropertyDescriptor GetProperty(Type type, object? container, string name, bool ignoreUnmatched)
+ public IPropertyDescriptor GetProperty(Type type, object? container, string name, bool ignoreUnmatched, bool caseInsensitivePropertyMatching)
{
- return TypeDescriptor.GetProperty(type, container, name, ignoreUnmatched);
+ return TypeDescriptor.GetProperty(type, container, name, ignoreUnmatched, caseInsensitivePropertyMatching);
+ }
+
+ public string GetEnumName(Type enumType, string name)
+ {
+ return TypeDescriptor.GetEnumName(enumType, name);
+ }
+ public string GetEnumValue(object enumValue)
+ {
+ return TypeDescriptor.GetEnumValue(enumValue);
}
}
public YamlDeserializer(
IObjectFactory? objectFactory = null,
INamingConvention? namingConvention = null,
+ INamingConvention? enumNamingConvention = null,
bool ignoreUnmatched = false,
- bool ignoreNotFoundAnchor = true)
+ bool ignoreNotFoundAnchor = true,
+ bool caseInsensitivePropertyMatching = false)
{
objectFactory ??= new DefaultEmitObjectFactory();
namingConvention ??= NullNamingConvention.Instance;
+ enumNamingConvention ??= NullNamingConvention.Instance;
_typeDescriptor.TypeDescriptor =
new ExtensibleYamlAttributesTypeInspector(
@@ -89,24 +101,24 @@ public YamlDeserializer(
[
new TypeConverterNodeDeserializer(_converters),
new NullNodeDeserializer(),
- new ScalarNodeDeserializer(attemptUnknownTypeDeserialization: false, _reflectionTypeConverter, YamlFormatter.Default, NullNamingConvention.Instance),
- new EmitArrayNodeDeserializer(),
+ new ScalarNodeDeserializer(attemptUnknownTypeDeserialization: false, _reflectionTypeConverter, _typeDescriptor, YamlFormatter.Default, enumNamingConvention),
+ new EmitArrayNodeDeserializer(enumNamingConvention,_typeDescriptor),
new EmitGenericDictionaryNodeDeserializer(objectFactory),
new DictionaryNodeDeserializer(objectFactory, duplicateKeyChecking: true),
- new EmitGenericCollectionNodeDeserializer(objectFactory),
- new CollectionNodeDeserializer(objectFactory, NullNamingConvention.Instance),
+ new EmitGenericCollectionNodeDeserializer(objectFactory, enumNamingConvention,_typeDescriptor),
+ new CollectionNodeDeserializer(objectFactory, enumNamingConvention, _typeDescriptor),
new EnumerableNodeDeserializer(),
- new ExtensibleObjectNodeDeserializer(objectFactory, _typeDescriptor, ignoreUnmatched)
+ new ExtensibleObjectNodeDeserializer(objectFactory, _typeDescriptor, enumNamingConvention, ignoreUnmatched, caseInsensitivePropertyMatching),
];
_tagMappings = new Dictionary(PredefinedTagMappings);
TypeResolvers =
[
new TagNodeTypeResolver(_tagMappings),
new DefaultContainersNodeTypeResolver(),
- new ScalarYamlNodeTypeResolver()
+ new ScalarYamlNodeTypeResolver(),
];
- NodeValueDeserializer nodeValueDeserializer = new(NodeDeserializers, TypeResolvers, _reflectionTypeConverter, NullNamingConvention.Instance);
+ NodeValueDeserializer nodeValueDeserializer = new(NodeDeserializers, TypeResolvers, _reflectionTypeConverter, enumNamingConvention, _typeDescriptor);
if (ignoreNotFoundAnchor)
{
_valueDeserializer = new LooseAliasValueDeserializer(nodeValueDeserializer);
diff --git a/src/Docfx.YamlSerialization/YamlSerializer.cs b/src/Docfx.YamlSerialization/YamlSerializer.cs
index 4c2c6170481..22bc0001268 100644
--- a/src/Docfx.YamlSerialization/YamlSerializer.cs
+++ b/src/Docfx.YamlSerialization/YamlSerializer.cs
@@ -11,6 +11,7 @@
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.EventEmitters;
using YamlDotNet.Serialization.NamingConventions;
+using YamlDotNet.Serialization.ObjectFactories;
using YamlDotNet.Serialization.ObjectGraphVisitors;
using YamlDotNet.Serialization.TypeInspectors;
using YamlDotNet.Serialization.TypeResolvers;
@@ -23,11 +24,15 @@ public class YamlSerializer
private readonly SerializationOptions _options;
private readonly INamingConvention _namingConvention;
private readonly ITypeResolver _typeResolver;
+ private readonly ITypeInspector _typeDescriptor;
+ private readonly IObjectFactory _objectFactory;
+ private readonly Settings _settings;
- public YamlSerializer(SerializationOptions options = SerializationOptions.None, INamingConvention? namingConvention = null)
+ public YamlSerializer(SerializationOptions options = SerializationOptions.None, INamingConvention? namingConvention = null, Settings? settings = null)
{
_options = options;
_namingConvention = namingConvention ?? NullNamingConvention.Instance;
+ _settings = settings ?? new Settings();
Converters = new List();
foreach (IYamlTypeConverter yamlTypeConverter in YamlTypeConverters.BuiltInConverters)
@@ -38,6 +43,9 @@ public YamlSerializer(SerializationOptions options = SerializationOptions.None,
_typeResolver = IsOptionSet(SerializationOptions.DefaultToStaticType)
? new StaticTypeResolver()
: new DynamicTypeResolver();
+
+ _typeDescriptor = CreateTypeInspector();
+ _objectFactory = new DefaultObjectFactory();
}
private bool IsOptionSet(SerializationOptions option)
@@ -66,7 +74,7 @@ private void EmitDocument(IEmitter emitter, IObjectDescriptor graph)
emitter.Emit(new StreamStart());
emitter.Emit(new DocumentStart());
- traversalStrategy.Traverse(graph, emittingVisitor, emitter);
+ traversalStrategy.Traverse(graph, emittingVisitor, emitter, GetObjectSerializer(emitter));
emitter.Emit(new DocumentEnd(true));
emitter.Emit(new StreamEnd());
@@ -76,6 +84,8 @@ private IObjectGraphVisitor CreateEmittingVisitor(IEmitter emitter, IO
{
IObjectGraphVisitor emittingVisitor = new EmittingObjectGraphVisitor(eventEmitter);
+ emittingVisitor = new CustomSerializationObjectGraphVisitor(emittingVisitor, Converters, GetObjectSerializer(emitter));
+
void nestedObjectSerializer(object? v, Type? t = null) => SerializeValue(emitter, v, t);
emittingVisitor = new CustomSerializationObjectGraphVisitor(emittingVisitor, Converters, nestedObjectSerializer);
@@ -83,7 +93,8 @@ private IObjectGraphVisitor CreateEmittingVisitor(IEmitter emitter, IO
if (!IsOptionSet(SerializationOptions.DisableAliases))
{
var anchorAssigner = new AnchorAssigner(Converters);
- traversalStrategy.Traverse(graph, anchorAssigner, default);
+
+ traversalStrategy.Traverse(graph, anchorAssigner, default, GetObjectSerializer(emitter));
emittingVisitor = new AnchorAssigningObjectGraphVisitor(emittingVisitor, eventEmitter, anchorAssigner);
}
@@ -110,7 +121,12 @@ public void SerializeValue(IEmitter emitter, object? value, Type? type)
graph
);
- traversalStrategy.Traverse(graph, emittingVisitor, emitter);
+ traversalStrategy.Traverse(graph, emittingVisitor, emitter, GetObjectSerializer(emitter));
+ }
+
+ private ObjectSerializer GetObjectSerializer(IEmitter emitter)
+ {
+ return (object? v, Type? t = null) => SerializeValue(emitter, v, t);
}
private IEventEmitter CreateEventEmitter()
@@ -119,7 +135,7 @@ private IEventEmitter CreateEventEmitter()
if (IsOptionSet(SerializationOptions.JsonCompatible))
{
- return new JsonEventEmitter(writer, YamlFormatter.Default, NullNamingConvention.Instance);
+ return new JsonEventEmitter(writer, YamlFormatter.Default, NullNamingConvention.Instance, _typeDescriptor);
}
else
{
@@ -130,29 +146,28 @@ private IEventEmitter CreateEventEmitter()
quoteYaml1_1Strings: false,
defaultScalarStyle: ScalarStyle.Any,
formatter: YamlFormatter.Default,
- enumNamingConvention: NullNamingConvention.Instance);
+ enumNamingConvention: NullNamingConvention.Instance,
+ typeInspector: _typeDescriptor);
}
}
private IObjectGraphTraversalStrategy CreateTraversalStrategy()
+ {
+ return IsOptionSet(SerializationOptions.Roundtrip)
+ ? new RoundtripObjectGraphTraversalStrategy(Converters, this, _typeDescriptor, _typeResolver, 50, _namingConvention, _settings, _objectFactory)
+ : new FullObjectGraphTraversalStrategy(this, _typeDescriptor, _typeResolver, 50, _namingConvention, _objectFactory);
+ }
+
+ private ITypeInspector CreateTypeInspector()
{
ITypeInspector typeDescriptor = new EmitTypeInspector(_typeResolver);
if (IsOptionSet(SerializationOptions.Roundtrip))
- {
typeDescriptor = new ReadableAndWritablePropertiesTypeInspector(typeDescriptor);
- }
typeDescriptor = new NamingConventionTypeInspector(typeDescriptor, _namingConvention);
typeDescriptor = new YamlAttributesTypeInspector(typeDescriptor);
- if (IsOptionSet(SerializationOptions.Roundtrip))
- {
- return new RoundtripObjectGraphTraversalStrategy(this, typeDescriptor, _typeResolver, 50);
- }
- else
- {
- return new FullObjectGraphTraversalStrategy(this, typeDescriptor, _typeResolver, 50, _namingConvention);
- }
+ return typeDescriptor;
}
}
diff --git a/test/Docfx.Dotnet.Tests/XmlCommentUnitTest.cs b/test/Docfx.Dotnet.Tests/XmlCommentUnitTest.cs
index 0a2035f3daf..9906c514222 100644
--- a/test/Docfx.Dotnet.Tests/XmlCommentUnitTest.cs
+++ b/test/Docfx.Dotnet.Tests/XmlCommentUnitTest.cs
@@ -28,7 +28,8 @@ public static void ParaNewLine()
Assert.Equal(
"""
a
- b
c
+ b
+ c
""",
XmlComment.Parse("""
@@ -390,13 +391,14 @@ Classes in assemblies are by definition complete.
example
This is ref
a sample of exception node
-
-
public class XmlElement
- : XmlLinkedNode
- -
- word inside list->listItem->list->listItem->para.>
+
+
public class XmlElement
+ : XmlLinkedNode
+ -
+ word inside list->listItem->list->listItem->para.>
the second line.
- item2 in numbered list
- - item2 in bullet list
-
+
- item2 in bullet list
-
loose text not wrapped in description
""", remarks, ignoreLineEndingDifferences: true);
@@ -519,6 +521,7 @@ public void Issue9495()
Assert.Equal(
"""
options.UseRelativeLinks = true;
+
{
"type": "articles",
"id": "4309",
@@ -533,4 +536,45 @@ public void Issue9495()
}
""", comment.Examples[0], ignoreLineEndingDifferences: true);
}
+
+ [Fact]
+ public void Issue10385()
+ {
+ var comment = XmlComment.Parse(
+ """
+
+
+ Paragraph.
+
+
+ public sealed class Issue10385
+ {
+ public int AAA {get;set;}
+
+ public int BBB {get;set;}
+
+ public int CCC {get;set;}
+ }
+
+
+ """);
+ Assert.Equal(
+ """
+
+ Paragraph.
+
+
+ public sealed class Issue10385
+ {
+ public int AAA {get;set;}
+
+ public int BBB {get;set;}
+
+ public int CCC {get;set;}
+ }
+ """, comment.Remarks, ignoreLineEndingDifferences: true);
+ }
+
+
+
}
diff --git a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.html.view.verified.json b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.html.view.verified.json
new file mode 100644
index 00000000000..d0666050a9e
--- /dev/null
+++ b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.html.view.verified.json
@@ -0,0 +1,383 @@
+{
+ "uid": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": {
+ "uid": "BuildFromProject",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "href": "BuildFromProject.html",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": ""
+ },
+ {
+ "lang": "vb",
+ "value": ""
+ }
+ ],
+ "level": 0
+ },
+ "children": [
+ {
+ "inProperty": true,
+ "typePropertyName": "inProperty",
+ "id": "properties",
+ "children": [
+ {
+ "uid": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.UseRelativeLinks",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions",
+ "isExternal": false,
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "UseRelativeLinks"
+ },
+ {
+ "lang": "vb",
+ "value": "UseRelativeLinks"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions.UseRelativeLinks"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions.UseRelativeLinks"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.UseRelativeLinks"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.UseRelativeLinks"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": ""
+ },
+ {
+ "lang": "vb",
+ "value": ""
+ }
+ ],
+ "syntax": {
+ "content": [
+ {
+ "lang": "csharp",
+ "value": "bool UseRelativeLinks { get; }"
+ },
+ {
+ "lang": "vb",
+ "value": "ReadOnly Property UseRelativeLinks As Boolean"
+ }
+ ],
+ "parameters": [],
+ "return": null,
+ "propertyValue": {
+ "type": {
+ "uid": "System.Boolean",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "bool"
+ },
+ {
+ "lang": "vb",
+ "value": "Boolean"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "bool"
+ },
+ {
+ "lang": "vb",
+ "value": "Boolean"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "bool"
+ },
+ {
+ "lang": "vb",
+ "value": "Boolean"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": ""
+ },
+ {
+ "lang": "vb",
+ "value": ""
+ }
+ ]
+ }
+ }
+ },
+ "source": {
+ "remote": {
+ "path": "samples/seed/dotnet/project/Project/Inheritdoc.cs",
+ "branch": "main",
+ "repo": "https://github.com/dotnet/docfx"
+ },
+ "id": "UseRelativeLinks",
+ "path": "dotnet/project/Project/Inheritdoc.cs",
+ "startLine": 138,
+ "endLine": 0
+ },
+ "assemblies": [
+ "BuildFromProject"
+ ],
+ "namespace": "BuildFromProject",
+ "example": [
+ "options.UseRelativeLinks = true;
\n{\n \"type\": \"articles\",\n \"id\": \"4309\",\n \"relationships\": {\n \"author\": {\n \"links\": {\n \"self\": \"/api/shopping/articles/4309/relationships/author\",\n \"related\": \"/api/shopping/articles/4309/author\"\n }\n }\n }\n}
\n"
+ ],
+ "overload": {
+ "uid": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.UseRelativeLinks*",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "UseRelativeLinks"
+ },
+ {
+ "lang": "vb",
+ "value": "UseRelativeLinks"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions.UseRelativeLinks"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions.UseRelativeLinks"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.UseRelativeLinks"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.UseRelativeLinks"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": ""
+ },
+ {
+ "lang": "vb",
+ "value": ""
+ }
+ ],
+ "id": "BuildFromProject_Inheritdoc_Issue9736_IJsonApiOptions_UseRelativeLinks_"
+ },
+ "level": 0,
+ "type": "property",
+ "summary": "Whether to use relative links for all resources. false
by default.
\n",
+ "platform": null,
+ "docurl": "https://github.com/dotnet/docfx/new/main/apiSpec/new?filename=BuildFromProject_Inheritdoc_Issue9736_IJsonApiOptions_UseRelativeLinks.md&value=---%0Auid%3A%20BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.UseRelativeLinks%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A",
+ "sourceurl": "https://github.com/dotnet/docfx/blob/main/samples/seed/dotnet/project/Project/Inheritdoc.cs/#L139",
+ "description": "",
+ "remarks": "",
+ "conceptual": "",
+ "implements": "",
+ "seealso": [],
+ "id": "BuildFromProject_Inheritdoc_Issue9736_IJsonApiOptions_UseRelativeLinks",
+ "hideTitleType": false,
+ "hideSubtitle": false
+ }
+ ]
+ }
+ ],
+ "langs": [
+ "csharp",
+ "vb"
+ ],
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions"
+ }
+ ],
+ "type": "interface",
+ "source": {
+ "remote": {
+ "path": "samples/seed/dotnet/project/Project/Inheritdoc.cs",
+ "branch": "main",
+ "repo": "https://github.com/dotnet/docfx"
+ },
+ "id": "IJsonApiOptions",
+ "path": "dotnet/project/Project/Inheritdoc.cs",
+ "startLine": 114,
+ "endLine": 0
+ },
+ "assemblies": [
+ "BuildFromProject"
+ ],
+ "namespace": {
+ "uid": "BuildFromProject",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "href": "BuildFromProject.html",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": ""
+ },
+ {
+ "lang": "vb",
+ "value": ""
+ }
+ ],
+ "level": 0
+ },
+ "syntax": {
+ "content": [
+ {
+ "lang": "csharp",
+ "value": "public interface Inheritdoc.Issue9736.IJsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "Public Interface Inheritdoc.Issue9736.IJsonApiOptions"
+ }
+ ]
+ },
+ "level": 0,
+ "_appName": "Seed",
+ "_appTitle": "docfx seed website",
+ "_enableSearch": true,
+ "pdf": true,
+ "pdfTocPage": true,
+ "_key": "obj/api/BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.yml",
+ "_navKey": "~/toc.yml",
+ "_navPath": "toc.html",
+ "_navRel": "../toc.html",
+ "_path": "api/BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.html",
+ "_rel": "../",
+ "_tocKey": "~/obj/api/toc.yml",
+ "_tocPath": "api/toc.html",
+ "_tocRel": "toc.html",
+ "yamlmime": "ManagedReference",
+ "docurl": "https://github.com/dotnet/docfx/new/main/apiSpec/new?filename=BuildFromProject_Inheritdoc_Issue9736_IJsonApiOptions.md&value=---%0Auid%3A%20BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A",
+ "sourceurl": "https://github.com/dotnet/docfx/blob/main/samples/seed/dotnet/project/Project/Inheritdoc.cs/#L115",
+ "summary": "",
+ "description": "",
+ "remarks": "",
+ "conceptual": "",
+ "implements": "",
+ "example": "",
+ "seealso": [],
+ "id": "BuildFromProject_Inheritdoc_Issue9736_IJsonApiOptions",
+ "hideTitleType": false,
+ "hideSubtitle": false,
+ "isClass": true,
+ "inInterface": true,
+ "_disableToc": false,
+ "_disableNextArticle": true
+}
\ No newline at end of file
diff --git a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions.html.view.verified.json b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions.html.view.verified.json
new file mode 100644
index 00000000000..74afad733c6
--- /dev/null
+++ b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions.html.view.verified.json
@@ -0,0 +1,819 @@
+{
+ "uid": "BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": {
+ "uid": "BuildFromProject",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "href": "BuildFromProject.html",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": ""
+ },
+ {
+ "lang": "vb",
+ "value": ""
+ }
+ ],
+ "level": 0
+ },
+ "children": [
+ {
+ "inProperty": true,
+ "typePropertyName": "inProperty",
+ "id": "properties",
+ "children": [
+ {
+ "uid": "BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions.UseRelativeLinks",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": "BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions",
+ "isExternal": false,
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "UseRelativeLinks"
+ },
+ {
+ "lang": "vb",
+ "value": "UseRelativeLinks"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.JsonApiOptions.UseRelativeLinks"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.JsonApiOptions.UseRelativeLinks"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions.UseRelativeLinks"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions.UseRelativeLinks"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": ""
+ },
+ {
+ "lang": "vb",
+ "value": ""
+ }
+ ],
+ "syntax": {
+ "content": [
+ {
+ "lang": "csharp",
+ "value": "public bool UseRelativeLinks { get; set; }"
+ },
+ {
+ "lang": "vb",
+ "value": "Public Property UseRelativeLinks As Boolean"
+ }
+ ],
+ "parameters": [],
+ "return": null,
+ "propertyValue": {
+ "type": {
+ "uid": "System.Boolean",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "bool"
+ },
+ {
+ "lang": "vb",
+ "value": "Boolean"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "bool"
+ },
+ {
+ "lang": "vb",
+ "value": "Boolean"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "bool"
+ },
+ {
+ "lang": "vb",
+ "value": "Boolean"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": ""
+ },
+ {
+ "lang": "vb",
+ "value": ""
+ }
+ ]
+ }
+ }
+ },
+ "source": {
+ "remote": {
+ "path": "samples/seed/dotnet/project/Project/Inheritdoc.cs",
+ "branch": "main",
+ "repo": "https://github.com/dotnet/docfx"
+ },
+ "id": "UseRelativeLinks",
+ "path": "dotnet/project/Project/Inheritdoc.cs",
+ "startLine": 144,
+ "endLine": 0
+ },
+ "assemblies": [
+ "BuildFromProject"
+ ],
+ "namespace": "BuildFromProject",
+ "example": [
+ "options.UseRelativeLinks = true;
\n{\n \"type\": \"articles\",\n \"id\": \"4309\",\n \"relationships\": {\n \"author\": {\n \"links\": {\n \"self\": \"/api/shopping/articles/4309/relationships/author\",\n \"related\": \"/api/shopping/articles/4309/author\"\n }\n }\n }\n}
\n"
+ ],
+ "overload": {
+ "uid": "BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions.UseRelativeLinks*",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "UseRelativeLinks"
+ },
+ {
+ "lang": "vb",
+ "value": "UseRelativeLinks"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.JsonApiOptions.UseRelativeLinks"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.JsonApiOptions.UseRelativeLinks"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions.UseRelativeLinks"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions.UseRelativeLinks"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": ""
+ },
+ {
+ "lang": "vb",
+ "value": ""
+ }
+ ],
+ "id": "BuildFromProject_Inheritdoc_Issue9736_JsonApiOptions_UseRelativeLinks_"
+ },
+ "level": 0,
+ "implements": [
+ {
+ "uid": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.UseRelativeLinks",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "UseRelativeLinks"
+ },
+ {
+ "lang": "vb",
+ "value": "UseRelativeLinks"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions.UseRelativeLinks"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions.UseRelativeLinks"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.UseRelativeLinks"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.UseRelativeLinks"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": ""
+ },
+ {
+ "lang": "vb",
+ "value": ""
+ }
+ ]
+ }
+ ],
+ "type": "property",
+ "summary": "Whether to use relative links for all resources. false
by default.
\n",
+ "platform": null,
+ "docurl": "https://github.com/dotnet/docfx/new/main/apiSpec/new?filename=BuildFromProject_Inheritdoc_Issue9736_JsonApiOptions_UseRelativeLinks.md&value=---%0Auid%3A%20BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions.UseRelativeLinks%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A",
+ "sourceurl": "https://github.com/dotnet/docfx/blob/main/samples/seed/dotnet/project/Project/Inheritdoc.cs/#L145",
+ "description": "",
+ "remarks": "",
+ "conceptual": "",
+ "seealso": [],
+ "id": "BuildFromProject_Inheritdoc_Issue9736_JsonApiOptions_UseRelativeLinks",
+ "hideTitleType": false,
+ "hideSubtitle": false
+ }
+ ]
+ }
+ ],
+ "langs": [
+ "csharp",
+ "vb"
+ ],
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.JsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.JsonApiOptions"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.JsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.JsonApiOptions"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions"
+ }
+ ],
+ "type": "class",
+ "source": {
+ "remote": {
+ "path": "samples/seed/dotnet/project/Project/Inheritdoc.cs",
+ "branch": "main",
+ "repo": "https://github.com/dotnet/docfx"
+ },
+ "id": "JsonApiOptions",
+ "path": "dotnet/project/Project/Inheritdoc.cs",
+ "startLine": 141,
+ "endLine": 0
+ },
+ "assemblies": [
+ "BuildFromProject"
+ ],
+ "namespace": {
+ "uid": "BuildFromProject",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "href": "BuildFromProject.html",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": ""
+ },
+ {
+ "lang": "vb",
+ "value": ""
+ }
+ ],
+ "level": 0
+ },
+ "syntax": {
+ "content": [
+ {
+ "lang": "csharp",
+ "value": "public sealed class Inheritdoc.Issue9736.JsonApiOptions : Inheritdoc.Issue9736.IJsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "Public NotInheritable Class Inheritdoc.Issue9736.JsonApiOptions Implements Inheritdoc.Issue9736.IJsonApiOptions"
+ }
+ ]
+ },
+ "inheritance": [
+ {
+ "uid": "System.Object",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": "System",
+ "isExternal": true,
+ "href": "https://learn.microsoft.com/dotnet/api/system.object",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "object"
+ },
+ {
+ "lang": "vb",
+ "value": "Object"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "object"
+ },
+ {
+ "lang": "vb",
+ "value": "Object"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "object"
+ },
+ {
+ "lang": "vb",
+ "value": "Object"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": ""
+ },
+ {
+ "lang": "vb",
+ "value": ""
+ }
+ ],
+ "level": 0,
+ "index": 0
+ }
+ ],
+ "level": 1,
+ "implements": [
+ {
+ "uid": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions"
+ }
+ ]
+ }
+ ],
+ "inheritedMembers": [
+ {
+ "uid": "System.Object.Equals(System.Object)",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": "System.Object",
+ "isExternal": true,
+ "href": "https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "Equals(object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Equals(Object)"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "object.Equals(object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.Equals(Object)"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "object.Equals(object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.Equals(Object)"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": "Equals(object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Equals(Object)"
+ }
+ ],
+ "level": 0
+ },
+ {
+ "uid": "System.Object.Equals(System.Object,System.Object)",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": "System.Object",
+ "isExternal": true,
+ "href": "https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "Equals(object, object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Equals(Object, Object)"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "object.Equals(object, object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.Equals(Object, Object)"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "object.Equals(object, object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.Equals(Object, Object)"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": "Equals(object, object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Equals(Object, Object)"
+ }
+ ],
+ "level": 0
+ },
+ {
+ "uid": "System.Object.GetHashCode",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": "System.Object",
+ "isExternal": true,
+ "href": "https://learn.microsoft.com/dotnet/api/system.object.gethashcode",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "GetHashCode()"
+ },
+ {
+ "lang": "vb",
+ "value": "GetHashCode()"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "object.GetHashCode()"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.GetHashCode()"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "object.GetHashCode()"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.GetHashCode()"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": "GetHashCode()"
+ },
+ {
+ "lang": "vb",
+ "value": "GetHashCode()"
+ }
+ ],
+ "level": 0
+ },
+ {
+ "uid": "System.Object.GetType",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": "System.Object",
+ "isExternal": true,
+ "href": "https://learn.microsoft.com/dotnet/api/system.object.gettype",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "GetType()"
+ },
+ {
+ "lang": "vb",
+ "value": "GetType()"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "object.GetType()"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.GetType()"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "object.GetType()"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.GetType()"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": "GetType()"
+ },
+ {
+ "lang": "vb",
+ "value": "GetType()"
+ }
+ ],
+ "level": 0
+ },
+ {
+ "uid": "System.Object.ReferenceEquals(System.Object,System.Object)",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": "System.Object",
+ "isExternal": true,
+ "href": "https://learn.microsoft.com/dotnet/api/system.object.referenceequals",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "ReferenceEquals(object, object)"
+ },
+ {
+ "lang": "vb",
+ "value": "ReferenceEquals(Object, Object)"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "object.ReferenceEquals(object, object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.ReferenceEquals(Object, Object)"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "object.ReferenceEquals(object, object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.ReferenceEquals(Object, Object)"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": "ReferenceEquals(object, object)"
+ },
+ {
+ "lang": "vb",
+ "value": "ReferenceEquals(Object, Object)"
+ }
+ ],
+ "level": 0
+ },
+ {
+ "uid": "System.Object.ToString",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": "System.Object",
+ "isExternal": true,
+ "href": "https://learn.microsoft.com/dotnet/api/system.object.tostring",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "ToString()"
+ },
+ {
+ "lang": "vb",
+ "value": "ToString()"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "object.ToString()"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.ToString()"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "object.ToString()"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.ToString()"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": "ToString()"
+ },
+ {
+ "lang": "vb",
+ "value": "ToString()"
+ }
+ ],
+ "level": 0
+ }
+ ],
+ "_appName": "Seed",
+ "_appTitle": "docfx seed website",
+ "_enableSearch": true,
+ "pdf": true,
+ "pdfTocPage": true,
+ "_key": "obj/api/BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions.yml",
+ "_navKey": "~/toc.yml",
+ "_navPath": "toc.html",
+ "_navRel": "../toc.html",
+ "_path": "api/BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions.html",
+ "_rel": "../",
+ "_tocKey": "~/obj/api/toc.yml",
+ "_tocPath": "api/toc.html",
+ "_tocRel": "toc.html",
+ "yamlmime": "ManagedReference",
+ "docurl": "https://github.com/dotnet/docfx/new/main/apiSpec/new?filename=BuildFromProject_Inheritdoc_Issue9736_JsonApiOptions.md&value=---%0Auid%3A%20BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A",
+ "sourceurl": "https://github.com/dotnet/docfx/blob/main/samples/seed/dotnet/project/Project/Inheritdoc.cs/#L142",
+ "summary": "",
+ "description": "",
+ "remarks": "",
+ "conceptual": "",
+ "example": "",
+ "seealso": [],
+ "id": "BuildFromProject_Inheritdoc_Issue9736_JsonApiOptions",
+ "hideTitleType": false,
+ "hideSubtitle": false,
+ "isClass": true,
+ "inClass": true,
+ "_disableToc": false,
+ "_disableNextArticle": true
+}
\ No newline at end of file
diff --git a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/BuildFromProject.Inheritdoc.Issue9736.html.view.verified.json b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/BuildFromProject.Inheritdoc.Issue9736.html.view.verified.json
new file mode 100644
index 00000000000..6135a144323
--- /dev/null
+++ b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/BuildFromProject.Inheritdoc.Issue9736.html.view.verified.json
@@ -0,0 +1,590 @@
+{
+ "uid": "BuildFromProject.Inheritdoc.Issue9736",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": {
+ "uid": "BuildFromProject",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "href": "BuildFromProject.html",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": ""
+ },
+ {
+ "lang": "vb",
+ "value": ""
+ }
+ ],
+ "level": 0
+ },
+ "children": [],
+ "langs": [
+ "csharp",
+ "vb"
+ ],
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject.Inheritdoc.Issue9736"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject.Inheritdoc.Issue9736"
+ }
+ ],
+ "type": "class",
+ "source": {
+ "remote": {
+ "path": "samples/seed/dotnet/project/Project/Inheritdoc.cs",
+ "branch": "main",
+ "repo": "https://github.com/dotnet/docfx"
+ },
+ "id": "Issue9736",
+ "path": "dotnet/project/Project/Inheritdoc.cs",
+ "startLine": 112,
+ "endLine": 0
+ },
+ "assemblies": [
+ "BuildFromProject"
+ ],
+ "namespace": {
+ "uid": "BuildFromProject",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "href": "BuildFromProject.html",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": ""
+ },
+ {
+ "lang": "vb",
+ "value": ""
+ }
+ ],
+ "level": 0
+ },
+ "syntax": {
+ "content": [
+ {
+ "lang": "csharp",
+ "value": "public class Inheritdoc.Issue9736"
+ },
+ {
+ "lang": "vb",
+ "value": "Public Class Inheritdoc.Issue9736"
+ }
+ ]
+ },
+ "inheritance": [
+ {
+ "uid": "System.Object",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": "System",
+ "isExternal": true,
+ "href": "https://learn.microsoft.com/dotnet/api/system.object",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "object"
+ },
+ {
+ "lang": "vb",
+ "value": "Object"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "object"
+ },
+ {
+ "lang": "vb",
+ "value": "Object"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "object"
+ },
+ {
+ "lang": "vb",
+ "value": "Object"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": ""
+ },
+ {
+ "lang": "vb",
+ "value": ""
+ }
+ ],
+ "level": 0,
+ "index": 0
+ }
+ ],
+ "level": 1,
+ "inheritedMembers": [
+ {
+ "uid": "System.Object.Equals(System.Object)",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": "System.Object",
+ "isExternal": true,
+ "href": "https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "Equals(object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Equals(Object)"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "object.Equals(object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.Equals(Object)"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "object.Equals(object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.Equals(Object)"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": "Equals(object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Equals(Object)"
+ }
+ ],
+ "level": 0
+ },
+ {
+ "uid": "System.Object.Equals(System.Object,System.Object)",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": "System.Object",
+ "isExternal": true,
+ "href": "https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "Equals(object, object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Equals(Object, Object)"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "object.Equals(object, object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.Equals(Object, Object)"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "object.Equals(object, object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.Equals(Object, Object)"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": "Equals(object, object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Equals(Object, Object)"
+ }
+ ],
+ "level": 0
+ },
+ {
+ "uid": "System.Object.GetHashCode",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": "System.Object",
+ "isExternal": true,
+ "href": "https://learn.microsoft.com/dotnet/api/system.object.gethashcode",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "GetHashCode()"
+ },
+ {
+ "lang": "vb",
+ "value": "GetHashCode()"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "object.GetHashCode()"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.GetHashCode()"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "object.GetHashCode()"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.GetHashCode()"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": "GetHashCode()"
+ },
+ {
+ "lang": "vb",
+ "value": "GetHashCode()"
+ }
+ ],
+ "level": 0
+ },
+ {
+ "uid": "System.Object.GetType",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": "System.Object",
+ "isExternal": true,
+ "href": "https://learn.microsoft.com/dotnet/api/system.object.gettype",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "GetType()"
+ },
+ {
+ "lang": "vb",
+ "value": "GetType()"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "object.GetType()"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.GetType()"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "object.GetType()"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.GetType()"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": "GetType()"
+ },
+ {
+ "lang": "vb",
+ "value": "GetType()"
+ }
+ ],
+ "level": 0
+ },
+ {
+ "uid": "System.Object.MemberwiseClone",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": "System.Object",
+ "isExternal": true,
+ "href": "https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "MemberwiseClone()"
+ },
+ {
+ "lang": "vb",
+ "value": "MemberwiseClone()"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "object.MemberwiseClone()"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.MemberwiseClone()"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "object.MemberwiseClone()"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.MemberwiseClone()"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": "MemberwiseClone()"
+ },
+ {
+ "lang": "vb",
+ "value": "MemberwiseClone()"
+ }
+ ],
+ "level": 0
+ },
+ {
+ "uid": "System.Object.ReferenceEquals(System.Object,System.Object)",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": "System.Object",
+ "isExternal": true,
+ "href": "https://learn.microsoft.com/dotnet/api/system.object.referenceequals",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "ReferenceEquals(object, object)"
+ },
+ {
+ "lang": "vb",
+ "value": "ReferenceEquals(Object, Object)"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "object.ReferenceEquals(object, object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.ReferenceEquals(Object, Object)"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "object.ReferenceEquals(object, object)"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.ReferenceEquals(Object, Object)"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": "ReferenceEquals(object, object)"
+ },
+ {
+ "lang": "vb",
+ "value": "ReferenceEquals(Object, Object)"
+ }
+ ],
+ "level": 0
+ },
+ {
+ "uid": "System.Object.ToString",
+ "isEii": false,
+ "isExtensionMethod": false,
+ "parent": "System.Object",
+ "isExternal": true,
+ "href": "https://learn.microsoft.com/dotnet/api/system.object.tostring",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "ToString()"
+ },
+ {
+ "lang": "vb",
+ "value": "ToString()"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "object.ToString()"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.ToString()"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "object.ToString()"
+ },
+ {
+ "lang": "vb",
+ "value": "Object.ToString()"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": "ToString()"
+ },
+ {
+ "lang": "vb",
+ "value": "ToString()"
+ }
+ ],
+ "level": 0
+ }
+ ],
+ "_appName": "Seed",
+ "_appTitle": "docfx seed website",
+ "_enableSearch": true,
+ "pdf": true,
+ "pdfTocPage": true,
+ "_key": "obj/api/BuildFromProject.Inheritdoc.Issue9736.yml",
+ "_navKey": "~/toc.yml",
+ "_navPath": "toc.html",
+ "_navRel": "../toc.html",
+ "_path": "api/BuildFromProject.Inheritdoc.Issue9736.html",
+ "_rel": "../",
+ "_tocKey": "~/obj/api/toc.yml",
+ "_tocPath": "api/toc.html",
+ "_tocRel": "toc.html",
+ "yamlmime": "ManagedReference",
+ "docurl": "https://github.com/dotnet/docfx/new/main/apiSpec/new?filename=BuildFromProject_Inheritdoc_Issue9736.md&value=---%0Auid%3A%20BuildFromProject.Inheritdoc.Issue9736%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A",
+ "sourceurl": "https://github.com/dotnet/docfx/blob/main/samples/seed/dotnet/project/Project/Inheritdoc.cs/#L113",
+ "summary": "",
+ "description": "",
+ "remarks": "",
+ "conceptual": "",
+ "implements": "",
+ "example": "",
+ "seealso": [],
+ "id": "BuildFromProject_Inheritdoc_Issue9736",
+ "hideTitleType": false,
+ "hideSubtitle": false,
+ "isClass": true,
+ "inClass": true,
+ "_disableToc": false,
+ "_disableNextArticle": true
+}
\ No newline at end of file
diff --git a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/BuildFromProject.html.view.verified.json b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/BuildFromProject.html.view.verified.json
index 329625210cb..4817e7b3dc4 100644
--- a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/BuildFromProject.html.view.verified.json
+++ b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/BuildFromProject.html.view.verified.json
@@ -854,6 +854,130 @@
"hideTitleType": false,
"hideSubtitle": false
},
+ {
+ "uid": "BuildFromProject.Inheritdoc.Issue9736",
+ "isExtensionMethod": false,
+ "href": "BuildFromProject.Inheritdoc.html",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject.Inheritdoc.Issue9736"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject.Inheritdoc.Issue9736"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736"
+ }
+ ],
+ "level": 0,
+ "summary": "",
+ "type": "class",
+ "platform": null,
+ "isEii": false,
+ "docurl": "",
+ "sourceurl": "",
+ "description": "",
+ "remarks": "",
+ "conceptual": "",
+ "syntax": "",
+ "implements": "",
+ "example": "",
+ "seealso": [],
+ "id": "BuildFromProject_Inheritdoc_Issue9736",
+ "hideTitleType": false,
+ "hideSubtitle": false
+ },
+ {
+ "uid": "BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions",
+ "isExtensionMethod": false,
+ "href": "BuildFromProject.Inheritdoc.html",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.JsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.JsonApiOptions"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.JsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.JsonApiOptions"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.JsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.JsonApiOptions"
+ }
+ ],
+ "level": 0,
+ "summary": "",
+ "type": "class",
+ "platform": null,
+ "isEii": false,
+ "docurl": "",
+ "sourceurl": "",
+ "description": "",
+ "remarks": "",
+ "conceptual": "",
+ "syntax": "",
+ "implements": "",
+ "example": "",
+ "seealso": [],
+ "id": "BuildFromProject_Inheritdoc_Issue9736_JsonApiOptions",
+ "hideTitleType": false,
+ "hideSubtitle": false
+ },
{
"uid": "BuildFromProject.Issue8725",
"isExtensionMethod": false,
@@ -1117,6 +1241,69 @@
"id": "BuildFromProject_IInheritdoc",
"hideTitleType": false,
"hideSubtitle": false
+ },
+ {
+ "uid": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions",
+ "isExtensionMethod": false,
+ "parent": "BuildFromProject",
+ "href": "BuildFromProject.Inheritdoc.html",
+ "name": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions"
+ }
+ ],
+ "nameWithType": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions"
+ }
+ ],
+ "fullName": [
+ {
+ "lang": "csharp",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions"
+ }
+ ],
+ "specName": [
+ {
+ "lang": "csharp",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions"
+ },
+ {
+ "lang": "vb",
+ "value": "Inheritdoc.Issue9736.IJsonApiOptions"
+ }
+ ],
+ "level": 0,
+ "summary": "",
+ "type": "interface",
+ "platform": null,
+ "isEii": false,
+ "docurl": "",
+ "sourceurl": "",
+ "description": "",
+ "remarks": "",
+ "conceptual": "",
+ "syntax": "",
+ "implements": "",
+ "example": "",
+ "seealso": [],
+ "id": "BuildFromProject_Inheritdoc_Issue9736_IJsonApiOptions",
+ "hideTitleType": false,
+ "hideSubtitle": false
}
]
},
diff --git a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/CatLibrary.ICatExtension.html.view.verified.json b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/CatLibrary.ICatExtension.html.view.verified.json
index f750baa946d..9c053f9081b 100644
--- a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/CatLibrary.ICatExtension.html.view.verified.json
+++ b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/CatLibrary.ICatExtension.html.view.verified.json
@@ -612,7 +612,7 @@
],
"level": 0
},
- "summary": "It's the class that contains ICat interface's extension method.
\nThis class must be public and static.
Also it shouldn't be a geneic class
\n",
+ "summary": "It's the class that contains ICat interface's extension method.
\nThis class must be public and static.
\nAlso it shouldn't be a geneic class
\n",
"example": [],
"syntax": {
"content": [
@@ -1041,7 +1041,7 @@
"yamlmime": "ManagedReference",
"docurl": "https://github.com/dotnet/docfx/new/main/apiSpec/new?filename=CatLibrary_ICatExtension.md&value=---%0Auid%3A%20CatLibrary.ICatExtension%0Asummary%3A%20'*You%20can%20override%20summary%20for%20the%20API%20here%20using%20*MARKDOWN*%20syntax'%0A---%0A%0A*Please%20type%20below%20more%20information%20about%20this%20API%3A*%0A%0A",
"sourceurl": "https://github.com/dotnet/docfx/blob/main/samples/seed/dotnet/solution/CatLibrary/Class1.cs/#L333",
- "description": "It's the class that contains ICat interface's extension method. This class must be public and static.Also it shouldn't be a geneic class",
+ "description": "It's the class that contains ICat interface's extension method. This class must be public and static. Also it shouldn't be a geneic class",
"remarks": "",
"conceptual": "",
"implements": "",
diff --git a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/CatLibrary.html.view.verified.json b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/CatLibrary.html.view.verified.json
index 2c984888109..94eb058cb00 100644
--- a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/CatLibrary.html.view.verified.json
+++ b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/CatLibrary.html.view.verified.json
@@ -310,7 +310,7 @@
}
],
"level": 0,
- "summary": "It's the class that contains ICat interface's extension method.
\nThis class must be public and static.
Also it shouldn't be a geneic class
\n",
+ "summary": "It's the class that contains ICat interface's extension method.
\nThis class must be public and static.
\nAlso it shouldn't be a geneic class
\n",
"type": "class",
"platform": null,
"isEii": false,
diff --git a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/toc.html.view.verified.json b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/toc.html.view.verified.json
index 63d9153bd40..5e35a908255 100644
--- a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/toc.html.view.verified.json
+++ b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/toc.html.view.verified.json
@@ -305,6 +305,39 @@
"items": [],
"leaf": true
},
+ {
+ "name": "Inheritdoc.Issue9736",
+ "href": "BuildFromProject.Inheritdoc.Issue9736.html",
+ "topicHref": "BuildFromProject.Inheritdoc.Issue9736.html",
+ "topicUid": "BuildFromProject.Inheritdoc.Issue9736",
+ "type": "Class",
+ "tocHref": null,
+ "level": 3,
+ "items": [],
+ "leaf": true
+ },
+ {
+ "name": "Inheritdoc.Issue9736.IJsonApiOptions",
+ "href": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.html",
+ "topicHref": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.html",
+ "topicUid": "BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions",
+ "type": "Interface",
+ "tocHref": null,
+ "level": 3,
+ "items": [],
+ "leaf": true
+ },
+ {
+ "name": "Inheritdoc.Issue9736.JsonApiOptions",
+ "href": "BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions.html",
+ "topicHref": "BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions.html",
+ "topicUid": "BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions",
+ "type": "Class",
+ "tocHref": null,
+ "level": 3,
+ "items": [],
+ "leaf": true
+ },
{
"name": "Issue8725",
"href": "BuildFromProject.Issue8725.html",
diff --git a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/toc.json.view.verified.json b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/toc.json.view.verified.json
index 89685ab92af..28e8e4ff916 100644
--- a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/toc.json.view.verified.json
+++ b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/toc.json.view.verified.json
@@ -1,3 +1,3 @@
{
- "content": "{\"order\":100,\"items\":[{\"name\":\"BuildFromAssembly\",\"href\":\"BuildFromAssembly.html\",\"topicHref\":\"BuildFromAssembly.html\",\"topicUid\":\"BuildFromAssembly\",\"type\":\"Namespace\",\"items\":[{\"name\":\"Class1\",\"href\":\"BuildFromAssembly.Class1.html\",\"topicHref\":\"BuildFromAssembly.Class1.html\",\"topicUid\":\"BuildFromAssembly.Class1\",\"type\":\"Class\"},{\"name\":\"Issue5432\",\"href\":\"BuildFromAssembly.Issue5432.html\",\"topicHref\":\"BuildFromAssembly.Issue5432.html\",\"topicUid\":\"BuildFromAssembly.Issue5432\",\"type\":\"Struct\"}]},{\"name\":\"BuildFromCSharpSourceCode\",\"href\":\"BuildFromCSharpSourceCode.html\",\"topicHref\":\"BuildFromCSharpSourceCode.html\",\"topicUid\":\"BuildFromCSharpSourceCode\",\"type\":\"Namespace\",\"items\":[{\"name\":\"CSharp\",\"href\":\"BuildFromCSharpSourceCode.CSharp.html\",\"topicHref\":\"BuildFromCSharpSourceCode.CSharp.html\",\"topicUid\":\"BuildFromCSharpSourceCode.CSharp\",\"type\":\"Class\"}]},{\"name\":\"BuildFromProject\",\"href\":\"BuildFromProject.html\",\"topicHref\":\"BuildFromProject.html\",\"topicUid\":\"BuildFromProject\",\"type\":\"Namespace\",\"items\":[{\"name\":\"Issue8540\",\"href\":\"BuildFromProject.Issue8540.html\",\"topicHref\":\"BuildFromProject.Issue8540.html\",\"topicUid\":\"BuildFromProject.Issue8540\",\"type\":\"Namespace\",\"items\":[{\"name\":\"A\",\"href\":\"BuildFromProject.Issue8540.A.html\",\"topicHref\":\"BuildFromProject.Issue8540.A.html\",\"topicUid\":\"BuildFromProject.Issue8540.A\",\"type\":\"Namespace\",\"items\":[{\"name\":\"A\",\"href\":\"BuildFromProject.Issue8540.A.A.html\",\"topicHref\":\"BuildFromProject.Issue8540.A.A.html\",\"topicUid\":\"BuildFromProject.Issue8540.A.A\",\"type\":\"Class\"}]},{\"name\":\"B\",\"href\":\"BuildFromProject.Issue8540.B.html\",\"topicHref\":\"BuildFromProject.Issue8540.B.html\",\"topicUid\":\"BuildFromProject.Issue8540.B\",\"type\":\"Namespace\",\"items\":[{\"name\":\"B\",\"href\":\"BuildFromProject.Issue8540.B.B.html\",\"topicHref\":\"BuildFromProject.Issue8540.B.B.html\",\"topicUid\":\"BuildFromProject.Issue8540.B.B\",\"type\":\"Class\"}]}]},{\"name\":\"Class1\",\"href\":\"BuildFromProject.Class1.html\",\"topicHref\":\"BuildFromProject.Class1.html\",\"topicUid\":\"BuildFromProject.Class1\",\"type\":\"Class\"},{\"name\":\"Class1.IIssue8948\",\"href\":\"BuildFromProject.Class1.IIssue8948.html\",\"topicHref\":\"BuildFromProject.Class1.IIssue8948.html\",\"topicUid\":\"BuildFromProject.Class1.IIssue8948\",\"type\":\"Interface\"},{\"name\":\"Class1.Issue8665\",\"href\":\"BuildFromProject.Class1.Issue8665.html\",\"topicHref\":\"BuildFromProject.Class1.Issue8665.html\",\"topicUid\":\"BuildFromProject.Class1.Issue8665\",\"type\":\"Class\"},{\"name\":\"Class1.Issue8696Attribute\",\"href\":\"BuildFromProject.Class1.Issue8696Attribute.html\",\"topicHref\":\"BuildFromProject.Class1.Issue8696Attribute.html\",\"topicUid\":\"BuildFromProject.Class1.Issue8696Attribute\",\"type\":\"Class\"},{\"name\":\"Class1.Issue8948\",\"href\":\"BuildFromProject.Class1.Issue8948.html\",\"topicHref\":\"BuildFromProject.Class1.Issue8948.html\",\"topicUid\":\"BuildFromProject.Class1.Issue8948\",\"type\":\"Class\"},{\"name\":\"Class1.Issue9260\",\"href\":\"BuildFromProject.Class1.Issue9260.html\",\"topicHref\":\"BuildFromProject.Class1.Issue9260.html\",\"topicUid\":\"BuildFromProject.Class1.Issue9260\",\"type\":\"Enum\"},{\"name\":\"Class1.Test\",\"href\":\"BuildFromProject.Class1.Test-1.html\",\"topicHref\":\"BuildFromProject.Class1.Test-1.html\",\"topicUid\":\"BuildFromProject.Class1.Test`1\",\"type\":\"Class\"},{\"name\":\"Dog\",\"href\":\"BuildFromProject.Dog.html\",\"topicHref\":\"BuildFromProject.Dog.html\",\"topicUid\":\"BuildFromProject.Dog\",\"type\":\"Class\"},{\"name\":\"IInheritdoc\",\"href\":\"BuildFromProject.IInheritdoc.html\",\"topicHref\":\"BuildFromProject.IInheritdoc.html\",\"topicUid\":\"BuildFromProject.IInheritdoc\",\"type\":\"Interface\"},{\"name\":\"Inheritdoc\",\"href\":\"BuildFromProject.Inheritdoc.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.html\",\"topicUid\":\"BuildFromProject.Inheritdoc\",\"type\":\"Class\"},{\"name\":\"Inheritdoc.Issue6366\",\"href\":\"BuildFromProject.Inheritdoc.Issue6366.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.Issue6366.html\",\"topicUid\":\"BuildFromProject.Inheritdoc.Issue6366\",\"type\":\"Class\"},{\"name\":\"Inheritdoc.Issue6366.Class1\",\"href\":\"BuildFromProject.Inheritdoc.Issue6366.Class1-1.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.Issue6366.Class1-1.html\",\"topicUid\":\"BuildFromProject.Inheritdoc.Issue6366.Class1`1\",\"type\":\"Class\"},{\"name\":\"Inheritdoc.Issue6366.Class2\",\"href\":\"BuildFromProject.Inheritdoc.Issue6366.Class2.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.Issue6366.Class2.html\",\"topicUid\":\"BuildFromProject.Inheritdoc.Issue6366.Class2\",\"type\":\"Class\"},{\"name\":\"Inheritdoc.Issue7035\",\"href\":\"BuildFromProject.Inheritdoc.Issue7035.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.Issue7035.html\",\"topicUid\":\"BuildFromProject.Inheritdoc.Issue7035\",\"type\":\"Class\"},{\"name\":\"Inheritdoc.Issue7484\",\"href\":\"BuildFromProject.Inheritdoc.Issue7484.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.Issue7484.html\",\"topicUid\":\"BuildFromProject.Inheritdoc.Issue7484\",\"type\":\"Class\"},{\"name\":\"Inheritdoc.Issue8101\",\"href\":\"BuildFromProject.Inheritdoc.Issue8101.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.Issue8101.html\",\"topicUid\":\"BuildFromProject.Inheritdoc.Issue8101\",\"type\":\"Class\"},{\"name\":\"Inheritdoc.Issue8129\",\"href\":\"BuildFromProject.Inheritdoc.Issue8129.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.Issue8129.html\",\"topicUid\":\"BuildFromProject.Inheritdoc.Issue8129\",\"type\":\"Struct\"},{\"name\":\"Issue8725\",\"href\":\"BuildFromProject.Issue8725.html\",\"topicHref\":\"BuildFromProject.Issue8725.html\",\"topicUid\":\"BuildFromProject.Issue8725\",\"type\":\"Class\"}]},{\"name\":\"BuildFromVBSourceCode\",\"href\":\"BuildFromVBSourceCode.html\",\"topicHref\":\"BuildFromVBSourceCode.html\",\"topicUid\":\"BuildFromVBSourceCode\",\"type\":\"Namespace\",\"items\":[{\"name\":\"BaseClass1\",\"href\":\"BuildFromVBSourceCode.BaseClass1.html\",\"topicHref\":\"BuildFromVBSourceCode.BaseClass1.html\",\"topicUid\":\"BuildFromVBSourceCode.BaseClass1\",\"type\":\"Class\"},{\"name\":\"Class1\",\"href\":\"BuildFromVBSourceCode.Class1.html\",\"topicHref\":\"BuildFromVBSourceCode.Class1.html\",\"topicUid\":\"BuildFromVBSourceCode.Class1\",\"type\":\"Class\"}]},{\"name\":\"CatLibrary\",\"href\":\"CatLibrary.html\",\"topicHref\":\"CatLibrary.html\",\"topicUid\":\"CatLibrary\",\"type\":\"Namespace\",\"items\":[{\"name\":\"Core\",\"href\":\"CatLibrary.Core.html\",\"topicHref\":\"CatLibrary.Core.html\",\"topicUid\":\"CatLibrary.Core\",\"type\":\"Namespace\",\"items\":[{\"name\":\"ContainersRefType\",\"href\":\"CatLibrary.Core.ContainersRefType.html\",\"topicHref\":\"CatLibrary.Core.ContainersRefType.html\",\"topicUid\":\"CatLibrary.Core.ContainersRefType\",\"type\":\"Struct\"},{\"name\":\"ContainersRefType.ColorType\",\"href\":\"CatLibrary.Core.ContainersRefType.ColorType.html\",\"topicHref\":\"CatLibrary.Core.ContainersRefType.ColorType.html\",\"topicUid\":\"CatLibrary.Core.ContainersRefType.ColorType\",\"type\":\"Enum\"},{\"name\":\"ContainersRefType.ContainersRefTypeChild\",\"href\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeChild.html\",\"topicHref\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeChild.html\",\"topicUid\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeChild\",\"type\":\"Class\"},{\"name\":\"ContainersRefType.ContainersRefTypeChildInterface\",\"href\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeChildInterface.html\",\"topicHref\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeChildInterface.html\",\"topicUid\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeChildInterface\",\"type\":\"Interface\"},{\"name\":\"ContainersRefType.ContainersRefTypeDelegate\",\"href\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeDelegate.html\",\"topicHref\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeDelegate.html\",\"topicUid\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeDelegate\",\"type\":\"Delegate\"},{\"name\":\"ExplicitLayoutClass\",\"href\":\"CatLibrary.Core.ExplicitLayoutClass.html\",\"topicHref\":\"CatLibrary.Core.ExplicitLayoutClass.html\",\"topicUid\":\"CatLibrary.Core.ExplicitLayoutClass\",\"type\":\"Class\"},{\"name\":\"Issue231\",\"href\":\"CatLibrary.Core.Issue231.html\",\"topicHref\":\"CatLibrary.Core.Issue231.html\",\"topicUid\":\"CatLibrary.Core.Issue231\",\"type\":\"Class\"}]},{\"name\":\"CatException\",\"href\":\"CatLibrary.CatException-1.html\",\"topicHref\":\"CatLibrary.CatException-1.html\",\"topicUid\":\"CatLibrary.CatException`1\",\"type\":\"Class\"},{\"name\":\"Cat\",\"href\":\"CatLibrary.Cat-2.html\",\"topicHref\":\"CatLibrary.Cat-2.html\",\"topicUid\":\"CatLibrary.Cat`2\",\"type\":\"Class\"},{\"name\":\"Complex\",\"href\":\"CatLibrary.Complex-2.html\",\"topicHref\":\"CatLibrary.Complex-2.html\",\"topicUid\":\"CatLibrary.Complex`2\",\"type\":\"Class\"},{\"name\":\"FakeDelegate\",\"href\":\"CatLibrary.FakeDelegate-1.html\",\"topicHref\":\"CatLibrary.FakeDelegate-1.html\",\"topicUid\":\"CatLibrary.FakeDelegate`1\",\"type\":\"Delegate\"},{\"name\":\"IAnimal\",\"href\":\"CatLibrary.IAnimal.html\",\"topicHref\":\"CatLibrary.IAnimal.html\",\"topicUid\":\"CatLibrary.IAnimal\",\"type\":\"Interface\"},{\"name\":\"ICat\",\"href\":\"CatLibrary.ICat.html\",\"topicHref\":\"CatLibrary.ICat.html\",\"topicUid\":\"CatLibrary.ICat\",\"type\":\"Interface\"},{\"name\":\"ICatExtension\",\"href\":\"CatLibrary.ICatExtension.html\",\"topicHref\":\"CatLibrary.ICatExtension.html\",\"topicUid\":\"CatLibrary.ICatExtension\",\"type\":\"Class\"},{\"name\":\"MRefDelegate\",\"href\":\"CatLibrary.MRefDelegate-3.html\",\"topicHref\":\"CatLibrary.MRefDelegate-3.html\",\"topicUid\":\"CatLibrary.MRefDelegate`3\",\"type\":\"Delegate\"},{\"name\":\"MRefNormalDelegate\",\"href\":\"CatLibrary.MRefNormalDelegate.html\",\"topicHref\":\"CatLibrary.MRefNormalDelegate.html\",\"topicUid\":\"CatLibrary.MRefNormalDelegate\",\"type\":\"Delegate\"},{\"name\":\"Tom\",\"href\":\"CatLibrary.Tom.html\",\"topicHref\":\"CatLibrary.Tom.html\",\"topicUid\":\"CatLibrary.Tom\",\"type\":\"Class\"},{\"name\":\"TomFromBaseClass\",\"href\":\"CatLibrary.TomFromBaseClass.html\",\"topicHref\":\"CatLibrary.TomFromBaseClass.html\",\"topicUid\":\"CatLibrary.TomFromBaseClass\",\"type\":\"Class\"}]},{\"name\":\"MRef.Demo.Enumeration\",\"href\":\"MRef.Demo.Enumeration.html\",\"topicHref\":\"MRef.Demo.Enumeration.html\",\"topicUid\":\"MRef.Demo.Enumeration\",\"type\":\"Namespace\",\"items\":[{\"name\":\"ColorType\",\"href\":\"MRef.Demo.Enumeration.ColorType.html\",\"topicHref\":\"MRef.Demo.Enumeration.ColorType.html\",\"topicUid\":\"MRef.Demo.Enumeration.ColorType\",\"type\":\"Enum\"}]}],\"memberLayout\":\"SamePage\",\"pdf\":true,\"pdfTocPage\":true}"
+ "content": "{\"order\":100,\"items\":[{\"name\":\"BuildFromAssembly\",\"href\":\"BuildFromAssembly.html\",\"topicHref\":\"BuildFromAssembly.html\",\"topicUid\":\"BuildFromAssembly\",\"type\":\"Namespace\",\"items\":[{\"name\":\"Class1\",\"href\":\"BuildFromAssembly.Class1.html\",\"topicHref\":\"BuildFromAssembly.Class1.html\",\"topicUid\":\"BuildFromAssembly.Class1\",\"type\":\"Class\"},{\"name\":\"Issue5432\",\"href\":\"BuildFromAssembly.Issue5432.html\",\"topicHref\":\"BuildFromAssembly.Issue5432.html\",\"topicUid\":\"BuildFromAssembly.Issue5432\",\"type\":\"Struct\"}]},{\"name\":\"BuildFromCSharpSourceCode\",\"href\":\"BuildFromCSharpSourceCode.html\",\"topicHref\":\"BuildFromCSharpSourceCode.html\",\"topicUid\":\"BuildFromCSharpSourceCode\",\"type\":\"Namespace\",\"items\":[{\"name\":\"CSharp\",\"href\":\"BuildFromCSharpSourceCode.CSharp.html\",\"topicHref\":\"BuildFromCSharpSourceCode.CSharp.html\",\"topicUid\":\"BuildFromCSharpSourceCode.CSharp\",\"type\":\"Class\"}]},{\"name\":\"BuildFromProject\",\"href\":\"BuildFromProject.html\",\"topicHref\":\"BuildFromProject.html\",\"topicUid\":\"BuildFromProject\",\"type\":\"Namespace\",\"items\":[{\"name\":\"Issue8540\",\"href\":\"BuildFromProject.Issue8540.html\",\"topicHref\":\"BuildFromProject.Issue8540.html\",\"topicUid\":\"BuildFromProject.Issue8540\",\"type\":\"Namespace\",\"items\":[{\"name\":\"A\",\"href\":\"BuildFromProject.Issue8540.A.html\",\"topicHref\":\"BuildFromProject.Issue8540.A.html\",\"topicUid\":\"BuildFromProject.Issue8540.A\",\"type\":\"Namespace\",\"items\":[{\"name\":\"A\",\"href\":\"BuildFromProject.Issue8540.A.A.html\",\"topicHref\":\"BuildFromProject.Issue8540.A.A.html\",\"topicUid\":\"BuildFromProject.Issue8540.A.A\",\"type\":\"Class\"}]},{\"name\":\"B\",\"href\":\"BuildFromProject.Issue8540.B.html\",\"topicHref\":\"BuildFromProject.Issue8540.B.html\",\"topicUid\":\"BuildFromProject.Issue8540.B\",\"type\":\"Namespace\",\"items\":[{\"name\":\"B\",\"href\":\"BuildFromProject.Issue8540.B.B.html\",\"topicHref\":\"BuildFromProject.Issue8540.B.B.html\",\"topicUid\":\"BuildFromProject.Issue8540.B.B\",\"type\":\"Class\"}]}]},{\"name\":\"Class1\",\"href\":\"BuildFromProject.Class1.html\",\"topicHref\":\"BuildFromProject.Class1.html\",\"topicUid\":\"BuildFromProject.Class1\",\"type\":\"Class\"},{\"name\":\"Class1.IIssue8948\",\"href\":\"BuildFromProject.Class1.IIssue8948.html\",\"topicHref\":\"BuildFromProject.Class1.IIssue8948.html\",\"topicUid\":\"BuildFromProject.Class1.IIssue8948\",\"type\":\"Interface\"},{\"name\":\"Class1.Issue8665\",\"href\":\"BuildFromProject.Class1.Issue8665.html\",\"topicHref\":\"BuildFromProject.Class1.Issue8665.html\",\"topicUid\":\"BuildFromProject.Class1.Issue8665\",\"type\":\"Class\"},{\"name\":\"Class1.Issue8696Attribute\",\"href\":\"BuildFromProject.Class1.Issue8696Attribute.html\",\"topicHref\":\"BuildFromProject.Class1.Issue8696Attribute.html\",\"topicUid\":\"BuildFromProject.Class1.Issue8696Attribute\",\"type\":\"Class\"},{\"name\":\"Class1.Issue8948\",\"href\":\"BuildFromProject.Class1.Issue8948.html\",\"topicHref\":\"BuildFromProject.Class1.Issue8948.html\",\"topicUid\":\"BuildFromProject.Class1.Issue8948\",\"type\":\"Class\"},{\"name\":\"Class1.Issue9260\",\"href\":\"BuildFromProject.Class1.Issue9260.html\",\"topicHref\":\"BuildFromProject.Class1.Issue9260.html\",\"topicUid\":\"BuildFromProject.Class1.Issue9260\",\"type\":\"Enum\"},{\"name\":\"Class1.Test\",\"href\":\"BuildFromProject.Class1.Test-1.html\",\"topicHref\":\"BuildFromProject.Class1.Test-1.html\",\"topicUid\":\"BuildFromProject.Class1.Test`1\",\"type\":\"Class\"},{\"name\":\"Dog\",\"href\":\"BuildFromProject.Dog.html\",\"topicHref\":\"BuildFromProject.Dog.html\",\"topicUid\":\"BuildFromProject.Dog\",\"type\":\"Class\"},{\"name\":\"IInheritdoc\",\"href\":\"BuildFromProject.IInheritdoc.html\",\"topicHref\":\"BuildFromProject.IInheritdoc.html\",\"topicUid\":\"BuildFromProject.IInheritdoc\",\"type\":\"Interface\"},{\"name\":\"Inheritdoc\",\"href\":\"BuildFromProject.Inheritdoc.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.html\",\"topicUid\":\"BuildFromProject.Inheritdoc\",\"type\":\"Class\"},{\"name\":\"Inheritdoc.Issue6366\",\"href\":\"BuildFromProject.Inheritdoc.Issue6366.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.Issue6366.html\",\"topicUid\":\"BuildFromProject.Inheritdoc.Issue6366\",\"type\":\"Class\"},{\"name\":\"Inheritdoc.Issue6366.Class1\",\"href\":\"BuildFromProject.Inheritdoc.Issue6366.Class1-1.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.Issue6366.Class1-1.html\",\"topicUid\":\"BuildFromProject.Inheritdoc.Issue6366.Class1`1\",\"type\":\"Class\"},{\"name\":\"Inheritdoc.Issue6366.Class2\",\"href\":\"BuildFromProject.Inheritdoc.Issue6366.Class2.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.Issue6366.Class2.html\",\"topicUid\":\"BuildFromProject.Inheritdoc.Issue6366.Class2\",\"type\":\"Class\"},{\"name\":\"Inheritdoc.Issue7035\",\"href\":\"BuildFromProject.Inheritdoc.Issue7035.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.Issue7035.html\",\"topicUid\":\"BuildFromProject.Inheritdoc.Issue7035\",\"type\":\"Class\"},{\"name\":\"Inheritdoc.Issue7484\",\"href\":\"BuildFromProject.Inheritdoc.Issue7484.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.Issue7484.html\",\"topicUid\":\"BuildFromProject.Inheritdoc.Issue7484\",\"type\":\"Class\"},{\"name\":\"Inheritdoc.Issue8101\",\"href\":\"BuildFromProject.Inheritdoc.Issue8101.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.Issue8101.html\",\"topicUid\":\"BuildFromProject.Inheritdoc.Issue8101\",\"type\":\"Class\"},{\"name\":\"Inheritdoc.Issue8129\",\"href\":\"BuildFromProject.Inheritdoc.Issue8129.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.Issue8129.html\",\"topicUid\":\"BuildFromProject.Inheritdoc.Issue8129\",\"type\":\"Struct\"},{\"name\":\"Inheritdoc.Issue9736\",\"href\":\"BuildFromProject.Inheritdoc.Issue9736.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.Issue9736.html\",\"topicUid\":\"BuildFromProject.Inheritdoc.Issue9736\",\"type\":\"Class\"},{\"name\":\"Inheritdoc.Issue9736.IJsonApiOptions\",\"href\":\"BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions.html\",\"topicUid\":\"BuildFromProject.Inheritdoc.Issue9736.IJsonApiOptions\",\"type\":\"Interface\"},{\"name\":\"Inheritdoc.Issue9736.JsonApiOptions\",\"href\":\"BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions.html\",\"topicHref\":\"BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions.html\",\"topicUid\":\"BuildFromProject.Inheritdoc.Issue9736.JsonApiOptions\",\"type\":\"Class\"},{\"name\":\"Issue8725\",\"href\":\"BuildFromProject.Issue8725.html\",\"topicHref\":\"BuildFromProject.Issue8725.html\",\"topicUid\":\"BuildFromProject.Issue8725\",\"type\":\"Class\"}]},{\"name\":\"BuildFromVBSourceCode\",\"href\":\"BuildFromVBSourceCode.html\",\"topicHref\":\"BuildFromVBSourceCode.html\",\"topicUid\":\"BuildFromVBSourceCode\",\"type\":\"Namespace\",\"items\":[{\"name\":\"BaseClass1\",\"href\":\"BuildFromVBSourceCode.BaseClass1.html\",\"topicHref\":\"BuildFromVBSourceCode.BaseClass1.html\",\"topicUid\":\"BuildFromVBSourceCode.BaseClass1\",\"type\":\"Class\"},{\"name\":\"Class1\",\"href\":\"BuildFromVBSourceCode.Class1.html\",\"topicHref\":\"BuildFromVBSourceCode.Class1.html\",\"topicUid\":\"BuildFromVBSourceCode.Class1\",\"type\":\"Class\"}]},{\"name\":\"CatLibrary\",\"href\":\"CatLibrary.html\",\"topicHref\":\"CatLibrary.html\",\"topicUid\":\"CatLibrary\",\"type\":\"Namespace\",\"items\":[{\"name\":\"Core\",\"href\":\"CatLibrary.Core.html\",\"topicHref\":\"CatLibrary.Core.html\",\"topicUid\":\"CatLibrary.Core\",\"type\":\"Namespace\",\"items\":[{\"name\":\"ContainersRefType\",\"href\":\"CatLibrary.Core.ContainersRefType.html\",\"topicHref\":\"CatLibrary.Core.ContainersRefType.html\",\"topicUid\":\"CatLibrary.Core.ContainersRefType\",\"type\":\"Struct\"},{\"name\":\"ContainersRefType.ColorType\",\"href\":\"CatLibrary.Core.ContainersRefType.ColorType.html\",\"topicHref\":\"CatLibrary.Core.ContainersRefType.ColorType.html\",\"topicUid\":\"CatLibrary.Core.ContainersRefType.ColorType\",\"type\":\"Enum\"},{\"name\":\"ContainersRefType.ContainersRefTypeChild\",\"href\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeChild.html\",\"topicHref\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeChild.html\",\"topicUid\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeChild\",\"type\":\"Class\"},{\"name\":\"ContainersRefType.ContainersRefTypeChildInterface\",\"href\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeChildInterface.html\",\"topicHref\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeChildInterface.html\",\"topicUid\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeChildInterface\",\"type\":\"Interface\"},{\"name\":\"ContainersRefType.ContainersRefTypeDelegate\",\"href\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeDelegate.html\",\"topicHref\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeDelegate.html\",\"topicUid\":\"CatLibrary.Core.ContainersRefType.ContainersRefTypeDelegate\",\"type\":\"Delegate\"},{\"name\":\"ExplicitLayoutClass\",\"href\":\"CatLibrary.Core.ExplicitLayoutClass.html\",\"topicHref\":\"CatLibrary.Core.ExplicitLayoutClass.html\",\"topicUid\":\"CatLibrary.Core.ExplicitLayoutClass\",\"type\":\"Class\"},{\"name\":\"Issue231\",\"href\":\"CatLibrary.Core.Issue231.html\",\"topicHref\":\"CatLibrary.Core.Issue231.html\",\"topicUid\":\"CatLibrary.Core.Issue231\",\"type\":\"Class\"}]},{\"name\":\"CatException\",\"href\":\"CatLibrary.CatException-1.html\",\"topicHref\":\"CatLibrary.CatException-1.html\",\"topicUid\":\"CatLibrary.CatException`1\",\"type\":\"Class\"},{\"name\":\"Cat\",\"href\":\"CatLibrary.Cat-2.html\",\"topicHref\":\"CatLibrary.Cat-2.html\",\"topicUid\":\"CatLibrary.Cat`2\",\"type\":\"Class\"},{\"name\":\"Complex\",\"href\":\"CatLibrary.Complex-2.html\",\"topicHref\":\"CatLibrary.Complex-2.html\",\"topicUid\":\"CatLibrary.Complex`2\",\"type\":\"Class\"},{\"name\":\"FakeDelegate\",\"href\":\"CatLibrary.FakeDelegate-1.html\",\"topicHref\":\"CatLibrary.FakeDelegate-1.html\",\"topicUid\":\"CatLibrary.FakeDelegate`1\",\"type\":\"Delegate\"},{\"name\":\"IAnimal\",\"href\":\"CatLibrary.IAnimal.html\",\"topicHref\":\"CatLibrary.IAnimal.html\",\"topicUid\":\"CatLibrary.IAnimal\",\"type\":\"Interface\"},{\"name\":\"ICat\",\"href\":\"CatLibrary.ICat.html\",\"topicHref\":\"CatLibrary.ICat.html\",\"topicUid\":\"CatLibrary.ICat\",\"type\":\"Interface\"},{\"name\":\"ICatExtension\",\"href\":\"CatLibrary.ICatExtension.html\",\"topicHref\":\"CatLibrary.ICatExtension.html\",\"topicUid\":\"CatLibrary.ICatExtension\",\"type\":\"Class\"},{\"name\":\"MRefDelegate\",\"href\":\"CatLibrary.MRefDelegate-3.html\",\"topicHref\":\"CatLibrary.MRefDelegate-3.html\",\"topicUid\":\"CatLibrary.MRefDelegate`3\",\"type\":\"Delegate\"},{\"name\":\"MRefNormalDelegate\",\"href\":\"CatLibrary.MRefNormalDelegate.html\",\"topicHref\":\"CatLibrary.MRefNormalDelegate.html\",\"topicUid\":\"CatLibrary.MRefNormalDelegate\",\"type\":\"Delegate\"},{\"name\":\"Tom\",\"href\":\"CatLibrary.Tom.html\",\"topicHref\":\"CatLibrary.Tom.html\",\"topicUid\":\"CatLibrary.Tom\",\"type\":\"Class\"},{\"name\":\"TomFromBaseClass\",\"href\":\"CatLibrary.TomFromBaseClass.html\",\"topicHref\":\"CatLibrary.TomFromBaseClass.html\",\"topicUid\":\"CatLibrary.TomFromBaseClass\",\"type\":\"Class\"}]},{\"name\":\"MRef.Demo.Enumeration\",\"href\":\"MRef.Demo.Enumeration.html\",\"topicHref\":\"MRef.Demo.Enumeration.html\",\"topicUid\":\"MRef.Demo.Enumeration\",\"type\":\"Namespace\",\"items\":[{\"name\":\"ColorType\",\"href\":\"MRef.Demo.Enumeration.ColorType.html\",\"topicHref\":\"MRef.Demo.Enumeration.ColorType.html\",\"topicUid\":\"MRef.Demo.Enumeration.ColorType\",\"type\":\"Enum\"}]}],\"memberLayout\":\"SamePage\",\"pdf\":true,\"pdfTocPage\":true}"
}
\ No newline at end of file
diff --git a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/toc.pdf.verified.json b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/toc.pdf.verified.json
index c6446178f1a..7316d18f5ee 100644
--- a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/toc.pdf.verified.json
+++ b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/toc.pdf.verified.json
@@ -1,9 +1,9 @@
{
- "NumberOfPages": 84,
+ "NumberOfPages": 88,
"Pages": [
{
"Number": 1,
- "Text": "Table of Contents\nBuildFromAssembly 3\nClass1 4\nIssue5432 5\nBuildFromCSharpSourceCode 6\nCSharp 7\nBuildFromProject 8\nIssue8540 10\nA 11\nA 12\nB 13\nB 14\nClass1 15\nClass1.IIssue8948 20\nClass1.Issue8665 21\nClass1.Issue8696Attribute 24\nClass1.Issue8948 26\nClass1.Issue9260 27\nClass1.Test 28\nDog 29\nIInheritdoc 31\nInheritdoc 32\nInheritdoc.Issue6366 34\nInheritdoc.Issue6366.Class1 35\nInheritdoc.Issue6366.Class2 37\nInheritdoc.Issue7035 38\nInheritdoc.Issue7484 39\nInheritdoc.Issue8101 41\nInheritdoc.Issue8129 43\nIssue8725 44\nBuildFromVBSourceCode 45\nBaseClass1 46\nClass1 47\nCatLibrary 49\nCore 51\nContainersRefType 52\nContainersRefType.ColorType 54\nContainersRefType.ContainersRefTypeChild 55\nContainersRefType.ContainersRefTypeChildInterface 56",
+ "Text": "Table of Contents\nBuildFromAssembly 3\nClass1 4\nIssue5432 5\nBuildFromCSharpSourceCode 6\nCSharp 7\nBuildFromProject 8\nIssue8540 10\nA 11\nA 12\nB 13\nB 14\nClass1 15\nClass1.IIssue8948 20\nClass1.Issue8665 21\nClass1.Issue8696Attribute 24\nClass1.Issue8948 26\nClass1.Issue9260 27\nClass1.Test 28\nDog 29\nIInheritdoc 31\nInheritdoc 32\nInheritdoc.Issue6366 34\nInheritdoc.Issue6366.Class1 35\nInheritdoc.Issue6366.Class2 37\nInheritdoc.Issue7035 38\nInheritdoc.Issue7484 39\nInheritdoc.Issue8101 41\nInheritdoc.Issue8129 43\nInheritdoc.Issue9736 44\nInheritdoc.Issue9736.IJsonApiOptions 45\nInheritdoc.Issue9736.JsonApiOptions 46\nIssue8725 48\nBuildFromVBSourceCode 49\nBaseClass1 50\nClass1 51\nCatLibrary 53\nCore 55\nContainersRefType 56",
"Links": [
{
"Goto": {
@@ -286,7 +286,7 @@
},
{
"Goto": {
- "PageNumber": 47,
+ "PageNumber": 48,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -304,7 +304,7 @@
},
{
"Goto": {
- "PageNumber": 51,
+ "PageNumber": 50,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -313,7 +313,7 @@
},
{
"Goto": {
- "PageNumber": 52,
+ "PageNumber": 51,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -322,7 +322,7 @@
},
{
"Goto": {
- "PageNumber": 54,
+ "PageNumber": 53,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -351,11 +351,11 @@
},
{
"Number": 2,
- "Text": "ContainersRefType.ContainersRefTypeDelegate 57\nExplicitLayoutClass 58\nIssue231 59\nCatException 60\nCat 61\nComplex 70\nFakeDelegate 71\nIAnimal 72\nICat 75\nICatExtension 76\nMRefDelegate 78\nMRefNormalDelegate 79\nTom 80\nTomFromBaseClass 82\nMRef.Demo.Enumeration 83\nColorType 84",
+ "Text": "ContainersRefType.ColorType 58\nContainersRefType.ContainersRefTypeChild 59\nContainersRefType.ContainersRefTypeChildInterface 60\nContainersRefType.ContainersRefTypeDelegate 61\nExplicitLayoutClass 62\nIssue231 63\nCatException 64\nCat 65\nComplex 74\nFakeDelegate 75\nIAnimal 76\nICat 79\nICatExtension 80\nMRefDelegate 82\nMRefNormalDelegate 83\nTom 84\nTomFromBaseClass 86\nMRef.Demo.Enumeration 87\nColorType 88",
"Links": [
{
"Goto": {
- "PageNumber": 57,
+ "PageNumber": 58,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -364,7 +364,7 @@
},
{
"Goto": {
- "PageNumber": 58,
+ "PageNumber": 59,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -373,7 +373,7 @@
},
{
"Goto": {
- "PageNumber": 59,
+ "PageNumber": 60,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -382,7 +382,7 @@
},
{
"Goto": {
- "PageNumber": 60,
+ "PageNumber": 61,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -391,7 +391,7 @@
},
{
"Goto": {
- "PageNumber": 61,
+ "PageNumber": 62,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -400,7 +400,7 @@
},
{
"Goto": {
- "PageNumber": 70,
+ "PageNumber": 63,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -409,7 +409,7 @@
},
{
"Goto": {
- "PageNumber": 71,
+ "PageNumber": 64,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -418,7 +418,7 @@
},
{
"Goto": {
- "PageNumber": 72,
+ "PageNumber": 65,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -427,7 +427,7 @@
},
{
"Goto": {
- "PageNumber": 75,
+ "PageNumber": 74,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -436,7 +436,7 @@
},
{
"Goto": {
- "PageNumber": 76,
+ "PageNumber": 75,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -445,7 +445,7 @@
},
{
"Goto": {
- "PageNumber": 78,
+ "PageNumber": 76,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -496,12 +496,39 @@
"Top": 0
}
}
+ },
+ {
+ "Goto": {
+ "PageNumber": 86,
+ "Type": 2,
+ "Coordinates": {
+ "Top": 0
+ }
+ }
+ },
+ {
+ "Goto": {
+ "PageNumber": 87,
+ "Type": 2,
+ "Coordinates": {
+ "Top": 0
+ }
+ }
+ },
+ {
+ "Goto": {
+ "PageNumber": 88,
+ "Type": 2,
+ "Coordinates": {
+ "Top": 0
+ }
+ }
}
]
},
{
"Number": 3,
- "Text": "3 / 84\nClasses\nClass1\nThis is a test class.\nStructs\nIssue5432\nNamespace BuildFromAssembly",
+ "Text": "3 / 88\nClasses\nClass1\nThis is a test class.\nStructs\nIssue5432\nNamespace BuildFromAssembly",
"Links": [
{
"Goto": {
@@ -525,7 +552,7 @@
},
{
"Number": 4,
- "Text": "4 / 84\nNamespace: BuildFromAssembly\nAssembly: BuildFromAssembly.dll\nThis is a test class.\nInheritance\nobject\uF1C5 Class1\nInherited Members\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ToString()\uF1C5 ,\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 ,\nobject.ReferenceEquals(object, object)\uF1C5 , object.GetHashCode()\uF1C5\nConstructors\nMethods\nHello World.\nClass Class1\npublic class Class1\n\uF12C\nClass1()\npublic Class1()\nHelloWorld()\npublic static void HelloWorld()",
+ "Text": "4 / 88\nNamespace: BuildFromAssembly\nAssembly: BuildFromAssembly.dll\nThis is a test class.\nInheritance\nobject\uF1C5 Class1\nInherited Members\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ToString()\uF1C5 ,\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 ,\nobject.ReferenceEquals(object, object)\uF1C5 , object.GetHashCode()\uF1C5\nConstructors\nMethods\nHello World.\nClass Class1\npublic class Class1\n\uF12C\nClass1()\npublic Class1()\nHelloWorld()\npublic static void HelloWorld()",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.object"
@@ -630,7 +657,7 @@
},
{
"Number": 5,
- "Text": "5 / 84\nNamespace: BuildFromAssembly\nAssembly: BuildFromAssembly.dll\nInherited Members\nValueType.Equals(object)\uF1C5 , ValueType.GetHashCode()\uF1C5 , ValueType.ToString()\uF1C5 ,\nobject.GetType()\uF1C5 , object.Equals(object, object)\uF1C5 ,\nobject.ReferenceEquals(object, object)\uF1C5\nProperties\nProperty Value\nstring\uF1C5\nStruct Issue5432\npublic struct Issue5432\nName\npublic string Name { get; }",
+ "Text": "5 / 88\nNamespace: BuildFromAssembly\nAssembly: BuildFromAssembly.dll\nInherited Members\nValueType.Equals(object)\uF1C5 , ValueType.GetHashCode()\uF1C5 , ValueType.ToString()\uF1C5 ,\nobject.GetType()\uF1C5 , object.Equals(object, object)\uF1C5 ,\nobject.ReferenceEquals(object, object)\uF1C5\nProperties\nProperty Value\nstring\uF1C5\nStruct Issue5432\npublic struct Issue5432\nName\npublic string Name { get; }",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.valuetype.equals"
@@ -726,7 +753,7 @@
},
{
"Number": 6,
- "Text": "6 / 84\nClasses\nCSharp\nNamespace BuildFromCSharpSourceCode",
+ "Text": "6 / 88\nClasses\nCSharp\nNamespace BuildFromCSharpSourceCode",
"Links": [
{
"Goto": {
@@ -741,7 +768,7 @@
},
{
"Number": 7,
- "Text": "7 / 84\nNamespace: BuildFromCSharpSourceCode\nInheritance\nobject\uF1C5 CSharp\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nMethods\nParameters\nargs string\uF1C5 []\nClass CSharp\npublic class CSharp\n\uF12C\nMain(string[])\npublic static void Main(string[] args)",
+ "Text": "7 / 88\nNamespace: BuildFromCSharpSourceCode\nInheritance\nobject\uF1C5 CSharp\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nMethods\nParameters\nargs string\uF1C5 []\nClass CSharp\npublic class CSharp\n\uF12C\nMain(string[])\npublic static void Main(string[] args)",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.object"
@@ -873,7 +900,7 @@
},
{
"Number": 8,
- "Text": "8 / 84\nNamespaces\nBuildFromProject.Issue8540\nClasses\nClass1\nClass1.Issue8665\nClass1.Issue8696Attribute\nClass1.Issue8948\nClass1.Test\nDog\nClass representing a dog.\nInheritdoc\nInheritdoc.Issue6366\nInheritdoc.Issue6366.Class1\nInheritdoc.Issue6366.Class2\nInheritdoc.Issue7035\nInheritdoc.Issue7484\nThis is a test class to have something for DocFX to document.\nInheritdoc.Issue8101\nIssue8725\nA nice class\nStructs\nInheritdoc.Issue8129\nInterfaces\nClass1.IIssue8948\nIInheritdoc\nNamespace BuildFromProject",
+ "Text": "8 / 88\nNamespaces\nBuildFromProject.Issue8540\nClasses\nClass1\nClass1.Issue8665\nClass1.Issue8696Attribute\nClass1.Issue8948\nClass1.Test\nDog\nClass representing a dog.\nInheritdoc\nInheritdoc.Issue6366\nInheritdoc.Issue6366.Class1\nInheritdoc.Issue6366.Class2\nInheritdoc.Issue7035\nInheritdoc.Issue7484\nThis is a test class to have something for DocFX to document.\nInheritdoc.Issue8101\nInheritdoc.Issue9736\nInheritdoc.Issue9736.JsonApiOptions\nIssue8725\nA nice class\nStructs\nInheritdoc.Issue8129\nNamespace BuildFromProject",
"Links": [
{
"Goto": {
@@ -1129,7 +1156,7 @@
},
{
"Goto": {
- "PageNumber": 43,
+ "PageNumber": 44,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -1138,7 +1165,7 @@
},
{
"Goto": {
- "PageNumber": 43,
+ "PageNumber": 46,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -1147,7 +1174,7 @@
},
{
"Goto": {
- "PageNumber": 20,
+ "PageNumber": 46,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -1156,7 +1183,7 @@
},
{
"Goto": {
- "PageNumber": 20,
+ "PageNumber": 46,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -1165,7 +1192,43 @@
},
{
"Goto": {
- "PageNumber": 31,
+ "PageNumber": 46,
+ "Type": 2,
+ "Coordinates": {
+ "Top": 0
+ }
+ }
+ },
+ {
+ "Goto": {
+ "PageNumber": 46,
+ "Type": 2,
+ "Coordinates": {
+ "Top": 0
+ }
+ }
+ },
+ {
+ "Goto": {
+ "PageNumber": 48,
+ "Type": 2,
+ "Coordinates": {
+ "Top": 0
+ }
+ }
+ },
+ {
+ "Goto": {
+ "PageNumber": 43,
+ "Type": 2,
+ "Coordinates": {
+ "Top": 0
+ }
+ }
+ },
+ {
+ "Goto": {
+ "PageNumber": 43,
"Type": 2,
"Coordinates": {
"Top": 0
@@ -1176,8 +1239,80 @@
},
{
"Number": 9,
- "Text": "9 / 84\nEnums\nClass1.Issue9260",
+ "Text": "9 / 88\nInterfaces\nClass1.IIssue8948\nIInheritdoc\nInheritdoc.Issue9736.IJsonApiOptions\nEnums\nClass1.Issue9260",
"Links": [
+ {
+ "Goto": {
+ "PageNumber": 20,
+ "Type": 2,
+ "Coordinates": {
+ "Top": 0
+ }
+ }
+ },
+ {
+ "Goto": {
+ "PageNumber": 20,
+ "Type": 2,
+ "Coordinates": {
+ "Top": 0
+ }
+ }
+ },
+ {
+ "Goto": {
+ "PageNumber": 31,
+ "Type": 2,
+ "Coordinates": {
+ "Top": 0
+ }
+ }
+ },
+ {
+ "Goto": {
+ "PageNumber": 45,
+ "Type": 2,
+ "Coordinates": {
+ "Top": 0
+ }
+ }
+ },
+ {
+ "Goto": {
+ "PageNumber": 45,
+ "Type": 2,
+ "Coordinates": {
+ "Top": 0
+ }
+ }
+ },
+ {
+ "Goto": {
+ "PageNumber": 45,
+ "Type": 2,
+ "Coordinates": {
+ "Top": 0
+ }
+ }
+ },
+ {
+ "Goto": {
+ "PageNumber": 45,
+ "Type": 2,
+ "Coordinates": {
+ "Top": 0
+ }
+ }
+ },
+ {
+ "Goto": {
+ "PageNumber": 45,
+ "Type": 2,
+ "Coordinates": {
+ "Top": 0
+ }
+ }
+ },
{
"Goto": {
"PageNumber": 27,
@@ -1200,7 +1335,7 @@
},
{
"Number": 10,
- "Text": "10 / 84\nNamespaces\nBuildFromProject.Issue8540.A\nBuildFromProject.Issue8540.B\nNamespace BuildFromProject.Issue8540",
+ "Text": "10 / 88\nNamespaces\nBuildFromProject.Issue8540.A\nBuildFromProject.Issue8540.B\nNamespace BuildFromProject.Issue8540",
"Links": [
{
"Goto": {
@@ -1296,7 +1431,7 @@
},
{
"Number": 11,
- "Text": "11 / 84\nClasses\nA\nNamespace BuildFromProject.Issue8540.A",
+ "Text": "11 / 88\nClasses\nA\nNamespace BuildFromProject.Issue8540.A",
"Links": [
{
"Goto": {
@@ -1311,7 +1446,7 @@
},
{
"Number": 12,
- "Text": "12 / 84\nNamespace: BuildFromProject.Issue8540.A\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 A\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nClass A\npublic class A\n\uF12C",
+ "Text": "12 / 88\nNamespace: BuildFromProject.Issue8540.A\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 A\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nClass A\npublic class A\n\uF12C",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.object"
@@ -1434,7 +1569,7 @@
},
{
"Number": 13,
- "Text": "13 / 84\nClasses\nB\nNamespace BuildFromProject.Issue8540.B",
+ "Text": "13 / 88\nClasses\nB\nNamespace BuildFromProject.Issue8540.B",
"Links": [
{
"Goto": {
@@ -1449,7 +1584,7 @@
},
{
"Number": 14,
- "Text": "14 / 84\nNamespace: BuildFromProject.Issue8540.B\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 B\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nClass B\npublic class B\n\uF12C",
+ "Text": "14 / 88\nNamespace: BuildFromProject.Issue8540.B\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 B\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nClass B\npublic class B\n\uF12C",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.object"
@@ -1572,7 +1707,7 @@
},
{
"Number": 15,
- "Text": "15 / 84\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Class1\nImplements\nIClass1\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nMethods\nPricing models are used to calculate theoretical option values\n1 - Black Scholes\n2 - Black76\n3 - Black76Fut\n4 - Equity Tree\n5 - Variance Swap\n6 - Dividend Forecast\nIConfiguration related helper and extension routines.\nClass Class1\npublic class Class1 : IClass1\n\uF12C\nIssue1651()\npublic void Issue1651()\nIssue1887()",
+ "Text": "15 / 88\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Class1\nImplements\nIClass1\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nMethods\nPricing models are used to calculate theoretical option values\n1 - Black Scholes\n2 - Black76\n3 - Black76Fut\n4 - Equity Tree\n5 - Variance Swap\n6 - Dividend Forecast\nIConfiguration related helper and extension routines.\nClass Class1\npublic class Class1 : IClass1\n\uF12C\nIssue1651()\npublic void Issue1651()\nIssue1887()",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.object"
@@ -1677,12 +1812,12 @@
},
{
"Number": 16,
- "Text": "16 / 84\nExamples\nRemarks\nFor example:\nRemarks\npublic void Issue1887()\nIssue2623()\npublic void Issue2623()\nMyClass myClass = new MyClass();\nvoid Update()\n{ \nmyClass.Execute();\n}\nMyClass myClass = new MyClass();\nvoid Update()\n{ \nmyClass.Execute();\n}\nIssue2723()\npublic void Issue2723()\nNOTE\nThis is a . & \" '\n\uF431",
+ "Text": "16 / 88\nExamples\nRemarks\nFor example:\nRemarks\npublic void Issue1887()\nIssue2623()\npublic void Issue2623()\nMyClass myClass = new MyClass();\nvoid Update()\n{ \nmyClass.Execute();\n}\nMyClass myClass = new MyClass();\nvoid Update()\n{ \nmyClass.Execute();\n}\nIssue2723()\npublic void Issue2723()\nNOTE\nThis is a . & \" '\n\uF431",
"Links": []
},
{
"Number": 17,
- "Text": "17 / 84\nInline .\nlink\uF1C5\nExamples\nRemarks\nfor (var i = 0; i > 10; i++) // & \" '\nvar range = new Range { Min = 0, Max = 10 };\nvar range = new Range { Min = 0, Max = 10 };\nIssue4017()\npublic void Issue4017()\npublic void HookMessageDeleted(BaseSocketClient client)\n{ \nclient.MessageDeleted += HandleMessageDelete;\n}\npublic Task HandleMessageDelete(Cacheable cachedMessage,\nISocketMessageChannel channel)\n{ \n// check if the message exists in cache; if not, we cannot report what\nwas removed\nif (!cachedMessage.HasValue) return;\nvar message = cachedMessage.Value;\nConsole.WriteLine($\"A message ({message.Id}) from {message.Author} was removed\nfrom the channel {channel.Name} ({channel.Id}):\"\n+ Environment.NewLine\n+ message.Content);\nreturn Task.CompletedTask;\n}\nvoid Update()\n{",
+ "Text": "17 / 88\nInline .\nlink\uF1C5\nExamples\nRemarks\nfor (var i = 0; i > 10; i++) // & \" '\nvar range = new Range { Min = 0, Max = 10 };\nvar range = new Range { Min = 0, Max = 10 };\nIssue4017()\npublic void Issue4017()\npublic void HookMessageDeleted(BaseSocketClient client)\n{ \nclient.MessageDeleted += HandleMessageDelete;\n}\npublic Task HandleMessageDelete(Cacheable cachedMessage,\nISocketMessageChannel channel)\n{ \n// check if the message exists in cache; if not, we cannot report what\nwas removed\nif (!cachedMessage.HasValue) return;\nvar message = cachedMessage.Value;\nConsole.WriteLine($\"A message ({message.Id}) from {message.Author} was removed\nfrom the channel {channel.Name} ({channel.Id}):\"\n+ Environment.NewLine\n+ message.Content);\nreturn Task.CompletedTask;\n}\nvoid Update()\n{",
"Links": [
{
"Uri": "https://www.github.com/"
@@ -1697,12 +1832,12 @@
},
{
"Number": 18,
- "Text": "18 / 84\nRemarks\n@\"\\\\?\\\" @\"\\\\?\\\"\nRemarks\nThere's really no reason to not believe that this class can test things.\nTerm Description\nA Term A Description\nBee Term Bee Description\nType Parameters\nT \nmyClass.Execute();\n}\nIssue4392()\npublic void Issue4392()\nIssue7484()\npublic void Issue7484()\nIssue8764()\npublic void Issue8764() where T : unmanaged\nIssue896()",
+ "Text": "18 / 88\nRemarks\n@\"\\\\?\\\" @\"\\\\?\\\"\nRemarks\nThere's really no reason to not believe that this class can test things.\nTerm Description\nA Term A Description\nBee Term Bee Description\nType Parameters\nT \nmyClass.Execute();\n}\nIssue4392()\npublic void Issue4392()\nIssue7484()\npublic void Issue7484()\nIssue8764()\npublic void Issue8764() where T : unmanaged\nIssue896()",
"Links": []
},
{
"Number": 19,
- "Text": "19 / 84\nTest\nSee Also\nClass1.Test, Class1\nCalculates the determinant of a 3-dimensional matrix:\nReturns the smallest value:\nReturns\ndouble\uF1C5\nThis method should do something...\nRemarks\nThis is remarks.\npublic void Issue896()\nIssue9216()\npublic static double Issue9216()\nXmlCommentIncludeTag()\npublic void XmlCommentIncludeTag()",
+ "Text": "19 / 88\nTest\nSee Also\nClass1.Test, Class1\nCalculates the determinant of a 3-dimensional matrix:\nReturns the smallest value:\nReturns\ndouble\uF1C5\nThis method should do something...\nRemarks\nThis is remarks.\npublic void Issue896()\nIssue9216()\npublic static double Issue9216()\nXmlCommentIncludeTag()\npublic void XmlCommentIncludeTag()",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.double"
@@ -1744,7 +1879,7 @@
},
{
"Number": 20,
- "Text": "20 / 84\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nMethods\nDoes nothing with generic type T.\nType Parameters\nT\nA generic type.\nInterface Class1.IIssue8948\npublic interface Class1.IIssue8948\nDoNothing()\nvoid DoNothing()",
+ "Text": "20 / 88\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nMethods\nDoes nothing with generic type T.\nType Parameters\nT\nA generic type.\nInterface Class1.IIssue8948\npublic interface Class1.IIssue8948\nDoNothing()\nvoid DoNothing()",
"Links": [
{
"Goto": {
@@ -1777,7 +1912,7 @@
},
{
"Number": 21,
- "Text": "21 / 84\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Class1.Issue8665\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nConstructors\nParameters\nfoo int\uF1C5\nClass Class1.Issue8665\npublic class Class1.Issue8665\n\uF12C\nIssue8665()\npublic Issue8665()\nIssue8665(int)\npublic Issue8665(int foo)\nIssue8665(int, char)\npublic Issue8665(int foo, char bar)",
+ "Text": "21 / 88\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Class1.Issue8665\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nConstructors\nParameters\nfoo int\uF1C5\nClass Class1.Issue8665\npublic class Class1.Issue8665\n\uF12C\nIssue8665()\npublic Issue8665()\nIssue8665(int)\npublic Issue8665(int foo)\nIssue8665(int, char)\npublic Issue8665(int foo, char bar)",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.object"
@@ -1891,7 +2026,7 @@
},
{
"Number": 22,
- "Text": "22 / 84\nParameters\nfoo int\uF1C5\nbar char\uF1C5\nParameters\nfoo int\uF1C5\nbar char\uF1C5\nbaz string\uF1C5\nProperties\nProperty Value\nchar\uF1C5\nProperty Value\nstring\uF1C5\nIssue8665(int, char, string)\npublic Issue8665(int foo, char bar, string baz)\nBar\npublic char Bar { get; }\nBaz\npublic string Baz { get; }",
+ "Text": "22 / 88\nParameters\nfoo int\uF1C5\nbar char\uF1C5\nParameters\nfoo int\uF1C5\nbar char\uF1C5\nbaz string\uF1C5\nProperties\nProperty Value\nchar\uF1C5\nProperty Value\nstring\uF1C5\nIssue8665(int, char, string)\npublic Issue8665(int foo, char bar, string baz)\nBar\npublic char Bar { get; }\nBaz\npublic string Baz { get; }",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.int32"
@@ -1960,7 +2095,7 @@
},
{
"Number": 23,
- "Text": "23 / 84\nProperty Value\nint\uF1C5\nFoo\npublic int Foo { get; }",
+ "Text": "23 / 88\nProperty Value\nint\uF1C5\nFoo\npublic int Foo { get; }",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.int32"
@@ -1975,7 +2110,7 @@
},
{
"Number": 24,
- "Text": "24 / 84\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Attribute\uF1C5 Class1.Issue8696Attribute\nInherited Members\nAttribute.Equals(object)\uF1C5 , Attribute.GetCustomAttribute(Assembly, Type)\uF1C5 ,\nAttribute.GetCustomAttribute(Assembly, Type, bool)\uF1C5 ,\nAttribute.GetCustomAttribute(MemberInfo, Type)\uF1C5 ,\nAttribute.GetCustomAttribute(MemberInfo, Type, bool)\uF1C5 ,\nAttribute.GetCustomAttribute(Module, Type)\uF1C5 ,\nAttribute.GetCustomAttribute(Module, Type, bool)\uF1C5 ,\nAttribute.GetCustomAttribute(ParameterInfo, Type)\uF1C5 ,\nAttribute.GetCustomAttribute(ParameterInfo, Type, bool)\uF1C5 ,\nAttribute.GetCustomAttributes(Assembly)\uF1C5 ,\nAttribute.GetCustomAttributes(Assembly, bool)\uF1C5 ,\nAttribute.GetCustomAttributes(Assembly, Type)\uF1C5 ,\nAttribute.GetCustomAttributes(Assembly, Type, bool)\uF1C5 ,\nAttribute.GetCustomAttributes(MemberInfo)\uF1C5 ,\nAttribute.GetCustomAttributes(MemberInfo, bool)\uF1C5 ,\nAttribute.GetCustomAttributes(MemberInfo, Type)\uF1C5 ,\nAttribute.GetCustomAttributes(MemberInfo, Type, bool)\uF1C5 ,\nAttribute.GetCustomAttributes(Module)\uF1C5 , Attribute.GetCustomAttributes(Module, bool)\uF1C5 ,\nAttribute.GetCustomAttributes(Module, Type)\uF1C5 ,\nAttribute.GetCustomAttributes(Module, Type, bool)\uF1C5 ,\nAttribute.GetCustomAttributes(ParameterInfo)\uF1C5 ,\nAttribute.GetCustomAttributes(ParameterInfo, bool)\uF1C5 ,\nAttribute.GetCustomAttributes(ParameterInfo, Type)\uF1C5 ,\nAttribute.GetCustomAttributes(ParameterInfo, Type, bool)\uF1C5 , Attribute.GetHashCode()\uF1C5 ,\nAttribute.IsDefaultAttribute()\uF1C5 , Attribute.IsDefined(Assembly, Type)\uF1C5 ,\nAttribute.IsDefined(Assembly, Type, bool)\uF1C5 , Attribute.IsDefined(MemberInfo, Type)\uF1C5 ,\nAttribute.IsDefined(MemberInfo, Type, bool)\uF1C5 , Attribute.IsDefined(Module, Type)\uF1C5 ,\nAttribute.IsDefined(Module, Type, bool)\uF1C5 , Attribute.IsDefined(ParameterInfo, Type)\uF1C5 ,\nAttribute.IsDefined(ParameterInfo, Type, bool)\uF1C5 , Attribute.Match(object)\uF1C5 ,\nClass Class1.Issue8696Attribute\npublic class Class1.Issue8696Attribute : Attribute\n\uF12C \uF12C",
+ "Text": "24 / 88\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Attribute\uF1C5 Class1.Issue8696Attribute\nInherited Members\nAttribute.Equals(object)\uF1C5 , Attribute.GetCustomAttribute(Assembly, Type)\uF1C5 ,\nAttribute.GetCustomAttribute(Assembly, Type, bool)\uF1C5 ,\nAttribute.GetCustomAttribute(MemberInfo, Type)\uF1C5 ,\nAttribute.GetCustomAttribute(MemberInfo, Type, bool)\uF1C5 ,\nAttribute.GetCustomAttribute(Module, Type)\uF1C5 ,\nAttribute.GetCustomAttribute(Module, Type, bool)\uF1C5 ,\nAttribute.GetCustomAttribute(ParameterInfo, Type)\uF1C5 ,\nAttribute.GetCustomAttribute(ParameterInfo, Type, bool)\uF1C5 ,\nAttribute.GetCustomAttributes(Assembly)\uF1C5 ,\nAttribute.GetCustomAttributes(Assembly, bool)\uF1C5 ,\nAttribute.GetCustomAttributes(Assembly, Type)\uF1C5 ,\nAttribute.GetCustomAttributes(Assembly, Type, bool)\uF1C5 ,\nAttribute.GetCustomAttributes(MemberInfo)\uF1C5 ,\nAttribute.GetCustomAttributes(MemberInfo, bool)\uF1C5 ,\nAttribute.GetCustomAttributes(MemberInfo, Type)\uF1C5 ,\nAttribute.GetCustomAttributes(MemberInfo, Type, bool)\uF1C5 ,\nAttribute.GetCustomAttributes(Module)\uF1C5 , Attribute.GetCustomAttributes(Module, bool)\uF1C5 ,\nAttribute.GetCustomAttributes(Module, Type)\uF1C5 ,\nAttribute.GetCustomAttributes(Module, Type, bool)\uF1C5 ,\nAttribute.GetCustomAttributes(ParameterInfo)\uF1C5 ,\nAttribute.GetCustomAttributes(ParameterInfo, bool)\uF1C5 ,\nAttribute.GetCustomAttributes(ParameterInfo, Type)\uF1C5 ,\nAttribute.GetCustomAttributes(ParameterInfo, Type, bool)\uF1C5 , Attribute.GetHashCode()\uF1C5 ,\nAttribute.IsDefaultAttribute()\uF1C5 , Attribute.IsDefined(Assembly, Type)\uF1C5 ,\nAttribute.IsDefined(Assembly, Type, bool)\uF1C5 , Attribute.IsDefined(MemberInfo, Type)\uF1C5 ,\nAttribute.IsDefined(MemberInfo, Type, bool)\uF1C5 , Attribute.IsDefined(Module, Type)\uF1C5 ,\nAttribute.IsDefined(Module, Type, bool)\uF1C5 , Attribute.IsDefined(ParameterInfo, Type)\uF1C5 ,\nAttribute.IsDefined(ParameterInfo, Type, bool)\uF1C5 , Attribute.Match(object)\uF1C5 ,\nClass Class1.Issue8696Attribute\npublic class Class1.Issue8696Attribute : Attribute\n\uF12C \uF12C",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.object"
@@ -2350,7 +2485,7 @@
},
{
"Number": 25,
- "Text": "25 / 84\nAttribute.TypeId\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetType()\uF1C5 ,\nobject.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 , object.ToString()\uF1C5\nConstructors\nParameters\ndescription string\uF1C5\nboundsMin int\uF1C5\nboundsMax int\uF1C5\nvalidGameModes string\uF1C5 []\nhasMultipleSelections bool\uF1C5\nenumType Type\uF1C5\nIssue8696Attribute(string?, int, int, string[]?, bool,\nType?)\n[Class1.Issue8696(\"Changes the name of the server in the server list\", 0, 0, null,\nfalse, null)]\npublic Issue8696Attribute(string? description = null, int boundsMin = 0, int\nboundsMax = 0, string[]? validGameModes = null, bool hasMultipleSelections = false,\nType? enumType = null)",
+ "Text": "25 / 88\nAttribute.TypeId\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetType()\uF1C5 ,\nobject.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 , object.ToString()\uF1C5\nConstructors\nParameters\ndescription string\uF1C5\nboundsMin int\uF1C5\nboundsMax int\uF1C5\nvalidGameModes string\uF1C5 []\nhasMultipleSelections bool\uF1C5\nenumType Type\uF1C5\nIssue8696Attribute(string?, int, int, string[]?, bool,\nType?)\n[Class1.Issue8696(\"Changes the name of the server in the server list\", 0, 0, null,\nfalse, null)]\npublic Issue8696Attribute(string? description = null, int boundsMin = 0, int\nboundsMax = 0, string[]? validGameModes = null, bool hasMultipleSelections = false,\nType? enumType = null)",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.attribute.typeid"
@@ -2464,7 +2599,7 @@
},
{
"Number": 26,
- "Text": "26 / 84\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Class1.Issue8948\nImplements\nClass1.IIssue8948\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nMethods\nDoes nothing with generic type T.\nType Parameters\nT\nA generic type.\nClass Class1.Issue8948\npublic class Class1.Issue8948 : Class1.IIssue8948\n\uF12C\nDoNothing()\npublic void DoNothing()",
+ "Text": "26 / 88\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Class1.Issue8948\nImplements\nClass1.IIssue8948\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nMethods\nDoes nothing with generic type T.\nType Parameters\nT\nA generic type.\nClass Class1.Issue8948\npublic class Class1.Issue8948 : Class1.IIssue8948\n\uF12C\nDoNothing()\npublic void DoNothing()",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.object"
@@ -2587,7 +2722,7 @@
},
{
"Number": 27,
- "Text": "27 / 84\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nFields\nValue = 0\nThis is a regular enum value.\nThis is a remarks section. Very important remarks about Value go here.\n[Obsolete] OldAndUnusedValue = 1\nThis is old and unused. You shouldn't use it anymore.\nDon't use this, seriously! Use Value instead.\n[Obsolete(\"Use Value\")] OldAndUnusedValue2 = 2\nThis is old and unused. You shouldn't use it anymore.\nDon't use this, seriously! Use Value instead.\nEnum Class1.Issue9260\npublic enum Class1.Issue9260",
+ "Text": "27 / 88\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nFields\nValue = 0\nThis is a regular enum value.\nThis is a remarks section. Very important remarks about Value go here.\n[Obsolete] OldAndUnusedValue = 1\nThis is old and unused. You shouldn't use it anymore.\nDon't use this, seriously! Use Value instead.\n[Obsolete(\"Use Value\")] OldAndUnusedValue2 = 2\nThis is old and unused. You shouldn't use it anymore.\nDon't use this, seriously! Use Value instead.\nEnum Class1.Issue9260\npublic enum Class1.Issue9260",
"Links": [
{
"Goto": {
@@ -2620,7 +2755,7 @@
},
{
"Number": 28,
- "Text": "28 / 84\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nType Parameters\nT\nInheritance\nobject\uF1C5 Class1.Test\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nClass Class1.Test\npublic class Class1.Test\n\uF12C",
+ "Text": "28 / 88\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nType Parameters\nT\nInheritance\nobject\uF1C5 Class1.Test\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nClass Class1.Test\npublic class Class1.Test\n\uF12C",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.object"
@@ -2725,7 +2860,7 @@
},
{
"Number": 29,
- "Text": "29 / 84\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nClass representing a dog.\nInheritance\nobject\uF1C5 Dog\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nConstructors\nConstructor.\nParameters\nname string\uF1C5\nName of the dog.\nage int\uF1C5\nAge of the dog.\nProperties\nClass Dog\npublic class Dog\n\uF12C\nDog(string, int)\npublic Dog(string name, int age)",
+ "Text": "29 / 88\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nClass representing a dog.\nInheritance\nobject\uF1C5 Dog\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nConstructors\nConstructor.\nParameters\nname string\uF1C5\nName of the dog.\nage int\uF1C5\nAge of the dog.\nProperties\nClass Dog\npublic class Dog\n\uF12C\nDog(string, int)\npublic Dog(string name, int age)",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.object"
@@ -2848,7 +2983,7 @@
},
{
"Number": 30,
- "Text": "30 / 84\nAge of the dog.\nProperty Value\nint\uF1C5\nName of the dog.\nProperty Value\nstring\uF1C5\nAge\npublic int Age { get; }\nName\npublic string Name { get; }",
+ "Text": "30 / 88\nAge of the dog.\nProperty Value\nint\uF1C5\nName of the dog.\nProperty Value\nstring\uF1C5\nAge\npublic int Age { get; }\nName\npublic string Name { get; }",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.int32"
@@ -2872,7 +3007,7 @@
},
{
"Number": 31,
- "Text": "31 / 84\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nMethods\nThis method should do something...\nInterface IInheritdoc\npublic interface IInheritdoc\nIssue7629()\nvoid Issue7629()",
+ "Text": "31 / 88\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nMethods\nThis method should do something...\nInterface IInheritdoc\npublic interface IInheritdoc\nIssue7629()\nvoid Issue7629()",
"Links": [
{
"Goto": {
@@ -2905,7 +3040,7 @@
},
{
"Number": 32,
- "Text": "32 / 84\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Inheritdoc\nImplements\nIInheritdoc, IDisposable\uF1C5\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nMethods\nPerforms application-defined tasks associated with freeing, releasing, or resetting\nunmanaged resources.\nThis method should do something...\nClass Inheritdoc\npublic class Inheritdoc : IInheritdoc, IDisposable\n\uF12C\nDispose()\npublic void Dispose()\nIssue7628()\npublic void Issue7628()\nIssue7629()",
+ "Text": "32 / 88\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Inheritdoc\nImplements\nIInheritdoc, IDisposable\uF1C5\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nMethods\nPerforms application-defined tasks associated with freeing, releasing, or resetting\nunmanaged resources.\nThis method should do something...\nClass Inheritdoc\npublic class Inheritdoc : IInheritdoc, IDisposable\n\uF12C\nDispose()\npublic void Dispose()\nIssue7628()\npublic void Issue7628()\nIssue7629()",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.object"
@@ -3028,12 +3163,12 @@
},
{
"Number": 33,
- "Text": "33 / 84\nThis method should do something...\npublic void Issue7629()",
+ "Text": "33 / 88\nThis method should do something...\npublic void Issue7629()",
"Links": []
},
{
"Number": 34,
- "Text": "34 / 84\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Inheritdoc.Issue6366\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nClass Inheritdoc.Issue6366\npublic class Inheritdoc.Issue6366\n\uF12C",
+ "Text": "34 / 88\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Inheritdoc.Issue6366\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nClass Inheritdoc.Issue6366\npublic class Inheritdoc.Issue6366\n\uF12C",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.object"
@@ -3138,7 +3273,7 @@
},
{
"Number": 35,
- "Text": "35 / 84\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nType Parameters\nT\nInheritance\nobject\uF1C5 Inheritdoc.Issue6366.Class1\nDerived\nInheritdoc.Issue6366.Class2\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nMethods\nThis text inherited.\nParameters\nparm1 T\nThis text NOT inherited.\nparm2 int\uF1C5\nThis text inherited.\nClass Inheritdoc.Issue6366.Class1\npublic abstract class Inheritdoc.Issue6366.Class1\n\uF12C\nTestMethod1(T, int)\npublic abstract T TestMethod1(T parm1, int parm2)",
+ "Text": "35 / 88\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nType Parameters\nT\nInheritance\nobject\uF1C5 Inheritdoc.Issue6366.Class1\nDerived\nInheritdoc.Issue6366.Class2\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nMethods\nThis text inherited.\nParameters\nparm1 T\nThis text NOT inherited.\nparm2 int\uF1C5\nThis text inherited.\nClass Inheritdoc.Issue6366.Class1\npublic abstract class Inheritdoc.Issue6366.Class1\n\uF12C\nTestMethod1(T, int)\npublic abstract T TestMethod1(T parm1, int parm2)",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.object"
@@ -3279,12 +3414,12 @@
},
{
"Number": 36,
- "Text": "36 / 84\nReturns\nT\nThis text inherited.",
+ "Text": "36 / 88\nReturns\nT\nThis text inherited.",
"Links": []
},
{
"Number": 37,
- "Text": "37 / 84\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Inheritdoc.Issue6366.Class1 Inheritdoc.Issue6366.Class2\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nMethods\nThis text inherited.\nParameters\nparm1 bool\uF1C5\nThis text NOT inherited.\nparm2 int\uF1C5\nThis text inherited.\nReturns\nbool\uF1C5\nThis text inherited.\nClass Inheritdoc.Issue6366.Class2\npublic class Inheritdoc.Issue6366.Class2 : Inheritdoc.Issue6366.Class1\n\uF12C \uF12C\nTestMethod1(bool, int)\npublic override bool TestMethod1(bool parm1, int parm2)",
+ "Text": "37 / 88\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Inheritdoc.Issue6366.Class1 Inheritdoc.Issue6366.Class2\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nMethods\nThis text inherited.\nParameters\nparm1 bool\uF1C5\nThis text NOT inherited.\nparm2 int\uF1C5\nThis text inherited.\nReturns\nbool\uF1C5\nThis text inherited.\nClass Inheritdoc.Issue6366.Class2\npublic class Inheritdoc.Issue6366.Class2 : Inheritdoc.Issue6366.Class1\n\uF12C \uF12C\nTestMethod1(bool, int)\npublic override bool TestMethod1(bool parm1, int parm2)",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.object"
@@ -3452,7 +3587,7 @@
},
{
"Number": 38,
- "Text": "38 / 84\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Inheritdoc.Issue7035\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nMethods\nClass Inheritdoc.Issue7035\npublic class Inheritdoc.Issue7035\n\uF12C\nA()\npublic void A()\nB()\npublic void B()",
+ "Text": "38 / 88\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Inheritdoc.Issue7035\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nMethods\nClass Inheritdoc.Issue7035\npublic class Inheritdoc.Issue7035\n\uF12C\nA()\npublic void A()\nB()\npublic void B()",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.object"
@@ -3557,7 +3692,7 @@
},
{
"Number": 39,
- "Text": "39 / 84\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nThis is a test class to have something for DocFX to document.\nInheritance\nobject\uF1C5 Inheritdoc.Issue7484\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nRemarks\nWe're going to talk about things now.\nBoolReturningMethod(bool) Simple method to generate docs for.\nDoDad A string that could have something.\nConstructors\nThis is a constructor to document.\nProperties\nClass Inheritdoc.Issue7484\npublic class Inheritdoc.Issue7484\n\uF12C\nIssue7484()\npublic Issue7484()\nDoDad",
+ "Text": "39 / 88\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nThis is a test class to have something for DocFX to document.\nInheritance\nobject\uF1C5 Inheritdoc.Issue7484\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nRemarks\nWe're going to talk about things now.\nBoolReturningMethod(bool) Simple method to generate docs for.\nDoDad A string that could have something.\nConstructors\nThis is a constructor to document.\nProperties\nClass Inheritdoc.Issue7484\npublic class Inheritdoc.Issue7484\n\uF12C\nIssue7484()\npublic Issue7484()\nDoDad",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.object"
@@ -3707,7 +3842,7 @@
},
{
"Number": 40,
- "Text": "40 / 84\nA string that could have something.\nProperty Value\nstring\uF1C5\nMethods\nSimple method to generate docs for.\nParameters\nsource bool\uF1C5\nA meaningless boolean value, much like most questions in the world.\nReturns\nbool\uF1C5\nAn exactly equivalently meaningless boolean value, much like most answers in the world.\nRemarks\nI'd like to take a moment to thank all of those who helped me get to a place where I can\nwrite documentation like this.\npublic string DoDad { get; }\nBoolReturningMethod(bool)\npublic bool BoolReturningMethod(bool source)",
+ "Text": "40 / 88\nA string that could have something.\nProperty Value\nstring\uF1C5\nMethods\nSimple method to generate docs for.\nParameters\nsource bool\uF1C5\nA meaningless boolean value, much like most questions in the world.\nReturns\nbool\uF1C5\nAn exactly equivalently meaningless boolean value, much like most answers in the world.\nRemarks\nI'd like to take a moment to thank all of those who helped me get to a place where I can\nwrite documentation like this.\npublic string DoDad { get; }\nBoolReturningMethod(bool)\npublic bool BoolReturningMethod(bool source)",
"Links": [
{
"Uri": "https://learn.microsoft.com/dotnet/api/system.string"
@@ -3740,7 +3875,7 @@
},
{
"Number": 41,
- "Text": "41 / 84\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Inheritdoc.Issue8101\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nMethods\nCreate a new tween.\nParameters\nfrom int\uF1C5\nThe starting value.\nto int\uF1C5\nThe end value.\nduration float\uF1C5\nTotal tween duration in seconds.\nonChange Action\uF1C5 \nClass Inheritdoc.Issue8101\npublic class Inheritdoc.Issue8101\n\uF12C\nTween(int, int, float, Action)\npublic static object Tween(int from, int to, float duration, Action onChange)",
+ "Text": "41 / 88\nNamespace: BuildFromProject\nAssembly: BuildFromProject.dll\nInheritance\nobject\uF1C5 Inheritdoc.Issue8101\nInherited Members\nobject.Equals(object)\uF1C5 , object.Equals(object, object)\uF1C5 , object.GetHashCode()\uF1C5 ,\nobject.GetType()\uF1C5 , object.MemberwiseClone()\uF1C5 , object.ReferenceEquals(object, object)\uF1C5 ,\nobject.ToString()\uF1C5\nMethods\nCreate a new tween.\nParameters\nfrom int\uF1C5\nThe starting value.\nto int\uF1C5\nThe end value.\nduration float\uF1C5\nTotal tween duration in seconds.\nonChange Action\uF1C5