|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#nullable disable
using System.Collections.Generic;
using System.Diagnostics;
using Microsoft.CodeAnalysis.CSharp.Symbols;
using Microsoft.CodeAnalysis.Emit;
namespace Microsoft.CodeAnalysis.CSharp.Emit
{
/// <summary>
/// Represents a reference to a generic method instantiation, closed over type parameters,
/// e.g. MyNamespace.Class.Method{T}()
/// </summary>
internal sealed class GenericMethodInstanceReference : MethodReference, Cci.IGenericMethodInstanceReference
{
public GenericMethodInstanceReference(MethodSymbol underlyingMethod)
: base(underlyingMethod)
{
}
public override void Dispatch(Cci.MetadataVisitor visitor)
{
visitor.Visit((Cci.IGenericMethodInstanceReference)this);
}
IEnumerable<Cci.ITypeReference> Cci.IGenericMethodInstanceReference.GetGenericArguments(EmitContext context)
{
PEModuleBuilder moduleBeingBuilt = (PEModuleBuilder)context.Module;
foreach (var arg in UnderlyingMethod.TypeArgumentsWithAnnotations)
{
Debug.Assert(arg.CustomModifiers.IsEmpty);
yield return moduleBeingBuilt.Translate(arg.Type, syntaxNodeOpt: (CSharpSyntaxNode)context.SyntaxNode, diagnostics: context.Diagnostics);
}
}
Cci.IMethodReference Cci.IGenericMethodInstanceReference.GetGenericMethod(EmitContext context)
{
// NoPia method might come through here.
return ((PEModuleBuilder)context.Module).Translate(
UnderlyingMethod.OriginalDefinition,
syntaxNodeOpt: (CSharpSyntaxNode)context.SyntaxNode,
diagnostics: context.Diagnostics,
needDeclaration: true);
}
public override Cci.IGenericMethodInstanceReference AsGenericMethodInstanceReference
{
get
{
return this;
}
}
}
}
|