From 6e95b21ac5d8d559f52189be5a53aa829dd9e866 Mon Sep 17 00:00:00 2001 From: mkonicek Date: Mon, 21 Mar 2011 18:16:36 +0100 Subject: [PATCH] GridVisualizer - expr is casted to IList correctly. Some code cleanup. --- .../TreeModel/ChildNodesOfObject.cs | 21 +------------ .../Debugger.AddIn/TreeModel/Utils.cs | 31 +++++++++++++++++++ .../GridVisualizerWindow.xaml.cs | 18 +++++------ .../ValueProviders/GridValuesProvider.cs | 4 +-- .../ValueProviders/ListValuesProvider.cs | 18 ++--------- .../Visualizers/Utils/DebuggerHelpers.cs | 10 ------ 6 files changed, 45 insertions(+), 57 deletions(-) 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; - } } }