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;
	}
}