Skip to content

Commit 88cc556

Browse files
committed
chore: add derivedclass metadata for interface
1 parent 7ec4e8b commit 88cc556

File tree

1 file changed

+33
-13
lines changed

1 file changed

+33
-13
lines changed

src/Docfx.Dotnet/ManagedReference/Resolvers/SetDerivedClass.cs

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
// Licensed to the .NET Foundation under one or more agreements.
1+
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System.Runtime.InteropServices;
45
using Docfx.DataContracts.ManagedReference;
56

67
namespace Docfx.Dotnet;
@@ -22,6 +23,7 @@ private void UpdateDerivedClassMapping(List<MetadataItem> items, Dictionary<stri
2223
{
2324
foreach (var item in items ?? Enumerable.Empty<MetadataItem>())
2425
{
26+
// Handle class inheritance
2527
var inheritance = item.Inheritance;
2628
if (inheritance is { Count: > 0 })
2729
{
@@ -35,15 +37,30 @@ private void UpdateDerivedClassMapping(List<MetadataItem> items, Dictionary<stri
3537
// ignore System.Object's derived class
3638
if (superClass != "System.Object")
3739
{
38-
if (_derivedClassMapping.TryGetValue(superClass, out List<string> derivedClasses))
39-
{
40+
ref var derivedClasses = ref CollectionsMarshal.GetValueRefOrAddDefault(_derivedClassMapping, superClass, out var exists);
41+
if (exists)
4042
derivedClasses.Add(item.Name);
41-
}
4243
else
43-
{
44-
_derivedClassMapping.Add(superClass, [item.Name]);
45-
}
44+
derivedClasses = [item.Name];
45+
}
46+
}
47+
48+
// Handle interface implementations
49+
var implements = item.Implements;
50+
if (implements is { Count: > 0 })
51+
{
52+
var superClass = implements[implements.Count - 1];
53+
54+
if (reference.TryGetValue(superClass, out var referenceItem))
55+
{
56+
superClass = referenceItem.Definition ?? superClass;
4657
}
58+
59+
ref var derivedClasses = ref CollectionsMarshal.GetValueRefOrAddDefault(_derivedClassMapping, superClass, out var exists);
60+
if (exists)
61+
derivedClasses.Add(item.Name);
62+
else
63+
derivedClasses = [item.Name];
4764
}
4865
}
4966
}
@@ -52,13 +69,16 @@ private void AppendDerivedClass(List<MetadataItem> items)
5269
{
5370
foreach (var item in items ?? Enumerable.Empty<MetadataItem>())
5471
{
55-
if (item.Type == MemberType.Class)
72+
switch (item.Type)
5673
{
57-
if (_derivedClassMapping.TryGetValue(item.Name, out List<string> derivedClasses))
58-
{
59-
derivedClasses.Sort();
60-
item.DerivedClasses = derivedClasses;
61-
}
74+
case MemberType.Class:
75+
case MemberType.Interface:
76+
if (_derivedClassMapping.TryGetValue(item.Name, out List<string> derivedClasses))
77+
{
78+
derivedClasses.Sort();
79+
item.DerivedClasses = derivedClasses;
80+
}
81+
continue;
6282
}
6383
}
6484
}

0 commit comments

Comments
 (0)