private TypeArray GetAggregateTypeParameters(Type type, AggregateSymbol agg)
{
if (type.GetTypeInfo().IsGenericType)
{
Type genericDefinition = type.GetTypeInfo().GetGenericTypeDefinition();
Type[] genericArguments = genericDefinition.GetGenericArguments();
List<CType> ctypes = new List<CType>();
int outerParameters = agg.isNested() ? agg.GetOuterAgg().GetTypeVarsAll().size : 0;
for (int i = 0; i < genericArguments.Length; i++)
{
// Suppose we have the following:
//
// class A<A1, A2, ..., An>
// {
// class B<B1, B2, ..., Bm>
// {
// }
// }
//
// B will have m+n generic arguments - { A1, A2, ..., An, B1, B2, ..., Bn }.
// As we enumerate these, we need to skip type parameters whose GenericParameterPosition
// is less than n, since the first n type parameters are { A1, A2, ..., An }.
Type t = genericArguments[i];
if (t.GenericParameterPosition < outerParameters)
{
continue;
}
CType ctype = null;
if (t.IsGenericParameter && t.DeclaringType == genericDefinition)
{
ctype = LoadClassTypeParameter(agg, t);
}
else
{
ctype = GetCTypeFromType(t);
}
// We check to make sure we own the type parameter - this is because we're
// currently calculating TypeArgsThis, NOT TypeArgsAll.
if (ctype.AsTypeParameterType().GetOwningSymbol() == agg)
{
ctypes.Add(ctype);
}
}
return _bsymmgr.AllocParams(ctypes.Count, ctypes.ToArray());
}
return BSYMMGR.EmptyTypeArray();
}