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

71 lines
2.5 KiB
C#

using System.Collections.Immutable;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Symbols;
internal sealed class OverriddenOrHiddenMembersResult
{
public static readonly OverriddenOrHiddenMembersResult Empty = new OverriddenOrHiddenMembersResult(ImmutableArray<Symbol>.Empty, ImmutableArray<Symbol>.Empty);
private readonly ImmutableArray<Symbol> _overriddenMembers;
private readonly ImmutableArray<Symbol> _hiddenMembers;
public ImmutableArray<Symbol> OverriddenMembers => _overriddenMembers;
public ImmutableArray<Symbol> HiddenMembers => _hiddenMembers;
private OverriddenOrHiddenMembersResult(ImmutableArray<Symbol> overriddenMembers, ImmutableArray<Symbol> hiddenMembers)
{
_overriddenMembers = overriddenMembers;
_hiddenMembers = hiddenMembers;
}
public static OverriddenOrHiddenMembersResult Create(ImmutableArray<Symbol> overriddenMembers, ImmutableArray<Symbol> hiddenMembers)
{
if (overriddenMembers.IsEmpty && hiddenMembers.IsEmpty)
{
return Empty;
}
return new OverriddenOrHiddenMembersResult(overriddenMembers, hiddenMembers);
}
internal static Symbol GetOverriddenMember(Symbol substitutedOverridingMember, Symbol overriddenByDefinitionMember)
{
if ((object)overriddenByDefinitionMember != null)
{
NamedTypeSymbol containingType = overriddenByDefinitionMember.ContainingType;
NamedTypeSymbol originalDefinition = containingType.OriginalDefinition;
NamedTypeSymbol baseTypeNoUseSiteDiagnostics = substitutedOverridingMember.ContainingType.BaseTypeNoUseSiteDiagnostics;
while ((object)baseTypeNoUseSiteDiagnostics != null)
{
if (TypeSymbol.Equals(baseTypeNoUseSiteDiagnostics.OriginalDefinition, originalDefinition, (TypeCompareKind)0))
{
if (TypeSymbol.Equals(baseTypeNoUseSiteDiagnostics, containingType, (TypeCompareKind)0))
{
return overriddenByDefinitionMember;
}
return overriddenByDefinitionMember.OriginalDefinition.SymbolAsMember(baseTypeNoUseSiteDiagnostics);
}
baseTypeNoUseSiteDiagnostics = baseTypeNoUseSiteDiagnostics.BaseTypeNoUseSiteDiagnostics;
}
throw ExceptionUtilities.Unreachable("/_/src/Compilers/CSharp/Portable/Symbols/OverriddenOrHiddenMembersResult.cs", 77);
}
return null;
}
internal Symbol GetOverriddenMember()
{
ImmutableArray<Symbol>.Enumerator enumerator = _overriddenMembers.GetEnumerator();
while (enumerator.MoveNext())
{
Symbol current = enumerator.Current;
if (current.IsAbstract || current.IsVirtual || current.IsOverride)
{
return current;
}
}
return null;
}
}