Exemple #1
0
        public override TypeBuilder DefineType()
        {
            if (TypeBuilder != null)
            {
                return(TypeBuilder);
            }

            if (IsTopLevel)
            {
                if (TypeManager.NamespaceClash(Name, Location))
                {
                    return(null);
                }

                ModuleBuilder builder = CodeGen.Module.Builder;

                TypeBuilder = builder.DefineType(
                    Name, TypeAttr, TypeManager.multicast_delegate_type);
            }
            else
            {
                TypeBuilder builder = Parent.TypeBuilder;

                string name = Name.Substring(1 + Name.LastIndexOf('.'));
                TypeBuilder = builder.DefineNestedType(
                    name, TypeAttr, TypeManager.multicast_delegate_type);
            }

            TypeManager.AddUserType(this);

#if GMCS_SOURCE
            if (IsGeneric)
            {
                string[] param_names = new string [TypeParameters.Length];
                for (int i = 0; i < TypeParameters.Length; i++)
                {
                    param_names [i] = TypeParameters [i].Name;
                }

                GenericTypeParameterBuilder[] gen_params;
                gen_params = TypeBuilder.DefineGenericParameters(param_names);

                int offset = CountTypeParameters - CurrentTypeParameters.Length;
                for (int i = offset; i < gen_params.Length; i++)
                {
                    CurrentTypeParameters [i - offset].Define(gen_params [i]);
                }

                foreach (TypeParameter type_param in CurrentTypeParameters)
                {
                    if (!type_param.Resolve(this))
                    {
                        return(null);
                    }
                }

                Expression current = new SimpleName(
                    MemberName.Basename, TypeParameters, Location);
                current = current.ResolveAsTypeTerminal(this, false);
                if (current == null)
                {
                    return(null);
                }

                CurrentType = current.Type;
            }
#endif

            return(TypeBuilder);
        }