| File: Symbols\OverriddenOrHiddenMembersResult.cs | Web Access |
| Project: src\roslyn\src\Compilers\CSharp\Portable\Microsoft.CodeAnalysis.CSharp.csproj (Microsoft.CodeAnalysis.CSharp) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System.Collections.Immutable; using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Text; using System.Diagnostics; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.CSharp.Symbols { /// <summary> /// Groups the information computed by MakeOverriddenOrHiddenMembers. /// </summary> internal sealed class OverriddenOrHiddenMembersResult { public static readonly OverriddenOrHiddenMembersResult Empty = new OverriddenOrHiddenMembersResult( ImmutableArray<Symbol>.Empty, ImmutableArray<Symbol>.Empty); private readonly ImmutableArray<Symbol> _overriddenMembers; public ImmutableArray<Symbol> OverriddenMembers { get { return _overriddenMembers; } } private readonly ImmutableArray<Symbol> _hiddenMembers; public ImmutableArray<Symbol> HiddenMembers { get { return _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; } else { return new OverriddenOrHiddenMembersResult(overriddenMembers, hiddenMembers); } } internal static Symbol GetOverriddenMember(Symbol substitutedOverridingMember, Symbol overriddenByDefinitionMember) { Debug.Assert(!substitutedOverridingMember.IsDefinition); if ((object)overriddenByDefinitionMember != null) { NamedTypeSymbol overriddenByDefinitionContaining = overriddenByDefinitionMember.ContainingType; NamedTypeSymbol overriddenByDefinitionContainingTypeDefinition = overriddenByDefinitionContaining.OriginalDefinition; for (NamedTypeSymbol baseType = substitutedOverridingMember.ContainingType.BaseTypeNoUseSiteDiagnostics; (object)baseType != null; baseType = baseType.BaseTypeNoUseSiteDiagnostics) { if (TypeSymbol.Equals(baseType.OriginalDefinition, overriddenByDefinitionContainingTypeDefinition, TypeCompareKind.ConsiderEverything2)) { if (TypeSymbol.Equals(baseType, overriddenByDefinitionContaining, TypeCompareKind.ConsiderEverything2)) { return overriddenByDefinitionMember; } return overriddenByDefinitionMember.OriginalDefinition.SymbolAsMember(baseType); } } throw ExceptionUtilities.Unreachable(); } return null; } /// <summary> /// It is not suitable to call this method on a <see cref="OverriddenOrHiddenMembersResult"/> object /// associated with a member within substituted type, <see cref="GetOverriddenMember(Symbol, Symbol)"/> /// should be used instead. /// </summary> internal Symbol GetOverriddenMember() { foreach (var overriddenMember in _overriddenMembers) { if (overriddenMember.IsAbstract || overriddenMember.IsVirtual || overriddenMember.IsOverride) { return overriddenMember; } } return null; } } }