// 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() }; } } |