public override bool Define (TypeContainer parent) { Type t = parent.ResolveType (Type, false, Location); if (t == null) return false; if (!parent.AsAccessible (t, ModFlags)) { Report.Error (52, Location, "Inconsistent accessibility: field type `" + TypeManager.CSharpName (t) + "' is less " + "accessible than field `" + Name + "'"); return false; } if (RootContext.WarningLevel > 1){ Type ptype = parent.TypeBuilder.BaseType; // ptype is only null for System.Object while compiling corlib. if (ptype != null){ TypeContainer.FindMembers ( ptype, MemberTypes.Method, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance, System.Type.FilterName, Name); } } if ((ModFlags & Modifiers.VOLATILE) != 0){ if (!t.IsClass){ Type vt = t; if (TypeManager.IsEnumType (vt)) vt = TypeManager.EnumToUnderlying (t); if (!((vt == TypeManager.bool_type) || (vt == TypeManager.sbyte_type) || (vt == TypeManager.byte_type) || (vt == TypeManager.short_type) || (vt == TypeManager.ushort_type) || (vt == TypeManager.int32_type) || (vt == TypeManager.uint32_type) || (vt == TypeManager.char_type) || (vt == TypeManager.float_type))){ Report.Error ( 677, Location, parent.MakeName (Name) + " A volatile field can not be of type `" + TypeManager.CSharpName (vt) + "'"); return false; } } } FieldAttributes fa = Modifiers.FieldAttr (ModFlags); if (parent is Struct && ((fa & FieldAttributes.Static) == 0) && t == parent.TypeBuilder && !TypeManager.IsBuiltinType (t)){ Report.Error (523, Location, "Struct member `" + parent.Name + "." + Name + "' causes a cycle in the structure layout"); return false; } FieldBuilder = parent.TypeBuilder.DefineField ( Name, t, Modifiers.FieldAttr (ModFlags)); TypeManager.RegisterFieldBase (FieldBuilder, this); return true; }
protected virtual bool DoDefine (TypeContainer parent) { if (Name == null) Name = "this"; if (!parent.MethodModifiersValid (ModFlags, Name, Location)) return false; flags = Modifiers.MethodAttr (ModFlags); // Lookup Type, verify validity MemberType = parent.ResolveType (Type, false, Location); if (MemberType == null) return false; if ((parent.ModFlags & Modifiers.SEALED) != 0){ if ((ModFlags & (Modifiers.VIRTUAL|Modifiers.ABSTRACT)) != 0){ Report.Error (549, Location, "Virtual method can not be contained in sealed class"); return false; } } // verify accessibility if (!parent.AsAccessible (MemberType, ModFlags)) { if (this is Property) Report.Error (53, Location, "Inconsistent accessibility: property type `" + TypeManager.CSharpName (MemberType) + "' is less " + "accessible than property `" + Name + "'"); else if (this is Indexer) Report.Error (54, Location, "Inconsistent accessibility: indexer return type `" + TypeManager.CSharpName (MemberType) + "' is less " + "accessible than indexer `" + Name + "'"); else if (this is Method) Report.Error (50, Location, "Inconsistent accessibility: return type `" + TypeManager.CSharpName (MemberType) + "' is less " + "accessible than method `" + Name + "'"); else Report.Error (52, Location, "Inconsistent accessibility: field type `" + TypeManager.CSharpName (MemberType) + "' is less " + "accessible than field `" + Name + "'"); return false; } if (MemberType.IsPointer && !UnsafeOK (parent)) return false; // // Check for explicit interface implementation // if ((ExplicitInterfaceName == null) && (Name.IndexOf (".") != -1)){ int pos = Name.LastIndexOf ("."); ExplicitInterfaceName = Name.Substring (0, pos); ShortName = Name.Substring (pos + 1); } else ShortName = Name; if (ExplicitInterfaceName != null) { InterfaceType = RootContext.LookupType ( parent, ExplicitInterfaceName, false, Location); if (InterfaceType == null) return false; // Compute the full name that we need to export. Name = InterfaceType.FullName + "." + ShortName; if (!parent.VerifyImplements (InterfaceType, ShortName, Name, Location)) return false; IsExplicitImpl = true; } else IsExplicitImpl = false; return true; }