Skip to content

Commit d360a6d

Browse files
authored
Fix dump of TypeSpecs (#189)
***NO_CI***
1 parent 165aba6 commit d360a6d

File tree

1 file changed

+52
-11
lines changed

1 file changed

+52
-11
lines changed

MetadataProcessor.Shared/nanoDumperGenerator.cs

Lines changed: 52 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
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

44
using System;
@@ -653,20 +653,19 @@ private void DumpTypeSpecifications(
653653

654654
_tablesContext.TypeSpecificationsTable.TryGetTypeReferenceId(typeReference, out ushort index);
655655

656-
var typeSpec = new TypeSpec();
656+
TypeSpec typeSpec = new TypeSpec();
657657

658658
// assume that real token index is the same as ours
659659
// need to add one because ours is 0 indexed
660660
realToken = new MetadataToken(TokenType.TypeSpec, index + 1).ToUInt32().ToString("X8");
661-
662661
typeSpec.ReferenceId = $"[{new nanoMetadataToken(NanoClrTable.TBL_TypeSpec, index)}] /*{realToken}*/";
663662

664663
// build name
665664
StringBuilder typeSpecName = new StringBuilder();
666665

667666
if (typeReference is GenericParameter)
668667
{
669-
var genericParam = typeReference as GenericParameter;
668+
GenericParameter genericParam = typeReference as GenericParameter;
670669

671670
typeSpecName.Append(typeReference.MetadataType);
672671

@@ -683,19 +682,19 @@ private void DumpTypeSpecifications(
683682

684683
typeSpec.Name = typeSpecName.ToString();
685684
}
686-
else if (typeReference is GenericInstanceType)
685+
else if (typeReference is GenericInstanceType genericInstanceType)
687686
{
688687
// type is a GenericInstance
689688
// can't compare with Cecil MetadataToken because the tables have been cleaned-up and re-indexed
690689

691690
typeSpec.Name = typeReference.FullName;
692691

693-
foreach (var mr in _tablesContext.MethodReferencesTable.Items)
692+
foreach (MethodReference mr in _tablesContext.MethodReferencesTable.Items)
694693
{
695694
if (_tablesContext.TypeSpecificationsTable.TryGetTypeReferenceId(mr.DeclaringType, out ushort referenceId) &&
696695
referenceId == index)
697696
{
698-
var memberRef = new MemberRef()
697+
MemberRef memberRef = new MemberRef()
699698
{
700699
Name = mr.Name
701700
};
@@ -712,12 +711,12 @@ private void DumpTypeSpecifications(
712711
}
713712
}
714713

715-
foreach (var ms in _tablesContext.MethodSpecificationTable.Items)
714+
foreach (MethodSpecification ms in _tablesContext.MethodSpecificationTable.Items)
716715
{
717716
if (_tablesContext.TypeSpecificationsTable.TryGetTypeReferenceId(ms.DeclaringType, out ushort referenceId) &&
718717
referenceId == index)
719718
{
720-
var memberRef = new MemberRef()
719+
MemberRef memberRef = new MemberRef()
721720
{
722721
Name = ms.Name
723722
};
@@ -734,21 +733,63 @@ private void DumpTypeSpecifications(
734733
}
735734
}
736735

737-
foreach (var fr in _tablesContext.FieldReferencesTable.Items)
736+
foreach (FieldReference fr in _tablesContext.FieldReferencesTable.Items)
738737
{
739738
if (_tablesContext.TypeSpecificationsTable.TryGetTypeReferenceId(fr.DeclaringType, out ushort referenceId) &&
740739
referenceId == index)
741740
{
742-
var memberRef = new MemberRef()
741+
MemberRef memberRef = new MemberRef()
743742
{
744743
Name = fr.Name
745744
};
745+
746746
if (_tablesContext.FieldReferencesTable.TryGetFieldReferenceId(fr, out ushort fieldRefId))
747747
{
748748
realToken = fr.MetadataToken.ToInt32().ToString("X8");
749749
memberRef.ReferenceId = $"[{new nanoMetadataToken(NanoClrTable.TBL_FieldRef, fieldRefId)}] /*{realToken}*/";
750750
memberRef.Signature = fr.FieldType.TypeSignatureAsString();
751751
}
752+
753+
typeSpec.MemberReferences.Add(memberRef);
754+
}
755+
}
756+
757+
if (genericInstanceType.ElementType is TypeDefinition definition)
758+
{
759+
foreach (MethodDefinition md in definition.Methods)
760+
{
761+
// skip compiler-generated or primitive helpers if you like
762+
MemberRef memberRef = new MemberRef
763+
{
764+
Name = md.Name,
765+
Signature = PrintSignatureForMethod(md)
766+
};
767+
768+
// get the MethodDef RID from your MethodDefinitionTable
769+
if (_tablesContext.MethodDefinitionTable.TryGetMethodReferenceId(md, out ushort defId))
770+
{
771+
realToken = md.MetadataToken.ToInt32().ToString("X8");
772+
memberRef.ReferenceId = $"[{new nanoMetadataToken(NanoClrTable.TBL_MethodDef, defId)}] /*{realToken}*/";
773+
}
774+
775+
typeSpec.MemberReferences.Add(memberRef);
776+
}
777+
778+
// and similarly for fields if you want:
779+
foreach (FieldDefinition fd in definition.Fields)
780+
{
781+
MemberRef memberRef = new MemberRef
782+
{
783+
Name = fd.Name,
784+
Signature = fd.FieldType.TypeSignatureAsString()
785+
};
786+
787+
if (_tablesContext.FieldsTable.TryGetFieldReferenceId(fd, false, out ushort fieldId))
788+
{
789+
realToken = fd.MetadataToken.ToInt32().ToString("X8");
790+
memberRef.ReferenceId = $"[{new nanoMetadataToken(NanoClrTable.TBL_FieldDef, fieldId)}] /*{realToken}*/";
791+
}
792+
752793
typeSpec.MemberReferences.Add(memberRef);
753794
}
754795
}

0 commit comments

Comments
 (0)