public override BoundNode VisitFieldAccess(BoundFieldAccess node) { BoundExpression receiverOpt = (BoundExpression)this.Visit(node.ReceiverOpt); TypeSymbol type = this.VisitType(node.Type); var fieldSymbol = ((FieldSymbol)node.FieldSymbol.OriginalDefinition) .AsMember((NamedTypeSymbol)this.VisitType(node.FieldSymbol.ContainingType)); return node.Update(receiverOpt, fieldSymbol, node.ConstantValueOpt, node.ResultKind, type); }
public override BoundNode VisitFieldAccess(BoundFieldAccess node) { var field = node.FieldSymbol; var receiver = node.ReceiverOpt; // if there are any doubts that receiver is a ref type, // assume we will need an address. (that will prevent scheduling of receiver). if (!field.IsStatic) { if (receiver.Type.IsTypeParameter()) { // type parameters must be boxed to access fields. receiver = VisitExpression(receiver, ExprContext.Box); } else { // need address when assigning to a field and receiver is not a reference // when accessing a field of a struct unless we only need Value and Value is preferred. if (receiver.Type.IsValueType && ( _context == ExprContext.AssignmentTarget || _context == ExprContext.Address || CodeGenerator.FieldLoadMustUseRef(receiver))) { receiver = VisitExpression(receiver, ExprContext.Address); } else { receiver = VisitExpression(receiver, ExprContext.Value); } } } else { // for some reason it could be not null even if field is static... // it seems wrong _counter += 1; receiver = null; } return node.Update(receiver, field, node.ConstantValueOpt, node.ResultKind, node.Type); }