int EnterGenericProvider(IGenericParameterProvider provider, CilType owner, int parameterIndex) { int pos = 0; foreach (var genericElement in provider.GenericParameters) { var item = new GenericStackItem(); item.Name = CilType.GenericParameterFullName(genericElement); ++pos; // index always +1 if (parameterIndex == -1) { item.Index = -pos; item.Type = owner; } else { item.Index = parameterIndex + pos; } items.Add(item); } return(pos); }
void EnterGenericInstance(IGenericInstance instance, IGenericParameterProvider provider) { if (instance.HasGenericArguments) { foreach (var genericElement in provider.GenericParameters) { var item = new GenericStackItem(); var genericArgument = instance.GenericArguments[genericElement.Position]; if (genericArgument is ArrayType genericArgumentAsArray) { item.GenericInstance = genericArgumentAsArray.ElementType as GenericInstanceType; } else { item.GenericInstance = genericArgument as GenericInstanceType; } item.GenericParent = instance; item.Name = CilType.GenericParameterFullName(genericElement); item.Type = CilType.From(genericArgument); items.Add(item); } } }
public void EnterMethod(CilType type, JavaMethodRef method, bool instanceMethod) { // // we expect the method definition to contain the suffix type parameters // (added by CilMethod.ImportGenericParameters), so we subtract their // number to determine the index of the first type parameter. if this // is an instance method, we add one to account for 'this' argument. // var argumentIndex = method.Parameters.Count - type.GenericParameters.Count; if (instanceMethod) { argumentIndex++; } foreach (var genericParameter in type.GenericParameters) { var item = new GenericStackItem(); item.Name = genericParameter.JavaName; item.Index = ++argumentIndex; // index always +1 items.Add(item); } }