From b55a75d3fb11820d992ed18c99d0fa23355ada44 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 9 Jun 2012 10:08:28 +0200 Subject: [PATCH] Add GetMetadataToken() extension method. --- .../Debugger.Core/TypeSystemExtensions.cs | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs b/src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs index 5b918ea900..b0db891ad1 100644 --- a/src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs +++ b/src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs @@ -27,12 +27,18 @@ namespace Debugger class ModuleMetadataInfo { public readonly Module Module; - public Dictionary MetadataTokens = new Dictionary(); + public Dictionary MetadataTokens = new Dictionary(); 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 LoadModuleAsync(Module module, ICorDebugModule corModule) @@ -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 { 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