File: src\tools\illink\src\ILLink.Shared\TypeSystemProxy\ParameterProxy.cs
Web Access
Project: src\src\tools\illink\src\ILLink.RoslynAnalyzer\ILLink.RoslynAnalyzer.csproj (ILLink.RoslynAnalyzer)
// 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() };
    }
}