示例#1
0
		// 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;
		}