godot/modules/mono/glue/GodotSharp/GodotSharp/Core/DebugView.cs

using System;
using System.Collections.Generic;
using System.Diagnostics;

namespace Godot.Collections
{
    internal sealed class ArrayDebugView<T>
    {
        private readonly IList<T> _array;

        public ArrayDebugView(IList<T> array)
        {
            ArgumentNullException.ThrowIfNull(array);

            _array = array;
        }

        [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
        public T[] Items
        {
            get
            {
                var items = new T[_array.Count];
                _array.CopyTo(items, 0);
                return items;
            }
        }
    }

    internal sealed class DictionaryDebugView<TKey, TValue>
    {
        private readonly IDictionary<TKey, TValue> _dictionary;

        public DictionaryDebugView(IDictionary<TKey, TValue> dictionary)
        {
            ArgumentNullException.ThrowIfNull(dictionary);

            _dictionary = dictionary;
        }

        [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
        public DictionaryKeyItemDebugView<TKey, TValue>[] Items
        {
            get
            {
                var items = new KeyValuePair<TKey, TValue>[_dictionary.Count];
                var views = new DictionaryKeyItemDebugView<TKey, TValue>[_dictionary.Count];
                _dictionary.CopyTo(items, 0);
                for (int i = 0; i < items.Length; i++)
                {
                    views[i] = new DictionaryKeyItemDebugView<TKey, TValue>(items[i]);
                }
                return views;
            }
        }
    }

    [DebuggerDisplay("{Value}", Name = "[{Key}]")]
    internal readonly struct DictionaryKeyItemDebugView<TKey, TValue>
    {
        public DictionaryKeyItemDebugView(KeyValuePair<TKey, TValue> keyValue)
        {
            Key = keyValue.Key;
            Value = keyValue.Value;
        }

        [DebuggerBrowsable(DebuggerBrowsableState.Collapsed)]
        public TKey Key { get; }

        [DebuggerBrowsable(DebuggerBrowsableState.Collapsed)]
        public TValue Value { get; }
    }
}