Browse Source

GridVisualizer - expr is casted to IList correctly. Some code cleanup.

pull/15/head
mkonicek 15 years ago
parent
commit
6e95b21ac5
  1. 21
      src/AddIns/Debugger/Debugger.AddIn/TreeModel/ChildNodesOfObject.cs
  2. 31
      src/AddIns/Debugger/Debugger.AddIn/TreeModel/Utils.cs
  3. 18
      src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs
  4. 4
      src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ValueProviders/GridValuesProvider.cs
  5. 18
      src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ValueProviders/ListValuesProvider.cs
  6. 10
      src/AddIns/Debugger/Debugger.AddIn/Visualizers/Utils/DebuggerHelpers.cs

21
src/AddIns/Debugger/Debugger.AddIn/TreeModel/ChildNodesOfObject.cs

@ -101,11 +101,7 @@ namespace Debugger.AddIn.TreeModel
// Add a cast, so that we are sure the expression has an indexer. // Add a cast, so that we are sure the expression has an indexer.
// (The expression can be e.g. of type 'object' but its value is a List. // (The expression can be e.g. of type 'object' but its value is a List.
// Without the cast, evaluating "expr[i]" would fail, because object does not have an indexer). // Without the cast, evaluating "expr[i]" would fail, because object does not have an indexer).
targetObject = new CastExpression( targetObject = targetObject.CastToIList();
new TypeReference(typeof(IList).FullName),
targetObject,
CastType.Cast
);
int count = 0; int count = 0;
GetValueException error = null; GetValueException error = null;
try { try {
@ -129,21 +125,6 @@ namespace Debugger.AddIn.TreeModel
} }
} }
/// <summary>
/// Evaluates System.Collections.ICollection.Count property on given object.
/// </summary>
/// <exception cref="GetValueException">Evaluating System.Collections.ICollection.Count on targetObject failed.</exception>
public static int GetIListCount(Expression targetObject)
{
Value list = targetObject.Evaluate(WindowsDebugger.CurrentProcess);
var iCollectionInterface = list.Type.GetInterface(typeof(ICollection).FullName);
if (iCollectionInterface == null)
throw new GetValueException(targetObject, targetObject.PrettyPrint() + " does not implement System.Collections.ICollection");
PropertyInfo countProperty = iCollectionInterface.GetProperty("Count");
// Do not get string representation since it can be printed in hex
return (int)list.GetPropertyValue(countProperty).PrimitiveValue;
}
public static IEnumerable<TreeNode> PrependNode(TreeNode node, IEnumerable<TreeNode> rest) public static IEnumerable<TreeNode> PrependNode(TreeNode node, IEnumerable<TreeNode> rest)
{ {
yield return node; yield return node;

31
src/AddIns/Debugger/Debugger.AddIn/TreeModel/Utils.cs

@ -2,11 +2,15 @@
// This code is distributed under the BSD license (for details please see \src\AddIns\Debugger\Debugger.AddIn\license.txt) // This code is distributed under the BSD license (for details please see \src\AddIns\Debugger\Debugger.AddIn\license.txt)
using System; using System;
using System.Collections;
using System.Diagnostics; using System.Diagnostics;
using System.Reflection;
using System.Windows.Forms; using System.Windows.Forms;
using System.Windows.Threading; using System.Windows.Threading;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.SharpDevelop.Services;
namespace Debugger.AddIn.TreeModel namespace Debugger.AddIn.TreeModel
{ {
@ -31,6 +35,33 @@ namespace Debugger.AddIn.TreeModel
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => frame.Continue = false)); Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => frame.Continue = false));
Dispatcher.PushFrame(frame); Dispatcher.PushFrame(frame);
} }
/// <summary>
/// Evaluates System.Collections.ICollection.Count property on given object.
/// </summary>
/// <exception cref="GetValueException">Evaluating System.Collections.ICollection.Count on targetObject failed.</exception>
public static int GetIListCount(Expression targetObject)
{
Value list = targetObject.Evaluate(WindowsDebugger.CurrentProcess);
var iCollectionInterface = list.Type.GetInterface(typeof(ICollection).FullName);
if (iCollectionInterface == null)
throw new GetValueException(targetObject, targetObject.PrettyPrint() + " does not implement System.Collections.ICollection");
PropertyInfo countProperty = iCollectionInterface.GetProperty("Count");
// Do not get string representation since it can be printed in hex
return (int)list.GetPropertyValue(countProperty).PrimitiveValue;
}
/// <summary>
/// Prepends a cast to IList before the given Expression.
/// </summary>
public static Expression CastToIList(this Expression expr)
{
return new CastExpression(
new TypeReference(typeof(IList).FullName),
expr.Parenthesize(),
CastType.Cast
);
}
} }
public class AbortedBecauseDebuggeeResumedException: System.Exception public class AbortedBecauseDebuggeeResumedException: System.Exception

