mscorlib(4.0.0.0) API with additions
UnaryExpression.cs
1 using System.Diagnostics;
2 using System.Dynamic.Utils;
3 using System.Reflection;
5 
7 {
9  [DebuggerTypeProxy(typeof(UnaryExpressionProxy))]
10  [global::__DynamicallyInvokable]
11  public sealed class UnaryExpression : Expression
12  {
13  private readonly Expression _operand;
14 
15  private readonly MethodInfo _method;
16 
17  private readonly ExpressionType _nodeType;
18 
19  private readonly Type _type;
20 
23  [global::__DynamicallyInvokable]
24  public sealed override Type Type
25  {
26  [global::__DynamicallyInvokable]
27  get
28  {
29  return _type;
30  }
31  }
32 
35  [global::__DynamicallyInvokable]
36  public sealed override ExpressionType NodeType
37  {
38  [global::__DynamicallyInvokable]
39  get
40  {
41  return _nodeType;
42  }
43  }
44 
47  [global::__DynamicallyInvokable]
48  public Expression Operand
49  {
50  [global::__DynamicallyInvokable]
51  get
52  {
53  return _operand;
54  }
55  }
56 
59  [global::__DynamicallyInvokable]
60  public MethodInfo Method
61  {
62  [global::__DynamicallyInvokable]
63  get
64  {
65  return _method;
66  }
67  }
68 
72  [global::__DynamicallyInvokable]
73  public bool IsLifted
74  {
75  [global::__DynamicallyInvokable]
76  get
77  {
78  if (NodeType == ExpressionType.TypeAs || NodeType == ExpressionType.Quote || NodeType == ExpressionType.Throw)
79  {
80  return false;
81  }
82  bool flag = _operand.Type.IsNullableType();
83  bool flag2 = Type.IsNullableType();
84  if (_method != null)
85  {
86  if (!flag || TypeUtils.AreEquivalent(_method.GetParametersCached()[0].ParameterType, _operand.Type))
87  {
88  if (flag2)
89  {
90  return !TypeUtils.AreEquivalent(_method.ReturnType, Type);
91  }
92  return false;
93  }
94  return true;
95  }
96  return flag | flag2;
97  }
98  }
99 
103  [global::__DynamicallyInvokable]
104  public bool IsLiftedToNull
105  {
106  [global::__DynamicallyInvokable]
107  get
108  {
109  if (IsLifted)
110  {
111  return Type.IsNullableType();
112  }
113  return false;
114  }
115  }
116 
119  [global::__DynamicallyInvokable]
120  public override bool CanReduce
121  {
122  [global::__DynamicallyInvokable]
123  get
124  {
125  switch (_nodeType)
126  {
127  case ExpressionType.PreIncrementAssign:
128  case ExpressionType.PreDecrementAssign:
129  case ExpressionType.PostIncrementAssign:
130  case ExpressionType.PostDecrementAssign:
131  return true;
132  default:
133  return false;
134  }
135  }
136  }
137 
138  private bool IsPrefix
139  {
140  get
141  {
142  if (_nodeType != ExpressionType.PreIncrementAssign)
143  {
144  return _nodeType == ExpressionType.PreDecrementAssign;
145  }
146  return true;
147  }
148  }
149 
150  internal UnaryExpression(ExpressionType nodeType, Expression expression, Type type, MethodInfo method)
151  {
152  _operand = expression;
153  _method = method;
154  _nodeType = nodeType;
155  _type = type;
156  }
157 
158  protected internal override Expression Accept(ExpressionVisitor visitor)
159  {
160  return visitor.VisitUnary(this);
161  }
162 
165  [global::__DynamicallyInvokable]
166  public override Expression Reduce()
167  {
168  if (CanReduce)
169  {
170  switch (_operand.NodeType)
171  {
172  case ExpressionType.Index:
173  return ReduceIndex();
174  case ExpressionType.MemberAccess:
175  return ReduceMember();
176  default:
177  return ReduceVariable();
178  }
179  }
180  return this;
181  }
182 
183  private UnaryExpression FunctionalOp(Expression operand)
184  {
185  ExpressionType nodeType = (_nodeType != ExpressionType.PreIncrementAssign && _nodeType != ExpressionType.PostIncrementAssign) ? ExpressionType.Decrement : ExpressionType.Increment;
186  return new UnaryExpression(nodeType, operand, operand.Type, _method);
187  }
188 
189  private Expression ReduceVariable()
190  {
191  if (IsPrefix)
192  {
193  return Expression.Assign(_operand, FunctionalOp(_operand));
194  }
195  ParameterExpression parameterExpression = Expression.Parameter(_operand.Type, null);
196  return Expression.Block(new ParameterExpression[1]
197  {
198  parameterExpression
199  }, Expression.Assign(parameterExpression, _operand), Expression.Assign(_operand, FunctionalOp(parameterExpression)), parameterExpression);
200  }
201 
202  private Expression ReduceMember()
203  {
204  MemberExpression memberExpression = (MemberExpression)_operand;
205  if (memberExpression.Expression == null)
206  {
207  return ReduceVariable();
208  }
209  ParameterExpression parameterExpression = Expression.Parameter(memberExpression.Expression.Type, null);
210  BinaryExpression binaryExpression = Expression.Assign(parameterExpression, memberExpression.Expression);
211  memberExpression = Expression.MakeMemberAccess(parameterExpression, memberExpression.Member);
212  if (IsPrefix)
213  {
214  return Expression.Block(new ParameterExpression[1]
215  {
216  parameterExpression
217  }, binaryExpression, Expression.Assign(memberExpression, FunctionalOp(memberExpression)));
218  }
219  ParameterExpression parameterExpression2 = Expression.Parameter(memberExpression.Type, null);
220  return Expression.Block(new ParameterExpression[2]
221  {
222  parameterExpression,
223  parameterExpression2
224  }, binaryExpression, Expression.Assign(parameterExpression2, memberExpression), Expression.Assign(memberExpression, FunctionalOp(parameterExpression2)), parameterExpression2);
225  }
226 
227  private Expression ReduceIndex()
228  {
229  bool isPrefix = IsPrefix;
230  IndexExpression indexExpression = (IndexExpression)_operand;
231  int count = indexExpression.Arguments.Count;
232  Expression[] array = new Expression[count + (isPrefix ? 2 : 4)];
233  ParameterExpression[] array2 = new ParameterExpression[count + (isPrefix ? 1 : 2)];
234  ParameterExpression[] array3 = new ParameterExpression[count];
235  int num = 0;
236  array2[num] = Expression.Parameter(indexExpression.Object.Type, null);
237  array[num] = Expression.Assign(array2[num], indexExpression.Object);
238  for (num++; num <= count; num++)
239  {
240  Expression expression = indexExpression.Arguments[num - 1];
241  array3[num - 1] = (array2[num] = Expression.Parameter(expression.Type, null));
242  array[num] = Expression.Assign(array2[num], expression);
243  }
244  indexExpression = Expression.MakeIndex(array2[0], indexExpression.Indexer, new TrueReadOnlyCollection<Expression>(array3));
245  if (!isPrefix)
246  {
247  ParameterExpression parameterExpression = array2[num] = Expression.Parameter(indexExpression.Type, null);
248  array[num] = Expression.Assign(array2[num], indexExpression);
249  num++;
250  array[num++] = Expression.Assign(indexExpression, FunctionalOp(parameterExpression));
251  array[num++] = parameterExpression;
252  }
253  else
254  {
255  array[num++] = Expression.Assign(indexExpression, FunctionalOp(indexExpression));
256  }
257  return Expression.Block(new TrueReadOnlyCollection<ParameterExpression>(array2), new TrueReadOnlyCollection<Expression>(array));
258  }
259 
263  [global::__DynamicallyInvokable]
265  {
266  if (operand == Operand)
267  {
268  return this;
269  }
270  return Expression.MakeUnary(NodeType, operand, Type, Method);
271  }
272  }
273 }
sealed override Type Type
Gets the static type of the expression that this T:System.Linq.Expressions.Expression represents.
bool IsLifted
Gets a value that indicates whether the expression tree node represents a lifted call to an operator.
Discovers the attributes of a method and provides access to method metadata.
Definition: MethodInfo.cs:13
Definition: __Canon.cs:3
override Expression Reduce()
Reduces the expression node to a simpler expression.
Provides the base class from which the classes that represent expression tree nodes are derived....
Definition: Expression.cs:17
Represents type declarations: class types, interface types, array types, value types,...
Definition: Type.cs:18
ExpressionType
Describes the node types for the nodes of an expression tree.
MethodInfo Method
Gets the implementing method for the unary operation.
UnaryExpression Update(Expression operand)
Creates a new expression that is like this one, but using the supplied children. If all of the childr...
Represents an expression that has a unary operator.
bool IsLiftedToNull
Gets a value that indicates whether the expression tree node represents a lifted call to an operator ...
Expression Operand
Gets the operand of the unary operation.
sealed override ExpressionType NodeType
Returns the node type of this T:System.Linq.Expressions.Expression.
override bool CanReduce
Gets a value that indicates whether the expression tree node can be reduced.