///////////////////////////////////////////////////////////////////////////////// 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(); }