using Jint.Runtime; namespace Jint.Native; /// /// Private names are a bit like symbols, they follow reference equality so that each one is globally to object, /// only exception to the rule is get/set pair which should share same private name. /// internal sealed class PrivateName : JsValue, IEquatable { private readonly PrivateIdentifier _identifier; public PrivateName(PrivateIdentifier identifier) : base(InternalTypes.PrivateName) { _identifier = identifier; Description = identifier.Name; } public string Description { get; } public override string ToString() => _identifier.Name; public override object ToObject() => throw new NotImplementedException(); public override bool Equals(object? obj) { return Equals(obj as PrivateName); } public override bool Equals(JsValue? other) { return Equals(other as PrivateName); } public bool Equals(PrivateName? other) { if (ReferenceEquals(null, other)) { return false; } if (ReferenceEquals(this, other)) { return true; } return ReferenceEquals(this, other); } public override int GetHashCode() { return StringComparer.Ordinal.GetHashCode(_identifier.Name); } } /// /// Compares private identifiers by their name instead of reference equality. /// internal sealed class PrivateIdentifierNameComparer : IEqualityComparer { internal static readonly PrivateIdentifierNameComparer _instance = new(); public bool Equals(PrivateIdentifier? x, PrivateIdentifier? y) => string.Equals(x?.Name, y?.Name, StringComparison.Ordinal); public int GetHashCode(PrivateIdentifier obj) => StringComparer.Ordinal.GetHashCode(obj.Name); }