private void LoadNestedTypes() {
Context.RequiresClassHierarchyLock();
Debug.Assert(_constants != null && _constants.Count == 0);
// TODO: Inherited generic overloads. We need a custom TypeGroup to do it right - part of the type group might be removed
// TODO: protected types
var bindingFlags = BindingFlags.Public | BindingFlags.DeclaredOnly;
if (Context.DomainManager.Configuration.PrivateBinding) {
bindingFlags |= BindingFlags.NonPublic;
}
// if the constant is redefined/removed from the base class. This is similar to method overload inheritance.
Type[] types = _typeTracker.Type.GetNestedTypes(bindingFlags);
var trackers = new List<TypeTracker>();
var names = new List<string>();
foreach (var type in types) {
TypeTracker tracker = (NestedTypeTracker)MemberTracker.FromMemberInfo(type);
var name = (type.IsGenericType) ? ReflectionUtils.GetNormalizedTypeName(type) : type.Name;
int index = names.IndexOf(name);
if (index != -1) {
trackers[index] = TypeGroup.UpdateTypeEntity(trackers[index], tracker);
names[index] = name;
} else {
trackers.Add(tracker);
names.Add(name);
}
}
for (int i = 0; i < trackers.Count; i++) {
var tracker = trackers[i];
ConstantStorage storage;
if (tracker is TypeGroup) {
storage = new ConstantStorage(tracker, new WeakReference(tracker));
} else {
var module = Context.GetModule(tracker.Type);
storage = new ConstantStorage(module, module.WeakSelf);
}
_constants[names[i]] = storage;
}
}