From 1ea48b14bc260d18e0d4051f5075198a96d19a1a Mon Sep 17 00:00:00 2001 From: filzrev <103790468+filzrev@users.noreply.github.com> Date: Tue, 15 Apr 2025 01:37:52 +0900 Subject: [PATCH 1/3] chore: add derivedclass metadata for interface --- .../Resolvers/SetDerivedClass.cs | 46 +++++++++++++------ 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/src/Docfx.Dotnet/ManagedReference/Resolvers/SetDerivedClass.cs b/src/Docfx.Dotnet/ManagedReference/Resolvers/SetDerivedClass.cs index cb23287b342..c134113a26a 100644 --- a/src/Docfx.Dotnet/ManagedReference/Resolvers/SetDerivedClass.cs +++ b/src/Docfx.Dotnet/ManagedReference/Resolvers/SetDerivedClass.cs @@ -1,6 +1,7 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Runtime.InteropServices; using Docfx.DataContracts.ManagedReference; namespace Docfx.Dotnet; @@ -22,6 +23,7 @@ private void UpdateDerivedClassMapping(List items, Dictionary()) { + // Handle class inheritance var inheritance = item.Inheritance; if (inheritance is { Count: > 0 }) { @@ -35,15 +37,30 @@ private void UpdateDerivedClassMapping(List items, Dictionary derivedClasses)) - { + ref var derivedClasses = ref CollectionsMarshal.GetValueRefOrAddDefault(_derivedClassMapping, superClass, out var exists); + if (exists) derivedClasses.Add(item.Name); - } else - { - _derivedClassMapping.Add(superClass, [item.Name]); - } + derivedClasses = [item.Name]; + } + } + + // Handle interface implementations + var implements = item.Implements; + if (implements is { Count: > 0 }) + { + var superClass = implements[implements.Count - 1]; + + if (reference.TryGetValue(superClass, out var referenceItem)) + { + superClass = referenceItem.Definition ?? superClass; } + + ref var derivedClasses = ref CollectionsMarshal.GetValueRefOrAddDefault(_derivedClassMapping, superClass, out var exists); + if (exists) + derivedClasses.Add(item.Name); + else + derivedClasses = [item.Name]; } } } @@ -52,13 +69,16 @@ private void AppendDerivedClass(List items) { foreach (var item in items ?? Enumerable.Empty()) { - if (item.Type == MemberType.Class) + switch (item.Type) { - if (_derivedClassMapping.TryGetValue(item.Name, out List derivedClasses)) - { - derivedClasses.Sort(); - item.DerivedClasses = derivedClasses; - } + case MemberType.Class: + case MemberType.Interface: + if (_derivedClassMapping.TryGetValue(item.Name, out List derivedClasses)) + { + derivedClasses.Sort(); + item.DerivedClasses = derivedClasses; + } + continue; } } } From 6bb6f2466c0c38f0612ebeff46d907e0eb60d654 Mon Sep 17 00:00:00 2001 From: filzrev <103790468+filzrev@users.noreply.github.com> Date: Mon, 14 Apr 2025 16:52:09 +0000 Subject: [PATCH 2/3] test(snapshot): update snapshots 88cc556a9b2529ea1a2de94a55b8ca123b0c7a05 --- ...terfaces.IGetNext-1.html.view.verified.json | 18 ++++++++++++++++++ ...t.Class1.IIssue8948.html.view.verified.json | 18 ++++++++++++++++++ ...736.IJsonApiOptions.html.view.verified.json | 18 ++++++++++++++++++ .../CatLibrary.IAnimal.html.view.verified.json | 18 ++++++++++++++++++ 4 files changed, 72 insertions(+) diff --git a/test/docfx.Snapshot.Tests/SamplesTest.CSharp/api/CSharp11.StaticAbstractMembersInInterfaces.IGetNext-1.html.view.verified.json b/test/docfx.Snapshot.Tests/SamplesTest.CSharp/api/CSharp11.StaticAbstractMembersInInterfaces.IGetNext-1.html.view.verified.json index a550122c93e..8ce41735e97 100644 --- a/test/docfx.Snapshot.Tests/SamplesTest.CSharp/api/CSharp11.StaticAbstractMembersInInterfaces.IGetNext-1.html.view.verified.json +++ b/test/docfx.Snapshot.Tests/SamplesTest.CSharp/api/CSharp11.StaticAbstractMembersInInterfaces.IGetNext-1.html.view.verified.json @@ -396,6 +396,24 @@ } ] }, + "derivedClasses": [ + { + "isEii": false, + "isExtensionMethod": false, + "specName": [ + { + "lang": "csharp", + "value": "" + }, + { + "lang": "vb", + "value": "" + } + ], + "level": 0, + "index": 1 + } + ], "level": 0, "_systemKeys": [ "uid", diff --git a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/BuildFromProject.Class1.IIssue8948.html.view.verified.json b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/BuildFromProject.Class1.IIssue8948.html.view.verified.json index 29157d2d34e..838e806223b 100644 --- a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/BuildFromProject.Class1.IIssue8948.html.view.verified.json +++ b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/BuildFromProject.Class1.IIssue8948.html.view.verified.json @@ -305,6 +305,24 @@ } ] }, + "derivedClasses": [ + { + "isEii": false, + "isExtensionMethod": false, + "specName": [ + { + "lang": "csharp", + "value": "" + }, + { + "lang": "vb", + "value": "" + } + ], + "level": 0, + "index": 1 + } + ], "level": 0, "_appName": "Seed", "_appTitle": "docfx seed website", 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 index d0666050a9e..49fe6065d99 100644 --- 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 @@ -348,6 +348,24 @@ } ] }, + "derivedClasses": [ + { + "isEii": false, + "isExtensionMethod": false, + "specName": [ + { + "lang": "csharp", + "value": "" + }, + { + "lang": "vb", + "value": "" + } + ], + "level": 0, + "index": 1 + } + ], "level": 0, "_appName": "Seed", "_appTitle": "docfx seed website", diff --git a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/CatLibrary.IAnimal.html.view.verified.json b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/CatLibrary.IAnimal.html.view.verified.json index 3d76c107a9a..daecc8f53e9 100644 --- a/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/CatLibrary.IAnimal.html.view.verified.json +++ b/test/docfx.Snapshot.Tests/SamplesTest.Seed/api/CatLibrary.IAnimal.html.view.verified.json @@ -1099,6 +1099,24 @@ } ] }, + "derivedClasses": [ + { + "isEii": false, + "isExtensionMethod": false, + "specName": [ + { + "lang": "csharp", + "value": "" + }, + { + "lang": "vb", + "value": "" + } + ], + "level": 0, + "index": 1 + } + ], "level": 0, "conceptual": "

Welcome to the Animal world!

\n", "_appName": "Seed", From 7184add43cbf2e9b08f63826b01a8c8036b2bdd8 Mon Sep 17 00:00:00 2001 From: filzrev <103790468+filzrev@users.noreply.github.com> Date: Wed, 21 May 2025 19:47:04 +0900 Subject: [PATCH 3/3] chore: fix behaviors for multi-interface implemented class Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../Resolvers/SetDerivedClass.cs | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/Docfx.Dotnet/ManagedReference/Resolvers/SetDerivedClass.cs b/src/Docfx.Dotnet/ManagedReference/Resolvers/SetDerivedClass.cs index c134113a26a..e971fc215b8 100644 --- a/src/Docfx.Dotnet/ManagedReference/Resolvers/SetDerivedClass.cs +++ b/src/Docfx.Dotnet/ManagedReference/Resolvers/SetDerivedClass.cs @@ -49,18 +49,21 @@ private void UpdateDerivedClassMapping(List items, Dictionary 0 }) { - var superClass = implements[implements.Count - 1]; - - if (reference.TryGetValue(superClass, out var referenceItem)) + foreach (var implementedInterface in implements) { - superClass = referenceItem.Definition ?? superClass; - } + var superClass = implementedInterface; + + if (reference.TryGetValue(superClass, out var referenceItem)) + { + superClass = referenceItem.Definition ?? superClass; + } - ref var derivedClasses = ref CollectionsMarshal.GetValueRefOrAddDefault(_derivedClassMapping, superClass, out var exists); - if (exists) - derivedClasses.Add(item.Name); - else - derivedClasses = [item.Name]; + ref var derivedClasses = ref CollectionsMarshal.GetValueRefOrAddDefault(_derivedClassMapping, superClass, out var exists); + if (exists) + derivedClasses.Add(item.Name); + else + derivedClasses = [item.Name]; + } } } }