internal RubyOverloadGroupInfo(OverloadInfo/*!*/[]/*!*/ methods, RubyModule/*!*/ declaringModule, RubyOverloadGroupInfo/*!*/[] overloadOwners, bool isStatic) : base(methods, declaringModule, isStatic) { Debug.Assert(overloadOwners == null || methods.Length == overloadOwners.Length); _overloadOwners = overloadOwners; }
private RubyOverloadGroupInfo/*!*/ MakeGroup(ICollection<ClrOverloadInfo>/*!*/ allMethods) { var overloads = new OverloadInfo[allMethods.Count]; var overloadOwners = new RubyOverloadGroupInfo[overloads.Length]; int i = 0; foreach (var entry in allMethods) { overloads[i] = entry.Overload; overloadOwners[i] = entry.Owner; i++; } var result = new RubyOverloadGroupInfo(overloads, this, overloadOwners, _isSingletonClass); // update ownership of overloads owned by the new group: foreach (var entry in allMethods) { if (entry.Owner != null) { entry.Owner.CachedInGroup(result); } else { entry.Owner = result; } } return result; }
// Returns the number of methods newly added to the dictionary. private bool AddMethodsOverwriteExisting(ref Dictionary<Key<string, ValueArray<Type>>, ClrOverloadInfo> methods, IEnumerable<OverloadInfo/*!*/>/*!*/ newOverloads, RubyOverloadGroupInfo/*!*/[] overloadOwners, bool specialNameOnly) { bool anyChange = false; int i = 0; foreach (var method in newOverloads) { if (IsVisible(method.Attributes, method.DeclaringType, specialNameOnly)) { var paramTypes = Key.Create(method.Name, new ValueArray<Type>(ReflectionUtils.GetParameterTypes(method.Parameters))); if (methods == null) { methods = new Dictionary<Key<string, ValueArray<Type>>, ClrOverloadInfo>(); } methods[paramTypes] = new ClrOverloadInfo { Overload = method, Owner = (overloadOwners != null) ? overloadOwners[i] : null }; anyChange = true; } i++; } return anyChange; }
// Returns the number of methods newly added to the dictionary. private bool AddMethodsOverwriteExisting(ref Dictionary<Key<string, ValueArray<Type>>, ClrOverloadInfo> methods, MemberInfo/*!*/[]/*!*/ newOverloads, RubyOverloadGroupInfo/*!*/[] overloadOwners, bool specialNameOnly) { bool anyChange = false; for (int i = 0; i < newOverloads.Length; i++) { var method = (MethodBase)newOverloads[i]; if (IsVisible(method, specialNameOnly)) { var paramTypes = Key.Create(method.Name, new ValueArray<Type>(ReflectionUtils.GetParameterTypes(method.GetParameters()))); if (methods == null) { methods = new Dictionary<Key<string, ValueArray<Type>>, ClrOverloadInfo>(); } methods[paramTypes] = new ClrOverloadInfo { Overload = method, Owner = (overloadOwners != null) ? overloadOwners[i] : null }; anyChange = true; } } return anyChange; }