TypeParameterSpec[] CreateGenericParameters(MetaType type, TypeSpec declaringType)
{
var tparams = type.GetGenericArguments ();
int parent_owned_count;
if (type.IsNested) {
parent_owned_count = type.DeclaringType.GetGenericArguments ().Length;
//
// System.Reflection duplicates parent type parameters for each
// nested type with slightly modified properties (eg. different owner)
// This just makes things more complicated (think of cloned constraints)
// therefore we remap any nested type owned by parent using `type_cache'
// to the single TypeParameterSpec
//
if (declaringType != null && parent_owned_count > 0) {
int read_count = 0;
while (read_count != parent_owned_count) {
var tparams_count = declaringType.Arity;
if (tparams_count != 0) {
var parent_tp = declaringType.MemberDefinition.TypeParameters;
read_count += tparams_count;
for (int i = 0; i < tparams_count; i++) {
import_cache.Add (tparams[parent_owned_count - read_count + i], parent_tp[i]);
}
}
declaringType = declaringType.DeclaringType;
}
}
} else {
parent_owned_count = 0;
}
if (tparams.Length - parent_owned_count == 0)
return null;
return CreateGenericParameters (parent_owned_count, tparams);
}