public virtual void WriteStoreArgument(StoreArgument s, ExpressionUsage u) { Begin(u); Write(s.Parameter.Name + Assign); WriteExpression(s.Value); End(u); }
public override void WriteStoreArgument(StoreArgument s, ExpressionUsage u) { if (s.Parameter.IsReference) { Write(s.Parameter.Name + "("); WriteExpression(s.Value); Write(")"); } else { base.WriteStoreArgument(s, u); } }
public override void End(ref Expression e, ExpressionUsage u) { switch (e.ExpressionType) { case ExpressionType.Lambda: { if (e == _lambda) { var lambda = (Lambda)e; e = new NewDelegate( e.Source, (DelegateType)lambda.ReturnType, _closureStack.Peek().Expression, _lambdaMethod); _lambda = null; _lambdaMethod = null; } break; } case ExpressionType.LoadLocal: { var load = (LoadLocal)e; if (_closureVars.Contains(load.Variable)) { e = _lambda == null ? _closureStack.Peek().Load(load.Variable) : _closureStack.Peek().LoadInside(load.Variable); } break; } case ExpressionType.LoadArgument: { var load = (LoadArgument)e; if (_closureVars.Contains(load.Parameter)) { e = _lambda == null ? _closureStack.Peek().Load(load.Parameter) : _closureStack.Peek().LoadInside(load.Parameter); } else if (load.Function.Match(_ => false, lam => lam == _lambda)) { e = new LoadArgument(load.Source, _lambdaMethod, load.Index); } break; } case ExpressionType.This: { if (_closureVars.This && _lambda != null) { e = _closureStack.Peek().ThisInside(); } break; } case ExpressionType.StoreLocal: { var store = (StoreLocal)e; if (_closureVars.Contains(store.Variable)) { e = _lambda == null ? _closureStack.Peek().Store(store.Variable, store.Value) : _closureStack.Peek().StoreInside(store.Variable, store.Value); } break; } case ExpressionType.StoreArgument: { var store = (StoreArgument)e; if (_closureVars.Contains(store.Parameter)) { e = _lambda == null ? _closureStack.Peek().Store(store.Parameter, store.Value) : _closureStack.Peek().StoreInside(store.Parameter, store.Value); } else if (store.Function.Match(_ => false, lam => lam == _lambda)) { e = new StoreArgument(store.Source, _lambdaMethod, store.Index, store.Value); } break; } case ExpressionType.StoreThis: { var store = (StoreThis)e; if (_closureVars.This) { e = _lambda == null ? _closureStack.Peek().StoreThis(store.Value) : _closureStack.Peek().StoreThisInside(store.Value); } break; } } }