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