public override void Visit(IMethodReference methodReference) { IGenericMethodInstanceReference /*?*/ genericMethodInstanceReference = methodReference.AsGenericMethodInstanceReference; if (genericMethodInstanceReference != null) { this.Visit(genericMethodInstanceReference); return; } if (!alreadySeen.Add(methodReference)) { return; } // If we have a ref to a varargs method then we always generate an entry in the MethodRef table, // even if it is a method in the current module. (Note that we are not *required* to do so if // in fact the number of extra arguments passed is zero; in that case we are permitted to use // an ordinary method def token. We consistently choose to emit a method ref regardless.) IUnitReference /*?*/ definingUnit = TypeHelper.GetDefiningUnitReference(methodReference.GetContainingType(Context), Context); if (definingUnit != null && ReferenceEquals(definingUnit, this.module) && !methodReference.AcceptsExtraArguments) { return; } this.Visit((ITypeMemberReference)methodReference); ISpecializedMethodReference /*?*/ specializedMethodReference = methodReference.AsSpecializedMethodReference; if (specializedMethodReference != null) { IMethodReference unspecializedMethodReference = specializedMethodReference.UnspecializedVersion; this.Visit(unspecializedMethodReference.GetType(Context)); this.Visit(unspecializedMethodReference.GetParameters(Context)); if (unspecializedMethodReference.ReturnValueIsModified) { this.Visit(unspecializedMethodReference.ReturnValueCustomModifiers); } } else { this.Visit(methodReference.GetType(Context)); this.Visit(methodReference.GetParameters(Context)); if (methodReference.ReturnValueIsModified) { this.Visit(methodReference.ReturnValueCustomModifiers); } } if (methodReference.AcceptsExtraArguments) { this.Visit(methodReference.ExtraParameters); } ReserveMethodToken(methodReference); }
private static void VisitMethodReference(IMethodReference methodReference, EmitContext context) { Debug.Assert(methodReference != null); // Visit containing type VisitTypeReference(methodReference.GetContainingType(context), context); // Visit generic arguments if any IGenericMethodInstanceReference genericInstance = methodReference.AsGenericMethodInstanceReference; if (genericInstance != null) { foreach (var arg in genericInstance.GetGenericArguments(context)) { VisitTypeReference(arg, context); } methodReference = genericInstance.GetGenericMethod(context); } // Translate substituted method to original definition ISpecializedMethodReference specializedMethod = methodReference.AsSpecializedMethodReference; if (specializedMethod != null) { methodReference = specializedMethod.UnspecializedVersion; } // Visit parameter types VisitParameters(methodReference.GetParameters(context), context); if (methodReference.AcceptsExtraArguments) { VisitParameters(methodReference.ExtraParameters, context); } // Visit return value type VisitTypeReference(methodReference.GetType(context), context); foreach (var typeModifier in methodReference.RefCustomModifiers) { VisitTypeReference(typeModifier.GetModifier(context), context); } foreach (var typeModifier in methodReference.ReturnValueCustomModifiers) { VisitTypeReference(typeModifier.GetModifier(context), context); } }
public override void Visit(IMethodReference methodReference) { IGenericMethodInstanceReference genericMethodInstanceReference = methodReference.AsGenericMethodInstanceReference; if (genericMethodInstanceReference != null) { this.Visit(genericMethodInstanceReference); return; } if (!alreadySeen.Add(methodReference)) { return; } // If we have a ref to a varargs method then we always generate an entry in the MethodRef table, // even if it is a method in the current module. (Note that we are not *required* to do so if // in fact the number of extra arguments passed is zero; in that case we are permitted to use // an ordinary method def token. We consistently choose to emit a method ref regardless.) IUnitReference definingUnit = MetadataWriter.GetDefiningUnitReference(methodReference.GetContainingType(Context), Context); if (definingUnit != null && ReferenceEquals(definingUnit, this.module) && !methodReference.AcceptsExtraArguments) { return; } this.Visit((ITypeMemberReference)methodReference); ISpecializedMethodReference specializedMethodReference = methodReference.AsSpecializedMethodReference; if (specializedMethodReference != null) { IMethodReference unspecializedMethodReference = specializedMethodReference.UnspecializedVersion; this.Visit(unspecializedMethodReference.GetType(Context)); this.Visit(unspecializedMethodReference.GetParameters(Context)); this.Visit(unspecializedMethodReference.ReturnValueCustomModifiers); } else { this.Visit(methodReference.GetType(Context)); this.Visit(methodReference.GetParameters(Context)); this.Visit(methodReference.ReturnValueCustomModifiers); } if (methodReference.AcceptsExtraArguments) { this.Visit(methodReference.ExtraParameters); } ReserveMethodToken(methodReference); }