Browse Source

Add GetMetadataToken() extension method.

newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
b55a75d3fb
  1. 47
      src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs

47
src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs

@ -27,12 +27,18 @@ namespace Debugger @@ -27,12 +27,18 @@ namespace Debugger
class ModuleMetadataInfo
{
public readonly Module Module;
public Dictionary<IUnresolvedTypeDefinition, uint> MetadataTokens = new Dictionary<IUnresolvedTypeDefinition, uint>();
public Dictionary<IUnresolvedEntity, uint> MetadataTokens = new Dictionary<IUnresolvedEntity, uint>();
public ModuleMetadataInfo(Module module)
{
this.Module = module;
}
public void AddMetadataToken(IUnresolvedMethod method, CecilLoader loader)
{
var cecilMethod = loader.GetCecilObject(method);
this.MetadataTokens[method] = cecilMethod.MetadataToken.ToUInt32();
}
}
internal static Task<IUnresolvedAssembly> LoadModuleAsync(Module module, ICorDebugModule corModule)
@ -49,6 +55,27 @@ namespace Debugger @@ -49,6 +55,27 @@ namespace Debugger
foreach (var typeDef in asm.GetAllTypeDefinitions()) {
var cecilTypeDef = loader.GetCecilObject(typeDef);
moduleMetadataInfo.MetadataTokens[typeDef] = cecilTypeDef.MetadataToken.ToUInt32();
foreach (var member in typeDef.Fields) {
var cecilMember = loader.GetCecilObject(member);
moduleMetadataInfo.MetadataTokens[member] = cecilMember.MetadataToken.ToUInt32();
}
foreach (var member in typeDef.Methods) {
moduleMetadataInfo.AddMetadataToken(member, loader);
}
foreach (var member in typeDef.Properties) {
if (member.CanGet)
moduleMetadataInfo.AddMetadataToken(member.Getter, loader);
if (member.CanSet)
moduleMetadataInfo.AddMetadataToken(member.Setter, loader);
}
foreach (var member in typeDef.Events) {
if (member.CanAdd)
moduleMetadataInfo.AddMetadataToken(member.AddAccessor, loader);
if (member.CanRemove)
moduleMetadataInfo.AddMetadataToken(member.RemoveAccessor, loader);
if (member.CanInvoke)
moduleMetadataInfo.AddMetadataToken(member.InvokeAccessor, loader);
}
}
weakTable.Add(asm, moduleMetadataInfo);
return asm;
@ -67,6 +94,24 @@ namespace Debugger @@ -67,6 +94,24 @@ namespace Debugger
{
return GetInfo(assembly).Module;
}
public static uint GetMetadataToken(this ITypeDefinition typeDefinition)
{
var info = GetInfo(typeDefinition.ParentAssembly);
return info.MetadataTokens[typeDefinition.Parts[0]];
}
public static uint GetMetadataToken(this IField field)
{
var info = GetInfo(field.ParentAssembly);
return info.MetadataTokens[field.UnresolvedMember];
}
public static uint GetMetadataToken(this IMethod method)
{
var info = GetInfo(method.ParentAssembly);
return info.MetadataTokens[method.UnresolvedMember];
}
#endregion
#region IType -> ICorDebugType

Loading…
Cancel
Save