Mono.CSharp.MetadataImporter.CreateGenericParameters C# (CSharp) Method

CreateGenericParameters() private method

private CreateGenericParameters ( Type type, System.TypeSpec declaringType ) : Mono.CSharp.TypeParameterSpec[]
type IKVM.Reflection.Type
declaringType System.TypeSpec
return Mono.CSharp.TypeParameterSpec[]
        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);
        }

Same methods

MetadataImporter::CreateGenericParameters ( int first, Type tparams ) : Mono.CSharp.TypeParameterSpec[]