// TODO: possible optimalization // Cache resolved constant result in FieldBuilder <-> expression map public virtual MemberExpr ResolveMemberAccess (EmitContext ec, Expression left, Location loc, SimpleName original) { // // Precondition: // original == null || original.Resolve (...) ==> left // if (left is TypeExpr) { left = left.ResolveAsBaseTerminal (ec, false); if (left == null) return null; // TODO: Same problem as in class.cs, TypeTerminal does not // always do all necessary checks ObsoleteAttribute oa = AttributeTester.GetObsoleteAttribute (left.Type); if (oa != null && !ec.IsInObsoleteScope) { AttributeTester.Report_ObsoleteMessage (oa, left.GetSignatureForError (), loc); } GenericTypeExpr ct = left as GenericTypeExpr; if (ct != null && !ct.CheckConstraints (ec)) return null; // if (!IsStatic) { SimpleName.Error_ObjectRefRequired (ec, loc, GetSignatureForError ()); return null; } return this; } if (!IsInstance) { if (original != null && original.IdenticalNameAndTypeName (ec, left, loc)) return this; return ResolveExtensionMemberAccess (left); } InstanceExpression = left; return this; }