protected virtual bool DoDefineMembers ()
{
if (iface_exprs != null) {
foreach (TypeExpr iface in iface_exprs) {
if (iface == null)
continue;
var iface_type = iface.Type;
// Ensure the base is always setup
var compiled_iface = iface_type.MemberDefinition as Interface;
if (compiled_iface != null)
compiled_iface.Define ();
if (Kind == MemberKind.Interface)
MemberCache.AddInterface (iface_type);
ObsoleteAttribute oa = iface_type.GetAttributeObsolete ();
if (oa != null && !IsObsolete)
AttributeTester.Report_ObsoleteMessage (oa, iface.GetSignatureForError (), Location, Report);
GenericTypeExpr ct = iface as GenericTypeExpr;
if (ct != null) {
// TODO: passing `this' is wrong, should be base type iface instead
TypeManager.CheckTypeVariance (ct.Type, Variance.Covariant, this);
ct.CheckConstraints (this);
if (ct.HasDynamicArguments () && !IsCompilerGenerated) {
Report.Error (1966, iface.Location,
"`{0}': cannot implement a dynamic interface `{1}'",
GetSignatureForError (), iface.GetSignatureForError ());
return false;
}
}
}
}
if (base_type != null) {
ObsoleteAttribute obsolete_attr = base_type.GetAttributeObsolete ();
if (obsolete_attr != null && !IsObsolete)
AttributeTester.Report_ObsoleteMessage (obsolete_attr, base_type.GetSignatureForError (), Location, Report);
var ct = base_type_expr as GenericTypeExpr;
if (ct != null)
ct.CheckConstraints (this);
if (base_type.Interfaces != null) {
foreach (var iface in base_type.Interfaces)
spec.AddInterface (iface);
}
var baseContainer = base_type.MemberDefinition as ClassOrStruct;
if (baseContainer != null) {
baseContainer.Define ();
//
// It can trigger define of this type (for generic types only)
//
if (HasMembersDefined)
return true;
}
}
if (type_params != null) {
foreach (var tp in type_params) {
tp.CheckGenericConstraints ();
}
}
DefineContainerMembers (constants);
DefineContainerMembers (fields);
if (Kind == MemberKind.Struct || Kind == MemberKind.Class) {
pending = PendingImplementation.GetPendingImplementations (this);
if (requires_delayed_unmanagedtype_check) {
requires_delayed_unmanagedtype_check = false;
foreach (FieldBase f in fields) {
if (f.MemberType != null && f.MemberType.IsPointer)
TypeManager.VerifyUnmanaged (Compiler, f.MemberType, f.Location);
}
}
}
//
// Constructors are not in the defined_names array
//
DefineContainerMembers (instance_constructors);
DefineContainerMembers (events);
DefineContainerMembers (ordered_explicit_member_list);
DefineContainerMembers (ordered_member_list);
if (operators != null) {
DefineContainerMembers (operators);
CheckPairedOperators ();
}
ComputeIndexerName();
CheckEqualsAndGetHashCode();
if (Kind == MemberKind.Interface && iface_exprs != null) {
MemberCache.RemoveHiddenMembers (spec);
}
return true;
}