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. 12
      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 @@ -101,11 +101,7 @@ namespace Debugger.AddIn.TreeModel
// 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.
// Without the cast, evaluating "expr[i]" would fail, because object does not have an indexer).
targetObject = new CastExpression(
new TypeReference(typeof(IList).FullName),
targetObject,
CastType.Cast
);
targetObject = targetObject.CastToIList();
int count = 0;
GetValueException error = null;
try {
@ -129,21 +125,6 @@ namespace Debugger.AddIn.TreeModel @@ -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)
{
yield return node;

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

@ -2,11 +2,15 @@ @@ -2,11 +2,15 @@
// This code is distributed under the BSD license (for details please see \src\AddIns\Debugger\Debugger.AddIn\license.txt)
using System;
using System.Collections;
using System.Diagnostics;
using System.Reflection;
using System.Windows.Forms;
using System.Windows.Threading;
using ICSharpCode.Core;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.SharpDevelop.Services;
namespace Debugger.AddIn.TreeModel
{
@ -31,6 +35,33 @@ namespace Debugger.AddIn.TreeModel @@ -31,6 +35,33 @@ namespace Debugger.AddIn.TreeModel
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => frame.Continue = false));
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

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

@ -14,14 +14,15 @@ using System.Windows.Documents; @@ -14,14 +14,15 @@ using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using Debugger.AddIn.TreeModel;
using Debugger.AddIn.Visualizers.Common;
using Debugger.AddIn.Visualizers.PresentationBindings;
using Debugger.AddIn.Visualizers.Utils;
using Debugger.MetaData;
using ICSharpCode.NRefactory.Ast;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Services;
using ICSharpCode.NRefactory.Ast;
namespace Debugger.AddIn.Visualizers.GridVisualizer
{
@ -125,7 +126,7 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer @@ -125,7 +126,7 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
// Value is IList
DebugType iListType, listItemType;
if (shownValue.Type.ResolveIListImplementation(out iListType, out listItemType)) {
gridValuesProvider = CreateListValuesProvider(shownValue, iListType, listItemType);
gridValuesProvider = CreateListValuesProvider(shownExpr.CastToIList(), listItemType);
} else {
// Value is IEnumerable
DebugType iEnumerableType, itemType;
@ -137,8 +138,7 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer @@ -137,8 +138,7 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
gridValuesProvider = enumerableValuesProvider;*/
DebugType debugListType;
var debugListExpression = DebuggerHelpers.CreateDebugListExpression(shownExpr, itemType, out debugListType);
var debugList = debugListExpression.Evaluate(WindowsDebugger.CurrentProcess);
gridValuesProvider = CreateListValuesProvider(debugList, debugListType, itemType);
gridValuesProvider = CreateListValuesProvider(debugListExpression, itemType);
} else {
// Value cannot be displayed in GridVisualizer
return;
@ -157,9 +157,9 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer @@ -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);
this.listView.ItemsSource = virtCollection;
return listValuesProvider;

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

@ -20,13 +20,11 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer @@ -20,13 +20,11 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
protected Dictionary<string, MemberInfo> memberFromNameMap;
protected Expression targetObject;
protected DebugType collectionType;
protected DebugType itemType;
public GridValuesProvider(Expression targetObject, DebugType collectionType, DebugType itemType)
public GridValuesProvider(Expression targetObject, DebugType itemType)
{
this.targetObject = targetObject;
this.collectionType = collectionType;
this.itemType = itemType;
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 @@ -19,8 +19,8 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
private bool countEvaluated = false;
private int count = -1;
public ListValuesProvider(Expression targetObject, DebugType iListType, DebugType listItemType)
:base(targetObject, iListType, listItemType)
public ListValuesProvider(Expression targetObject, DebugType listItemType)
:base(targetObject, listItemType)
{
}
@ -28,7 +28,7 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer @@ -28,7 +28,7 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
{
if (!countEvaluated)
{
this.count = evaluateCount();
this.count = Debugger.AddIn.TreeModel.Utils.GetIListCount(this.targetObject);
countEvaluated = true;
}
return this.count;
@ -42,17 +42,5 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer @@ -42,17 +42,5 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
index,
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 @@ -110,15 +110,5 @@ namespace Debugger.AddIn.Visualizers.Utils
{
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