diff --git a/src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs b/src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs index 0c0b06632d..b96d1aa0fa 100644 --- a/src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs +++ b/src/AddIns/Debugger/Debugger.Core/TypeSystemExtensions.cs @@ -28,16 +28,18 @@ namespace Debugger { public readonly Module Module; public Dictionary MetadataTokens = new Dictionary(); + public Dictionary LocalVariableTypes = new Dictionary(); public ModuleMetadataInfo(Module module) { this.Module = module; } - public void AddMetadataToken(IUnresolvedMethod method, CecilLoader loader) + public void AddMethod(IUnresolvedMethod method, CecilLoader loader) { var cecilMethod = loader.GetCecilObject(method); this.MetadataTokens[method] = cecilMethod.MetadataToken.ToUInt32(); + this.LocalVariableTypes[method] = cecilMethod.Body.Variables.Select(v => loader.ReadTypeReference(v.VariableType)).ToArray(); } } @@ -65,21 +67,21 @@ namespace Debugger moduleMetadataInfo.MetadataTokens[member] = cecilMember.MetadataToken.ToUInt32(); } foreach (var member in typeDef.Methods) { - moduleMetadataInfo.AddMetadataToken(member, loader); + moduleMetadataInfo.AddMethod(member, loader); } foreach (var member in typeDef.Properties) { if (member.CanGet) - moduleMetadataInfo.AddMetadataToken(member.Getter, loader); + moduleMetadataInfo.AddMethod(member.Getter, loader); if (member.CanSet) - moduleMetadataInfo.AddMetadataToken(member.Setter, loader); + moduleMetadataInfo.AddMethod(member.Setter, loader); } foreach (var member in typeDef.Events) { if (member.CanAdd) - moduleMetadataInfo.AddMetadataToken(member.AddAccessor, loader); + moduleMetadataInfo.AddMethod(member.AddAccessor, loader); if (member.CanRemove) - moduleMetadataInfo.AddMetadataToken(member.RemoveAccessor, loader); + moduleMetadataInfo.AddMethod(member.RemoveAccessor, loader); if (member.CanInvoke) - moduleMetadataInfo.AddMetadataToken(member.InvokeAccessor, loader); + moduleMetadataInfo.AddMethod(member.InvokeAccessor, loader); } } weakTable.Add(asm, moduleMetadataInfo); @@ -93,7 +95,9 @@ namespace Debugger throw new ArgumentException("The assembly was not from the debugger type system"); return info; } + #endregion + #region GetModule / GetMetadataToken / GetVariableType public static Module GetModule(this IAssembly assembly) { return GetInfo(assembly).Module; @@ -116,6 +120,13 @@ namespace Debugger var info = GetInfo(method.ParentAssembly); return info.MetadataTokens[method.UnresolvedMember]; } + + public static IType GetVariableType(this IMethod method, int index) + { + var info = GetInfo(method.ParentAssembly); + var variableTypes = info.LocalVariableTypes[method.UnresolvedMember]; + return variableTypes[index].Resolve(method.Compilation); + } #endregion #region IType -> ICorDebugType