|
// 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 ILLink.RoslynAnalyzer;
using Microsoft.CodeAnalysis;
namespace ILLink.Shared.TypeSystemProxy
{
internal partial struct ParameterProxy
{
public ParameterProxy (IParameterSymbol parameter)
{
Method = new ((IMethodSymbol) parameter.ContainingSymbol);
Index = (ParameterIndex) parameter.Ordinal + (Method.HasImplicitThis () ? 1 : 0);
}
public partial ReferenceKind GetReferenceKind ()
{
if (IsImplicitThis)
return Method.Method.ContainingType.IsValueType
? ReferenceKind.Ref
: ReferenceKind.None;
switch (Method.Method.Parameters[MetadataIndex].RefKind) {
case RefKind.Ref: return ReferenceKind.Ref;
case RefKind.In: return ReferenceKind.In;
case RefKind.Out: return ReferenceKind.Out;
case RefKind.None: return ReferenceKind.None;
default:
Debug.Fail ($"Unexpected RefKind {Method.Method.Parameters[MetadataIndex].RefKind} found on parameter {GetDisplayName ()}");
return ReferenceKind.None;
}
}
/// <summary>
/// Returns the IParameterSymbol representing the parameter. Returns null for the implicit this paramter.
/// </summary>
public IParameterSymbol? ParameterSymbol => IsImplicitThis ? null : Method.Method.Parameters[MetadataIndex];
/// <summary>
/// Returns the IParameterSymbol.Location[0] for the parameter. Returns null for the implicit this paramter.
/// </summary>
public Location? Location => ParameterSymbol?.Locations[0];
public TypeProxy ParameterType
=> IsImplicitThis
? new TypeProxy (Method.Method.ContainingType)
: new TypeProxy (Method.Method.Parameters[MetadataIndex].Type);
public partial string GetDisplayName ()
{
if (IsImplicitThis)
return "this";
return ParameterSymbol!.GetDisplayName ();
}
public partial bool IsTypeOf (string typeName) => ParameterType.IsTypeOf (typeName.Substring (0, typeName.LastIndexOf ('.')), typeName.Substring (1 + typeName.LastIndexOf ('.')));
public bool IsTypeOf (WellKnownType type) => ParameterType.IsTypeOf (type);
}
}
|