diff --git a/src/AddIns/Debugger/Debugger.AddIn/TreeModel/ChildNodesOfObject.cs b/src/AddIns/Debugger/Debugger.AddIn/TreeModel/ChildNodesOfObject.cs
index 29697f1b62..0cf271b494 100644
--- a/src/AddIns/Debugger/Debugger.AddIn/TreeModel/ChildNodesOfObject.cs
+++ b/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.
// (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
}
}
- ///
- /// Evaluates System.Collections.ICollection.Count property on given object.
- ///
- /// Evaluating System.Collections.ICollection.Count on targetObject failed.
- 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 PrependNode(TreeNode node, IEnumerable rest)
{
yield return node;
diff --git a/src/AddIns/Debugger/Debugger.AddIn/TreeModel/Utils.cs b/src/AddIns/Debugger/Debugger.AddIn/TreeModel/Utils.cs
index 77faf8d7f6..8cbf563bdb 100644
--- a/src/AddIns/Debugger/Debugger.AddIn/TreeModel/Utils.cs
+++ b/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)
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
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => frame.Continue = false));
Dispatcher.PushFrame(frame);
}
+
+ ///
+ /// Evaluates System.Collections.ICollection.Count property on given object.
+ ///
+ /// Evaluating System.Collections.ICollection.Count on targetObject failed.
+ 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;
+ }
+
+ ///
+ /// Prepends a cast to IList before the given Expression.
+ ///
+ public static Expression CastToIList(this Expression expr)
+ {
+ return new CastExpression(
+ new TypeReference(typeof(IList).FullName),
+ expr.Parenthesize(),
+ CastType.Cast
+ );
+ }
}
public class AbortedBecauseDebuggeeResumedException: System.Exception
diff --git a/src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs b/src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs
index 60e9c0236d..80d4c7ea71 100644
--- a/src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs
+++ b/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.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,20 +126,19 @@ 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;
if (shownValue.Type.ResolveIEnumerableImplementation(out iEnumerableType, out itemType)) {
// original
/*var lazyListViewWrapper = new LazyItemsControl(this.listView, initialIEnumerableItemsCount);
- var enumerableValuesProvider = new EnumerableValuesProvider(val.ExpressionTree, iEnumerableType, itemType);
- lazyListViewWrapper.ItemsSource = new VirtualizingIEnumerable(enumerableValuesProvider.ItemsSource);
- gridValuesProvider = enumerableValuesProvider;*/
+ var enumerableValuesProvider = new EnumerableValuesProvider(val.ExpressionTree, iEnumerableType, itemType);
+ lazyListViewWrapper.ItemsSource = new VirtualizingIEnumerable(enumerableValuesProvider.ItemsSource);
+ 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
}
}
- 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(listValuesProvider);
this.listView.ItemsSource = virtCollection;
return listValuesProvider;
diff --git a/src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ValueProviders/GridValuesProvider.cs b/src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ValueProviders/GridValuesProvider.cs
index c2b75e9bff..f8be3e2ca1 100644
--- a/src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ValueProviders/GridValuesProvider.cs
+++ b/src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ValueProviders/GridValuesProvider.cs
@@ -20,13 +20,11 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer
protected Dictionary 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);
diff --git a/src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ValueProviders/ListValuesProvider.cs b/src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ValueProviders/ListValuesProvider.cs
index aa7e685993..9859524667 100644
--- a/src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ValueProviders/ListValuesProvider.cs
+++ b/src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ValueProviders/ListValuesProvider.cs
@@ -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
{
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
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;
- }
}
}
diff --git a/src/AddIns/Debugger/Debugger.AddIn/Visualizers/Utils/DebuggerHelpers.cs b/src/AddIns/Debugger/Debugger.AddIn/Visualizers/Utils/DebuggerHelpers.cs
index 148d63802a..d384e42113 100644
--- a/src/AddIns/Debugger/Debugger.AddIn/Visualizers/Utils/DebuggerHelpers.cs
+++ b/src/AddIns/Debugger/Debugger.AddIn/Visualizers/Utils/DebuggerHelpers.cs
@@ -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;
- }
}
}