From ce93c593ad8f981be80d213cc551d128621292c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Sat, 26 Jan 2013 17:01:39 +0000 Subject: [PATCH] Re-implement support for IEnumerable in tooltips --- .../Debugger.AddIn/TreeModel/ValueNode.cs | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/src/AddIns/Debugger/Debugger.AddIn/TreeModel/ValueNode.cs b/src/AddIns/Debugger/Debugger.AddIn/TreeModel/ValueNode.cs index 682bc6cbfa..32ff870103 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/TreeModel/ValueNode.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/TreeModel/ValueNode.cs @@ -320,23 +320,29 @@ namespace Debugger.AddIn.TreeModel ); } - if (shownType.GetAllBaseTypeDefinitions().Any(t => t.IsKnownType(typeof(IList)))) { + // IList + if (shownType.GetAllBaseTypeDefinitions().Any(t => t.IsKnownType(KnownTypeCode.IList))) { yield return new TreeNode( "IList", () => GetIListChildren(GetValue) ); - } else { - //DebugType iEnumerableType, itemType; - #warning reimplement this! -// if (shownType.ResolveIEnumerableImplementation(out iEnumerableType, out itemType)) { -// yield return new TreeNode( -// null, -// "IEnumerable", -// "Expanding will enumerate the IEnumerable", -// string.Empty, -// () => GetIListChildren(() => DebuggerHelpers.CreateListFromIEnumerable(GetValue())) -// ); -// } + } + + // IEnumberable (pottentially several of them) + var ienumerableTypes = shownType.GetAllBaseTypes().OfType().Where(p => p.IsKnownType(KnownTypeCode.IEnumerableOfT)); + foreach(var ienumerableType in ienumerableTypes) { + var ienumerableTypeCopy = ienumerableType; + yield return new TreeNode( + null, + ienumerableType.Name, + ienumerableType.ReflectionName, + string.Empty, + () => { + // Note that this will bind to the current content forever and it will not reeveluate + Value list = CreateListFromIEnumerable(ienumerableTypeCopy, GetValue()).GetPermanentReferenceOfHeapValue(); + return GetIListChildren(() => list); + } + ); } foreach(TreeNode node in GetMembers(publicInstance)) { @@ -374,6 +380,16 @@ namespace Debugger.AddIn.TreeModel } } + /// Evaluates 'new List<T>(iEnumerableValue)' in the debuggee. + public static Value CreateListFromIEnumerable(ParameterizedType ienumerableType, Value iEnumerableValue) + { + var ilistDef = ienumerableType.Compilation.FindType(typeof(List<>)).GetDefinition(); + var ilistType = new ParameterizedType(ilistDef, ienumerableType.TypeArguments); + var ctors = ilistType.GetConstructors(m => m.Parameters.Count == 1); + var ctor = ctors.Single(m => m.Parameters[0].Type.IsKnownType(KnownTypeCode.IEnumerableOfT)); + return Eval.NewObject(WindowsDebugger.EvalThread, ctor, new Value[] { iEnumerableValue }); + } + IEnumerable GetArrayChildren(uint[] dimBase, uint[] dimSize) { const int MaxElementCount = 100;