mirror of https://github.com/icsharpcode/ILSpy.git
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							241 lines
						
					
					
						
							6.6 KiB
						
					
					
				
			
		
		
	
	
							241 lines
						
					
					
						
							6.6 KiB
						
					
					
				// Copyright (c) Tunnel Vision Laboratories, LLC. All Rights Reserved. | 
						|
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. | 
						|
 | 
						|
namespace LightJson | 
						|
{ | 
						|
	using System.Collections.Generic; | 
						|
	using System.Diagnostics; | 
						|
	using System.Diagnostics.CodeAnalysis; | 
						|
 | 
						|
	/// <summary> | 
						|
	/// Represents a key-value pair collection of JsonValue objects. | 
						|
	/// </summary> | 
						|
	[DebuggerDisplay("Count = {Count}")] | 
						|
	[DebuggerTypeProxy(typeof(JsonObjectDebugView))] | 
						|
	internal sealed class JsonObject : IEnumerable<KeyValuePair<string, JsonValue>>, IEnumerable<JsonValue> | 
						|
	{ | 
						|
		private IDictionary<string, JsonValue> properties; | 
						|
 | 
						|
		/// <summary> | 
						|
		/// Initializes a new instance of the <see cref="JsonObject"/> class. | 
						|
		/// </summary> | 
						|
		public JsonObject() | 
						|
		{ | 
						|
			this.properties = new Dictionary<string, JsonValue>(); | 
						|
		} | 
						|
 | 
						|
		/// <summary> | 
						|
		/// Gets the number of properties in this JsonObject. | 
						|
		/// </summary> | 
						|
		/// <value>The number of properties in this JsonObject.</value> | 
						|
		public int Count { | 
						|
			get { | 
						|
				return this.properties.Count; | 
						|
			} | 
						|
		} | 
						|
 | 
						|
		/// <summary> | 
						|
		/// Gets or sets the property with the given key. | 
						|
		/// </summary> | 
						|
		/// <param name="key">The key of the property to get or set.</param> | 
						|
		/// <remarks> | 
						|
		/// The getter will return JsonValue.Null if the given key is not assosiated with any value. | 
						|
		/// </remarks> | 
						|
		public JsonValue this[string key] { | 
						|
			get { | 
						|
				JsonValue value; | 
						|
 | 
						|
				if (this.properties.TryGetValue(key, out value)) { | 
						|
					return value; | 
						|
				} else { | 
						|
					return JsonValue.Null; | 
						|
				} | 
						|
			} | 
						|
 | 
						|
			set { | 
						|
				this.properties[key] = value; | 
						|
			} | 
						|
		} | 
						|
 | 
						|
		/// <summary> | 
						|
		/// Adds a key with a null value to this collection. | 
						|
		/// </summary> | 
						|
		/// <param name="key">The key of the property to be added.</param> | 
						|
		/// <remarks>Returns this JsonObject.</remarks> | 
						|
		/// <returns>The <see cref="JsonObject"/> that was added.</returns> | 
						|
		public JsonObject Add(string key) | 
						|
		{ | 
						|
			return this.Add(key, JsonValue.Null); | 
						|
		} | 
						|
 | 
						|
		/// <summary> | 
						|
		/// Adds a value associated with a key to this collection. | 
						|
		/// </summary> | 
						|
		/// <param name="key">The key of the property to be added.</param> | 
						|
		/// <param name="value">The value of the property to be added.</param> | 
						|
		/// <returns>Returns this JsonObject.</returns> | 
						|
		public JsonObject Add(string key, JsonValue value) | 
						|
		{ | 
						|
			this.properties.Add(key, value); | 
						|
			return this; | 
						|
		} | 
						|
 | 
						|
		/// <summary> | 
						|
		/// Removes a property with the given key. | 
						|
		/// </summary> | 
						|
		/// <param name="key">The key of the property to be removed.</param> | 
						|
		/// <returns> | 
						|
		/// Returns true if the given key is found and removed; otherwise, false. | 
						|
		/// </returns> | 
						|
		public bool Remove(string key) | 
						|
		{ | 
						|
			return this.properties.Remove(key); | 
						|
		} | 
						|
 | 
						|
		/// <summary> | 
						|
		/// Clears the contents of this collection. | 
						|
		/// </summary> | 
						|
		/// <returns>Returns this JsonObject.</returns> | 
						|
		public JsonObject Clear() | 
						|
		{ | 
						|
			this.properties.Clear(); | 
						|
			return this; | 
						|
		} | 
						|
 | 
						|
		/// <summary> | 
						|
		/// Changes the key of one of the items in the collection. | 
						|
		/// </summary> | 
						|
		/// <remarks> | 
						|
		/// This method has no effects if the <i>oldKey</i> does not exists. | 
						|
		/// If the <i>newKey</i> already exists, the value will be overwritten. | 
						|
		/// </remarks> | 
						|
		/// <param name="oldKey">The name of the key to be changed.</param> | 
						|
		/// <param name="newKey">The new name of the key.</param> | 
						|
		/// <returns>Returns this JsonObject.</returns> | 
						|
		public JsonObject Rename(string oldKey, string newKey) | 
						|
		{ | 
						|
			if (oldKey == newKey) { | 
						|
				// Renaming to the same name just does nothing | 
						|
				return this; | 
						|
			} | 
						|
 | 
						|
			JsonValue value; | 
						|
 | 
						|
			if (this.properties.TryGetValue(oldKey, out value)) { | 
						|
				this[newKey] = value; | 
						|
				this.Remove(oldKey); | 
						|
			} | 
						|
 | 
						|
			return this; | 
						|
		} | 
						|
 | 
						|
		/// <summary> | 
						|
		/// Determines whether this collection contains an item assosiated with the given key. | 
						|
		/// </summary> | 
						|
		/// <param name="key">The key to locate in this collection.</param> | 
						|
		/// <returns>Returns true if the key is found; otherwise, false.</returns> | 
						|
		public bool ContainsKey(string key) | 
						|
		{ | 
						|
			return this.properties.ContainsKey(key); | 
						|
		} | 
						|
 | 
						|
		/// <summary> | 
						|
		/// Determines whether this collection contains the given JsonValue. | 
						|
		/// </summary> | 
						|
		/// <param name="value">The value to locate in this collection.</param> | 
						|
		/// <returns>Returns true if the value is found; otherwise, false.</returns> | 
						|
		public bool Contains(JsonValue value) | 
						|
		{ | 
						|
			return this.properties.Values.Contains(value); | 
						|
		} | 
						|
 | 
						|
		/// <summary> | 
						|
		/// Returns an enumerator that iterates through this collection. | 
						|
		/// </summary> | 
						|
		/// <returns>The enumerator that iterates through this collection.</returns> | 
						|
		public IEnumerator<KeyValuePair<string, JsonValue>> GetEnumerator() | 
						|
		{ | 
						|
			return this.properties.GetEnumerator(); | 
						|
		} | 
						|
 | 
						|
		/// <summary> | 
						|
		/// Returns an enumerator that iterates through this collection. | 
						|
		/// </summary> | 
						|
		/// <returns>The enumerator that iterates through this collection.</returns> | 
						|
		IEnumerator<JsonValue> IEnumerable<JsonValue>.GetEnumerator() | 
						|
		{ | 
						|
			return this.properties.Values.GetEnumerator(); | 
						|
		} | 
						|
 | 
						|
		/// <summary> | 
						|
		/// Returns an enumerator that iterates through this collection. | 
						|
		/// </summary> | 
						|
		/// <returns>The enumerator that iterates through this collection.</returns> | 
						|
		System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() | 
						|
		{ | 
						|
			return this.GetEnumerator(); | 
						|
		} | 
						|
 | 
						|
		[ExcludeFromCodeCoverage] | 
						|
		private class JsonObjectDebugView | 
						|
		{ | 
						|
			private JsonObject jsonObject; | 
						|
 | 
						|
			public JsonObjectDebugView(JsonObject jsonObject) | 
						|
			{ | 
						|
				this.jsonObject = jsonObject; | 
						|
			} | 
						|
 | 
						|
			[DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] | 
						|
			public KeyValuePair[] Keys { | 
						|
				get { | 
						|
					var keys = new KeyValuePair[this.jsonObject.Count]; | 
						|
 | 
						|
					var i = 0; | 
						|
					foreach (var property in this.jsonObject) { | 
						|
						keys[i] = new KeyValuePair(property.Key, property.Value); | 
						|
						i += 1; | 
						|
					} | 
						|
 | 
						|
					return keys; | 
						|
				} | 
						|
			} | 
						|
 | 
						|
			[DebuggerDisplay("{value.ToString(),nq}", Name = "{key}", Type = "JsonValue({Type})")] | 
						|
			public class KeyValuePair | 
						|
			{ | 
						|
				[DebuggerBrowsable(DebuggerBrowsableState.Never)] | 
						|
				private string key; | 
						|
 | 
						|
				[DebuggerBrowsable(DebuggerBrowsableState.Never)] | 
						|
				private JsonValue value; | 
						|
 | 
						|
				public KeyValuePair(string key, JsonValue value) | 
						|
				{ | 
						|
					this.key = key; | 
						|
					this.value = value; | 
						|
				} | 
						|
 | 
						|
				[DebuggerBrowsable(DebuggerBrowsableState.RootHidden)] | 
						|
				public object View { | 
						|
					get { | 
						|
						if (this.value.IsJsonObject) { | 
						|
							return (JsonObject)this.value; | 
						|
						} else if (this.value.IsJsonArray) { | 
						|
							return (JsonArray)this.value; | 
						|
						} else { | 
						|
							return this.value; | 
						|
						} | 
						|
					} | 
						|
				} | 
						|
 | 
						|
				[DebuggerBrowsable(DebuggerBrowsableState.Never)] | 
						|
				private JsonValueType Type { | 
						|
					get { | 
						|
						return this.value.Type; | 
						|
					} | 
						|
				} | 
						|
			} | 
						|
		} | 
						|
	} | 
						|
}
 | 
						|
 |