diff --git a/src/AddIns/Debugger/Debugger.AddIn/TreeModel/ChildNodesOfObject.cs b/src/AddIns/Debugger/Debugger.AddIn/TreeModel/ChildNodesOfObject.cs index 08b296f393..29697f1b62 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/TreeModel/ChildNodesOfObject.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/TreeModel/ChildNodesOfObject.cs @@ -98,7 +98,9 @@ namespace Debugger.AddIn.TreeModel public static IEnumerable LazyGetItemsOfIList(Expression targetObject) { - // This is needed for expanding IEnumerable + // 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, @@ -120,9 +122,9 @@ namespace Debugger.AddIn.TreeModel for(int i = 0; i < count; i++) { string imageName; var image = ExpressionNode.GetImageForArrayIndexer(out imageName); - var expression = new ExpressionNode(image, "[" + i + "]", targetObject.AppendIndexer(i)); - expression.ImageName = imageName; - yield return expression; + var itemNode = new ExpressionNode(image, "[" + i + "]", targetObject.AppendIndexer(i)); + itemNode.ImageName = imageName; + yield return itemNode; } } } 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 d1a1b4d2fd..60e9c0236d 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/GridVisualizerWindow.xaml.cs @@ -105,54 +105,61 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer public void Refresh() { - // clear ListView - listView.ItemsSource = null; - ScrollViewer listViewScroller = listView.GetScrollViewer(); - if (listViewScroller != null) { - listViewScroller.ScrollToVerticalOffset(0); - } - Value shownValue = null; - ICSharpCode.NRefactory.Ast.Expression shownExpr = null; - try { - shownExpr = debuggerService.GetExpression(txtExpression.Text); - shownValue = shownExpr.Evaluate(debuggerService.DebuggedProcess); - } catch(GetValueException) { - // display ex.Message - } - if (shownValue != null && !shownValue.IsNull) { - GridValuesProvider gridValuesProvider; - // Value is IList - DebugType iListType, listItemType; - if (shownValue.Type.ResolveIListImplementation(out iListType, out listItemType)) { - gridValuesProvider = CreateListValuesProvider(shownExpr, iListType, listItemType); - } else { - // Value is IEnumerable - DebugType iEnumerableType, itemType; - if (shownValue.Type.ResolveIEnumerableImplementation(out iEnumerableType, out itemType)) { - // original - /*var lazyListViewWrapper = new LazyItemsControl(this.listView, initialIEnumerableItemsCount); + try { + // clear ListView + listView.ItemsSource = null; + ScrollViewer listViewScroller = listView.GetScrollViewer(); + if (listViewScroller != null) { + listViewScroller.ScrollToVerticalOffset(0); + } + Value shownValue = null; + ICSharpCode.NRefactory.Ast.Expression shownExpr = null; + try { + shownExpr = debuggerService.GetExpression(txtExpression.Text); + shownValue = shownExpr.Evaluate(debuggerService.DebuggedProcess); + } catch(GetValueException) { + // display ex.Message + } + if (shownValue != null && !shownValue.IsNull) { + GridValuesProvider gridValuesProvider; + // Value is IList + DebugType iListType, listItemType; + if (shownValue.Type.ResolveIListImplementation(out iListType, out listItemType)) { + gridValuesProvider = CreateListValuesProvider(shownValue, iListType, 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;*/ - DebugType debugListType; - var debugListExpression = DebuggerHelpers.CreateDebugListExpression(shownExpr, itemType, out debugListType); - gridValuesProvider = CreateListValuesProvider(debugListExpression, debugListType, itemType); - } else { - // Value cannot be displayed in GridVisualizer - return; + DebugType debugListType; + var debugListExpression = DebuggerHelpers.CreateDebugListExpression(shownExpr, itemType, out debugListType); + var debugList = debugListExpression.Evaluate(WindowsDebugger.CurrentProcess); + gridValuesProvider = CreateListValuesProvider(debugList, debugListType, itemType); + } else { + // Value cannot be displayed in GridVisualizer + return; + } } + + IList itemTypeMembers = gridValuesProvider.GetItemTypeMembers(); + InitializeColumns((GridView)this.listView.View, itemTypeMembers); + this.columnHider = new GridViewColumnHider((GridView)this.listView.View); + cmbColumns.ItemsSource = this.columnHider.HideableColumns; } - - IList itemTypeMembers = gridValuesProvider.GetItemTypeMembers(); - InitializeColumns((GridView)this.listView.View, itemTypeMembers); - this.columnHider = new GridViewColumnHider((GridView)this.listView.View); - cmbColumns.ItemsSource = this.columnHider.HideableColumns; + } catch (GetValueException ex) { + // TODO display ex msg + } catch (DebuggerVisualizerException ex) { + // TODO display ex msg } } - ListValuesProvider CreateListValuesProvider(ICSharpCode.NRefactory.Ast.Expression targetObject, DebugType iListType, DebugType listItemType) + ListValuesProvider CreateListValuesProvider(Value targetValue, DebugType iListType, DebugType listItemType) { - var listValuesProvider = new ListValuesProvider(targetObject, iListType, listItemType); + var listValuesProvider = new ListValuesProvider(targetValue, listItemType); var virtCollection = new VirtualizingCollection(listValuesProvider); this.listView.ItemsSource = virtCollection; return listValuesProvider; diff --git a/src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ObjectValue.cs b/src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ObjectValue.cs index b67207fa23..1bdcb1ebec 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ObjectValue.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Visualizers/GridVisualizer/ObjectValue.cs @@ -16,14 +16,10 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer /// public class ObjectValue { - private int index; /// Index of this item in the collection. - public int Index { - get { return index; } - } + public int Index { get; private set; } - // PermanentReference to one row. Even if we used expressions, they are cached using PermanentReferences, so - // one PermanentReference for a row would be created anyway + // PermanentReference for one row. public Value PermanentReference { get; private set; } private Dictionary properties = new Dictionary(); @@ -33,7 +29,7 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer internal ObjectValue(int index, Dictionary memberFromNameMap) { - this.index = index; + this.Index = index; this.memberForNameMap = memberFromNameMap; } @@ -60,7 +56,6 @@ namespace Debugger.AddIn.Visualizers.GridVisualizer } return property; } - //set { properties[key] = value; } } public static ObjectValue Create(Debugger.Value value, int index, Dictionary memberFromName)