File: src\tools\illink\src\ILLink.Shared\TypeSystemProxy\ParameterProxy.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;
using System.Collections.Generic;
 
// This is needed due to NativeAOT which doesn't enable nullable globally yet
#nullable enable
 
namespace ILLink.Shared.TypeSystemProxy
{
	internal readonly partial struct ParameterProxy
	{
		public ParameterProxy (MethodProxy method, ParameterIndex index)
		{
			if ((int) index < 0 || (int) index >= method.GetParametersCount ())
				throw new InvalidOperationException ($"Parameter of index {(int) index} does not exist on method {method.GetDisplayName ()} with {method.GetParametersCount ()}");
			Method = method;
			Index = index;
		}
 
		public MethodProxy Method { get; }
 
		public ParameterIndex Index { get; }
 
		/// <summary>
		/// The index of the entry in the '.parameters' metadata section corresponding to this parameter.
		/// Maps to the index of the parameter in Cecil's MethodReference.Parameters or Roslyn's IMethodSymbol.Parameters
		/// Throws if the parameter is the implicit 'this' parameter.
		/// </summary>
		public int MetadataIndex {
			get {
				if (Method.HasImplicitThis ()) {
					if (IsImplicitThis)
						throw new InvalidOperationException ("Cannot get metadata index of the implicit 'this' parameter");
					return (int) Index - 1;
				}
				return (int) Index;
			}
		}
 
		public partial ReferenceKind GetReferenceKind ();
 
		public partial string GetDisplayName ();
 
		public bool IsImplicitThis => Method.HasImplicitThis () && Index == (ParameterIndex) 0;
 
		public partial bool IsTypeOf (string typeName);
 
		public IEnumerable<string> GetDiagnosticArgumentsForAnnotationMismatch ()
			=> IsImplicitThis ?
				new string[] { Method.GetDisplayName () }
 
				: new string[] { GetDisplayName (), Method.GetDisplayName () };
	}
}