using System.Collections.Immutable; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.CSharp.Symbols; internal sealed class OverriddenOrHiddenMembersResult { public static readonly OverriddenOrHiddenMembersResult Empty = new OverriddenOrHiddenMembersResult(ImmutableArray.Empty, ImmutableArray.Empty); private readonly ImmutableArray _overriddenMembers; private readonly ImmutableArray _hiddenMembers; public ImmutableArray OverriddenMembers => _overriddenMembers; public ImmutableArray HiddenMembers => _hiddenMembers; private OverriddenOrHiddenMembersResult(ImmutableArray overriddenMembers, ImmutableArray hiddenMembers) { _overriddenMembers = overriddenMembers; _hiddenMembers = hiddenMembers; } public static OverriddenOrHiddenMembersResult Create(ImmutableArray overriddenMembers, ImmutableArray 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.Enumerator enumerator = _overriddenMembers.GetEnumerator(); while (enumerator.MoveNext()) { Symbol current = enumerator.Current; if (current.IsAbstract || current.IsVirtual || current.IsOverride) { return current; } } return null; } }