Skip to content

Commit 067c0b3

Browse files
Fix #3605: Derived Types from other assemblies shown
1 parent 25ed472 commit 067c0b3

File tree

2 files changed

+16
-35
lines changed

2 files changed

+16
-35
lines changed

ILSpy/TreeNodes/DerivedTypesEntryNode.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ protected override void LoadChildren()
8686
IEnumerable<ILSpyTreeNode> FetchChildren(CancellationToken ct)
8787
{
8888
// FetchChildren() runs on the main thread; but the enumerator will be consumed on a background thread
89-
return DerivedTypesTreeNode.FindDerivedTypes(list, type, ct);
89+
return DerivedTypesTreeNode.FindDerivedTypes(list, Language, type, ct);
9090
}
9191

9292
public override void ActivateItem(IPlatformRoutedEventArgs e)

ILSpy/TreeNodes/DerivedTypesTreeNode.cs

Lines changed: 15 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@
2323
using ICSharpCode.Decompiler.TypeSystem;
2424
using ICSharpCode.ILSpy.Properties;
2525
using ICSharpCode.ILSpyX;
26-
27-
using SRM = System.Reflection.Metadata;
26+
using ICSharpCode.ILSpyX.Analyzers;
2827

2928
namespace ICSharpCode.ILSpy.TreeNodes
3029
{
@@ -57,49 +56,31 @@ protected override void LoadChildren()
5756
IEnumerable<ILSpyTreeNode> FetchChildren(CancellationToken cancellationToken)
5857
{
5958
// FetchChildren() runs on the main thread; but the enumerator will be consumed on a background thread
60-
return FindDerivedTypes(list, type, cancellationToken);
59+
return FindDerivedTypes(list, Language, type, cancellationToken);
6160
}
6261

63-
internal static IEnumerable<DerivedTypesEntryNode> FindDerivedTypes(AssemblyList list, ITypeDefinition type,
62+
internal static IEnumerable<DerivedTypesEntryNode> FindDerivedTypes(AssemblyList list, Language language, ITypeDefinition type,
6463
CancellationToken cancellationToken)
6564
{
66-
var definitionMetadata = type.ParentModule.MetadataFile.Metadata;
67-
var metadataToken = (SRM.TypeDefinitionHandle)type.MetadataToken;
68-
var assemblies = list.GetAllAssemblies().GetAwaiter().GetResult();
69-
foreach (var loadedAssembly in assemblies)
65+
var context = new AnalyzerContext {
66+
CancellationToken = cancellationToken,
67+
Language = language,
68+
AssemblyList = list
69+
};
70+
var scope = context.GetScopeOf(type);
71+
72+
foreach (var td in scope.GetTypesInScope(cancellationToken))
7073
{
71-
var module = loadedAssembly.GetMetadataFileOrNull();
72-
if (module == null)
73-
continue;
74-
var metadata = module.Metadata;
75-
var assembly = module.GetTypeSystemOrNull()?.MainModule as MetadataModule;
76-
if (assembly == null)
77-
continue;
78-
foreach (var h in metadata.TypeDefinitions)
74+
foreach (var baseType in td.DirectBaseTypes)
7975
{
8076
cancellationToken.ThrowIfCancellationRequested();
81-
var td = metadata.GetTypeDefinition(h);
82-
foreach (var iface in td.GetInterfaceImplementations())
83-
{
84-
var ifaceImpl = metadata.GetInterfaceImplementation(iface);
85-
if (!ifaceImpl.Interface.IsNil && IsSameType(metadata, ifaceImpl.Interface, definitionMetadata, metadataToken))
86-
yield return new DerivedTypesEntryNode(list, assembly.GetDefinition(h));
87-
}
88-
SRM.EntityHandle baseType = td.GetBaseTypeOrNil();
89-
if (!baseType.IsNil && IsSameType(metadata, baseType, definitionMetadata, metadataToken))
77+
if (baseType.FullName == type.FullName)
9078
{
91-
yield return new DerivedTypesEntryNode(list, assembly.GetDefinition(h));
79+
yield return new DerivedTypesEntryNode(list, td);
80+
break;
9281
}
9382
}
9483
}
95-
yield break;
96-
}
97-
98-
static bool IsSameType(SRM.MetadataReader referenceMetadata, SRM.EntityHandle typeRef,
99-
SRM.MetadataReader definitionMetadata, SRM.TypeDefinitionHandle typeDef)
100-
{
101-
// FullName contains only namespace, name and type parameter count, therefore this should suffice.
102-
return typeRef.GetFullTypeName(referenceMetadata) == typeDef.GetFullTypeName(definitionMetadata);
10384
}
10485

10586
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)

0 commit comments

Comments
 (0)