public void Resolve(ref IRMethod selfReference, IRGenericParameterList typeParams, IRGenericParameterList methodParams) { if (!Resolved || PresolvedMethod || PostsolvedMethod) { IRType t = ParentType; t.Resolve(ref t, typeParams, methodParams); if (IsGeneric) { if (!this.GenericParameters.Resolved) { if (this.PostsolvedMethod) { this.GenericParameters.TrySubstitute(typeParams, methodParams); } else { if (this.PresolvedMethod) { selfReference = Assembly.AppDomain.PresolveGenericMethod(this.GenericMethod, methodParams.ToList(), typeParams.ToList()); } else { selfReference = Assembly.AppDomain.PresolveGenericMethod(this, methodParams.ToList(), typeParams.ToList()); } selfReference.PresolvedMethod = false; selfReference.PostsolvedMethod = true; selfReference.Resolve(ref selfReference, typeParams, methodParams); return; } } if (this.GenericParameters.Resolved) { IRMethod mth = null; if (!t.GenericMethods.TryGetValue(this, out mth)) { IRMethod mth2 = null; mth = this.GenericMethod.Clone(t); mth.GenericParameters.Substitute(t.GenericParameters, this.GenericParameters); if (!t.GenericMethods.TryGetValue(mth, out mth2)) { t.GenericMethods.Add(mth, mth); mth.Substitute(this.GenericParameters); } else { mth = mth2; } } selfReference = mth; } else { // Dia a painful death. // This will eventually need to get the instantiation of this method. } } else { if (t.GenericParameters.Resolved) { selfReference = t.Methods[selfReference.ParentTypeMethodIndex]; selfReference.Resolve(ref selfReference, t.GenericParameters, methodParams); } } } }