18
src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs

@ -14,14 +14,15 @@ using System.Windows.Documents;
using System.Windows.Input; using System.Windows.Input;
using System.Windows.Media; using System.Windows.Media;
using Debugger.AddIn.TreeModel;
using Debugger.AddIn.Visualizers.Common; using Debugger.AddIn.Visualizers.Common;
using Debugger.AddIn.Visualizers.PresentationBindings; using Debugger.AddIn.Visualizers.PresentationBindings;
using Debugger.AddIn.Visualizers.Utils; using Debugger.AddIn.Visualizers.Utils;
using Debugger.MetaData; using Debugger.MetaData;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Debugging; using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Services; using ICSharpCode.SharpDevelop.Services;
using ICSharpCode.NRefactory.Ast;
namespace Debugger.AddIn.Visualizers.GridVisualizer namespace Debugger.AddIn.Visualizers.GridVisualizer
{ {
@ -125,20 +126,19 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
// Value is IList // Value is IList
DebugType iListType, listItemType; DebugType iListType, listItemType;
if (shownValue.Type.ResolveIListImplementation(out iListType, out listItemType)) { if (shownValue.Type.ResolveIListImplementation(out iListType, out listItemType)) {
gridValuesProvider = CreateListValuesProvider(shownValue, iListType, listItemType); gridValuesProvider = CreateListValuesProvider(shownExpr.CastToIList(), listItemType);
} else { } else {
// Value is IEnumerable // Value is IEnumerable
DebugType iEnumerableType, itemType; DebugType iEnumerableType, itemType;
if (shownValue.Type.ResolveIEnumerableImplementation(out iEnumerableType, out itemType)) { if (shownValue.Type.ResolveIEnumerableImplementation(out iEnumerableType, out itemType)) {
// original // original
/*var lazyListViewWrapper = new LazyItemsControl<ObjectValue>(this.listView, initialIEnumerableItemsCount); /*var lazyListViewWrapper = new LazyItemsControl<ObjectValue>(this.listView, initialIEnumerableItemsCount);
var enumerableValuesProvider = new EnumerableValuesProvider(val.ExpressionTree, iEnumerableType, itemType); var enumerableValuesProvider = new EnumerableValuesProvider(val.ExpressionTree, iEnumerableType, itemType);
lazyListViewWrapper.ItemsSource = new VirtualizingIEnumerable<ObjectValue>(enumerableValuesProvider.ItemsSource); lazyListViewWrapper.ItemsSource = new VirtualizingIEnumerable<ObjectValue>(enumerableValuesProvider.ItemsSource);
gridValuesProvider = enumerableValuesProvider;*/ gridValuesProvider = enumerableValuesProvider;*/
DebugType debugListType; DebugType debugListType;
var debugListExpression = DebuggerHelpers.CreateDebugListExpression(shownExpr, itemType, out debugListType); var debugListExpression = DebuggerHelpers.CreateDebugListExpression(shownExpr, itemType, out debugListType);
var debugList = debugListExpression.Evaluate(WindowsDebugger.CurrentProcess); gridValuesProvider = CreateListValuesProvider(debugListExpression, itemType);
gridValuesProvider = CreateListValuesProvider(debugList, debugListType, itemType);
} else { } else {
// Value cannot be displayed in GridVisualizer // Value cannot be displayed in GridVisualizer
return; return;
@ -157,9 +157,9 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
} }
} }
ListValuesProvider CreateListValuesProvider(Value targetValue, DebugType iListType, DebugType listItemType) ListValuesProvider CreateListValuesProvider(ICSharpCode.NRefactory.Ast.Expression targetExpression, DebugType listItemType)
{ {
var listValuesProvider = new ListValuesProvider(targetValue, listItemType); var listValuesProvider = new ListValuesProvider(targetExpression, listItemType);
var virtCollection = new VirtualizingCollection<ObjectValue>(listValuesProvider); var virtCollection = new VirtualizingCollection<ObjectValue>(listValuesProvider);
this.listView.ItemsSource = virtCollection; this.listView.ItemsSource = virtCollection;
return listValuesProvider; return listValuesProvider;

4
src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ValueProviders/GridValuesProvider.cs

@ -20,13 +20,11 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
protected Dictionary<string, MemberInfo> memberFromNameMap; protected Dictionary<string, MemberInfo> memberFromNameMap;
protected Expression targetObject; protected Expression targetObject;
protected DebugType collectionType;
protected DebugType itemType; protected DebugType itemType;
public GridValuesProvider(Expression targetObject, DebugType collectionType, DebugType itemType) public GridValuesProvider(Expression targetObject, DebugType itemType)
{ {
this.targetObject = targetObject; this.targetObject = targetObject;
this.collectionType = collectionType;
this.itemType = itemType; this.itemType = itemType;
this.memberFromNameMap = this.GetItemTypeMembers().MakeDictionary(memberInfo => memberInfo.Name); this.memberFromNameMap = this.GetItemTypeMembers().MakeDictionary(memberInfo => memberInfo.Name);

18
src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ValueProviders/ListValuesProvider.cs

@ -19,8 +19,8 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
private bool countEvaluated = false; private bool countEvaluated = false;
private int count = -1; private int count = -1;
public ListValuesProvider(Expression targetObject, DebugType iListType, DebugType listItemType) public ListValuesProvider(Expression targetObject, DebugType listItemType)
:base(targetObject, iListType, listItemType) :base(targetObject, listItemType)
{ {
} }
@ -28,7 +28,7 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
{ {
if (!countEvaluated) if (!countEvaluated)
{ {
this.count = evaluateCount(); this.count = Debugger.AddIn.TreeModel.Utils.GetIListCount(this.targetObject);
countEvaluated = true; countEvaluated = true;
} }
return this.count; return this.count;
@ -42,17 +42,5 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
index, index,
this.memberFromNameMap); this.memberFromNameMap);
} }
// TODO move to Utils iListType.EvaluateCount(Expression targetObject)
// or targetObject.EvaluateCount(iListType)
// or targetObject.EvaluateIListCount() <- calls ResolveIListImplementation
int evaluateCount()
{
PropertyInfo countProperty = this.collectionType.GetGenericInterface("System.Collections.Generic.ICollection").GetProperty("Count");
// Do not get string representation since it can be printed in hex later
Value countValue = targetObject.Evaluate(WindowsDebugger.CurrentProcess).GetPropertyValue(countProperty);
//Value countValue = targetObject.AppendMemberReference(countProperty).Evaluate(WindowsDebugger.CurrentProcess);
return (int)countValue.PrimitiveValue;
}
} }
} }

10
src/AddIns/Debugger/Debugger.AddIn/Visualizers/Utils/DebuggerHelpers.cs

@ -110,15 +110,5 @@ namespace Debugger.AddIn.Visualizers.Utils
{ {
return expr.Evaluate(WindowsDebugger.CurrentProcess).GetPermanentReference(); return expr.Evaluate(WindowsDebugger.CurrentProcess).GetPermanentReference();
} }
public static bool IsNull(this Expression expr)
{
return expr.Evaluate(WindowsDebugger.CurrentProcess).IsNull;
}
public static DebugType GetType(this Expression expr)
{
return expr.Evaluate(WindowsDebugger.CurrentProcess).Type;
}
} }
} }

Loading…
Cancel
Save