Files
2026-08-27 10:56:38 -06:00

100 lines
2.5 KiB
C#

using System;
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.PooledObjects;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.SourceGeneration;
internal sealed class GlobalAliases : IEquatable<GlobalAliases>
{
public static readonly GlobalAliases Empty = new GlobalAliases(ImmutableArray<(string, string)>.Empty);
public readonly ImmutableArray<(string aliasName, string symbolName)> AliasAndSymbolNames;
private int _hashCode;
private GlobalAliases(ImmutableArray<(string aliasName, string symbolName)> aliasAndSymbolNames)
{
AliasAndSymbolNames = aliasAndSymbolNames;
}
public static GlobalAliases Create(ImmutableArray<(string aliasName, string symbolName)> aliasAndSymbolNames)
{
if (!aliasAndSymbolNames.IsEmpty)
{
return new GlobalAliases(aliasAndSymbolNames);
}
return Empty;
}
public static GlobalAliases Create(ImmutableArray<GlobalAliases> aliasesArray)
{
if (aliasesArray.Length == 0)
{
return Empty;
}
if (aliasesArray.Length == 1)
{
return aliasesArray[0];
}
ArrayBuilder<(string, string)> instance = ArrayBuilder<(string, string)>.GetInstance(aliasesArray.Sum((GlobalAliases a) => a.AliasAndSymbolNames.Length));
ImmutableArray<GlobalAliases>.Enumerator enumerator = aliasesArray.GetEnumerator();
while (enumerator.MoveNext())
{
GlobalAliases current = enumerator.Current;
instance.AddRange(current.AliasAndSymbolNames);
}
return Create(instance.ToImmutableAndFree());
}
public static GlobalAliases Concat(GlobalAliases ga1, GlobalAliases ga2)
{
if (ga1.AliasAndSymbolNames.Length == 0)
{
return ga2;
}
if (ga2.AliasAndSymbolNames.Length == 0)
{
return ga1;
}
return new GlobalAliases(ga1.AliasAndSymbolNames.Concat(ga2.AliasAndSymbolNames));
}
public override int GetHashCode()
{
if (_hashCode == 0)
{
int num = 0;
ImmutableArray<(string, string)>.Enumerator enumerator = AliasAndSymbolNames.GetEnumerator();
while (enumerator.MoveNext())
{
num = Hash.Combine(enumerator.Current.GetHashCode(), num);
}
_hashCode = ((num == 0) ? 1 : num);
}
return _hashCode;
}
public override bool Equals(object? obj)
{
return Equals(obj as GlobalAliases);
}
public bool Equals(GlobalAliases? aliases)
{
if (aliases == null)
{
return false;
}
if (this == aliases)
{
return true;
}
if (AliasAndSymbolNames == aliases.AliasAndSymbolNames)
{
return true;
}
return AliasAndSymbolNames.AsSpan().SequenceEqual(aliases.AliasAndSymbolNames.AsSpan());
}
}