bool CreateTypeBuilder ()
{
//
// Sets .size to 1 for structs with no instance fields
//
int type_size = Kind == MemberKind.Struct && first_nonstatic_field == null ? 1 : 0;
if (IsTopLevel) {
// TODO: Completely wrong
if (Module.GlobalRootNamespace.IsNamespace (Name)) {
Report.Error (519, Location, "`{0}' clashes with a predefined namespace", Name);
}
TypeBuilder = Module.CreateBuilder (Name, TypeAttr, type_size);
} else {
TypeBuilder = Parent.TypeBuilder.DefineNestedType (Basename, TypeAttr, null, type_size);
}
if (DeclaringAssembly.Importer != null)
DeclaringAssembly.Importer.AddCompiledType (TypeBuilder, spec);
spec.SetMetaInfo (TypeBuilder);
spec.MemberCache = new MemberCache (this);
spec.DeclaringType = Parent.CurrentType;
if (!IsTopLevel)
Parent.MemberCache.AddMember (spec);
if (IsGeneric) {
string[] param_names = new string[TypeParameters.Length];
for (int i = 0; i < TypeParameters.Length; i++)
param_names [i] = TypeParameters[i].Name;
all_tp_builders = TypeBuilder.DefineGenericParameters (param_names);
int offset = CurrentTypeParametersStartIndex;
for (int i = offset; i < all_tp_builders.Length; i++) {
CurrentTypeParameters [i - offset].Define (all_tp_builders [i], spec);
}
}
return true;
}