Browse Source

Fix order of types in full module output

pull/1198/head
Siegfried Pammer 8 years ago
parent
commit
6b765f98f0
  1. 32
      ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs

32
ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs

@ -71,14 +71,30 @@ namespace ICSharpCode.Decompiler.Metadata @@ -71,14 +71,30 @@ namespace ICSharpCode.Decompiler.Metadata
public static IEnumerable<TypeDefinitionHandle> GetTopLevelTypeDefinitions(this MetadataReader reader)
{
var queue = new Queue<NamespaceDefinition>();
queue.Enqueue(reader.GetNamespaceDefinitionRoot());
while (queue.Count > 0) {
var ns = queue.Dequeue();
foreach (var td in ns.TypeDefinitions)
yield return td;
foreach (var nestedNS in ns.NamespaceDefinitions)
queue.Enqueue(reader.GetNamespaceDefinition(nestedNS));
unsafe HashSet<uint> GetNestedTypes()
{
byte* startPointer = reader.MetadataPointer;
int offset = reader.GetTableMetadataOffset(TableIndex.NestedClass);
int rowSize = reader.GetTableRowSize(TableIndex.NestedClass);
int rowCount = reader.GetTableRowCount(TableIndex.NestedClass);
var typeDefSize = reader.GetReferenceSize(TableIndex.TypeDef);
var set = new HashSet<uint>();
for (int row = 0; row < rowCount; row++) {
byte* ptr = startPointer + offset + rowSize * row;
uint currentTypeRow = typeDefSize == 2 ? *(ushort*)ptr : *(uint*)ptr;
set.Add(currentTypeRow);
}
return set;
}
HashSet<uint> nestedTypes = GetNestedTypes();
foreach (var handle in reader.TypeDefinitions) {
if (!nestedTypes.Contains((uint)reader.GetRowNumber(handle)))
yield return handle;
}
}

Loading…
Cancel
Save