Browse Source

Re-implement support for IEnumerable<T> in tooltips

newNRvisualizers
David Srbecký 13 years ago
parent
commit
ce93c593ad
  1. 42
      src/AddIns/Debugger/Debugger.AddIn/TreeModel/ValueNode.cs

42
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( yield return new TreeNode(
"IList", "IList",
() => GetIListChildren(GetValue) () => GetIListChildren(GetValue)
); );
} else { }
//DebugType iEnumerableType, itemType;
#warning reimplement this! // IEnumberable<T> (pottentially several of them)
// if (shownType.ResolveIEnumerableImplementation(out iEnumerableType, out itemType)) { var ienumerableTypes = shownType.GetAllBaseTypes().OfType<ParameterizedType>().Where(p => p.IsKnownType(KnownTypeCode.IEnumerableOfT));
// yield return new TreeNode( foreach(var ienumerableType in ienumerableTypes) {
// null, var ienumerableTypeCopy = ienumerableType;
// "IEnumerable", yield return new TreeNode(
// "Expanding will enumerate the IEnumerable", null,
// string.Empty, ienumerableType.Name,
// () => GetIListChildren(() => DebuggerHelpers.CreateListFromIEnumerable(GetValue())) 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)) { foreach(TreeNode node in GetMembers(publicInstance)) {
@ -374,6 +380,16 @@ namespace Debugger.AddIn.TreeModel
} }
} }
/// <summary> Evaluates 'new List&lt;T&gt;(iEnumerableValue)' in the debuggee. </summary>
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<TreeNode> GetArrayChildren(uint[] dimBase, uint[] dimSize) IEnumerable<TreeNode> GetArrayChildren(uint[] dimBase, uint[] dimSize)
{ {
const int MaxElementCount = 100; const int MaxElementCount = 100;

Loading…
Cancel
Save