|
23 | 23 | using ICSharpCode.Decompiler.TypeSystem; |
24 | 24 | using ICSharpCode.ILSpy.Properties; |
25 | 25 | using ICSharpCode.ILSpyX; |
26 | | - |
27 | | -using SRM = System.Reflection.Metadata; |
| 26 | +using ICSharpCode.ILSpyX.Analyzers; |
28 | 27 |
|
29 | 28 | namespace ICSharpCode.ILSpy.TreeNodes |
30 | 29 | { |
@@ -57,49 +56,31 @@ protected override void LoadChildren() |
57 | 56 | IEnumerable<ILSpyTreeNode> FetchChildren(CancellationToken cancellationToken) |
58 | 57 | { |
59 | 58 | // 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); |
61 | 60 | } |
62 | 61 |
|
63 | | - internal static IEnumerable<DerivedTypesEntryNode> FindDerivedTypes(AssemblyList list, ITypeDefinition type, |
| 62 | + internal static IEnumerable<DerivedTypesEntryNode> FindDerivedTypes(AssemblyList list, Language language, ITypeDefinition type, |
64 | 63 | CancellationToken cancellationToken) |
65 | 64 | { |
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)) |
70 | 73 | { |
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) |
79 | 75 | { |
80 | 76 | 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) |
90 | 78 | { |
91 | | - yield return new DerivedTypesEntryNode(list, assembly.GetDefinition(h)); |
| 79 | + yield return new DerivedTypesEntryNode(list, td); |
| 80 | + break; |
92 | 81 | } |
93 | 82 | } |
94 | 83 | } |
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); |
103 | 84 | } |
104 | 85 |
|
105 | 86 | public override void Decompile(Language language, ITextOutput output, DecompilationOptions options) |
|
0 commit comments