| File: System\Xml\Serialization\CodeIdentifiers.cs | Web Access |
| Project: src\runtime\src\libraries\System.Private.Xml\src\System.Private.Xml.csproj (System.Private.Xml) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Collections; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; namespace System.Xml.Serialization { internal sealed class CaseInsensitiveKeyComparer : CaseInsensitiveComparer, IEqualityComparer { public CaseInsensitiveKeyComparer() : base(CultureInfo.CurrentCulture) { } bool IEqualityComparer.Equals(object? x, object? y) { return (Compare(x, y) == 0); } int IEqualityComparer.GetHashCode(object obj) { string? s = obj as string; if (s == null) throw new ArgumentException(null, nameof(obj)); return CultureInfo.CurrentCulture.TextInfo.ToUpper(s).GetHashCode(); } } ///<internalonly/> /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public class CodeIdentifiers { private Hashtable _identifiers; private Hashtable _reservedIdentifiers; private ArrayList _list; private bool _camelCase; public CodeIdentifiers() : this(true) { } public CodeIdentifiers(bool caseSensitive) { if (caseSensitive) { _identifiers = new Hashtable(); _reservedIdentifiers = new Hashtable(); } else { IEqualityComparer comparer = new CaseInsensitiveKeyComparer(); _identifiers = new Hashtable(comparer); _reservedIdentifiers = new Hashtable(comparer); } _list = new ArrayList(); } public void Clear() { _identifiers.Clear(); _list.Clear(); } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public bool UseCamelCasing { get { return _camelCase; } set { _camelCase = value; } } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public string MakeRightCase(string identifier) { if (_camelCase) return CodeIdentifier.MakeCamel(identifier); else return CodeIdentifier.MakePascal(identifier); } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public string MakeUnique(string identifier) { if (IsInUse(identifier)) { for (int i = 1; ; i++) { string newIdentifier = identifier + i.ToString(CultureInfo.InvariantCulture); if (!IsInUse(newIdentifier)) { identifier = newIdentifier; break; } } } // Check that we did not violate the identifier length after appending the suffix. if (identifier.Length > CodeIdentifier.MaxIdentifierLength) { return MakeUnique("Item"); } return identifier; } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public void AddReserved(string identifier) { _reservedIdentifiers.Add(identifier, identifier); } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public void RemoveReserved(string identifier) { _reservedIdentifiers.Remove(identifier); } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public string AddUnique(string identifier, object? value) { identifier = MakeUnique(identifier); Add(identifier, value); return identifier; } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public bool IsInUse(string identifier) { return _identifiers.Contains(identifier) || _reservedIdentifiers.Contains(identifier); } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public void Add(string identifier, object? value) { _identifiers.Add(identifier, value); _list.Add(value); } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> public void Remove(string identifier) { _list.Remove(_identifiers[identifier]); _identifiers.Remove(identifier); } /// <devdoc> /// <para>[To be supplied.]</para> /// </devdoc> [RequiresDynamicCode(XmlSerializer.AotSerializationWarning)] public object ToArray(Type type) { //Array array = Array.CreateInstance(type, identifiers.Values.Count); //identifiers.Values.CopyTo(array, 0); Array array = Array.CreateInstance(type, _list.Count); _list.CopyTo(array, 0); return array; } internal CodeIdentifiers Clone() { CodeIdentifiers newIdentifiers = new CodeIdentifiers(); newIdentifiers._identifiers = (Hashtable)_identifiers.Clone(); newIdentifiers._reservedIdentifiers = (Hashtable)_reservedIdentifiers.Clone(); newIdentifiers._list = (ArrayList)_list.Clone(); newIdentifiers._camelCase = _camelCase; return newIdentifiers; } } }