File: Linker\OverrideInformation.cs
Web Access
Project: src\src\tools\illink\src\linker\Mono.Linker.csproj (illink)
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
 
using System.Diagnostics;
using Mono.Cecil;
using System.Diagnostics.CodeAnalysis;
 
namespace Mono.Linker
{
    [DebuggerDisplay("{Override}")]
    public class OverrideInformation
    {
        public MethodDefinition Base { get; }
 
        public MethodDefinition Override { get; }
 
        internal InterfaceImplementor? InterfaceImplementor { get; }
 
        internal OverrideInformation(MethodDefinition @base, MethodDefinition @override, InterfaceImplementor? interfaceImplementor = null)
        {
            Base = @base;
            Override = @override;
            InterfaceImplementor = interfaceImplementor;
            // Ensure we have an interface implementation if the base method is from an interface and the override method is on a class
            Debug.Assert(@base.DeclaringType.IsInterface && interfaceImplementor != null
                        || !@base.DeclaringType.IsInterface && interfaceImplementor == null);
            // Ensure the interfaceImplementor is for the interface we expect
            Debug.Assert(@base.DeclaringType.IsInterface ? interfaceImplementor!.InterfaceType == @base.DeclaringType : true);
        }
 
        public InterfaceImplementation? MatchingInterfaceImplementation
            => InterfaceImplementor?.InterfaceImplementation;
 
        public TypeDefinition? InterfaceType
            => InterfaceImplementor?.InterfaceType;
 
        [MemberNotNullWhen(true, nameof(InterfaceImplementor), nameof(MatchingInterfaceImplementation))]
        public bool IsOverrideOfInterfaceMember
            => InterfaceImplementor != null;
    }
}