Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
UnaryExpression.cs
Go to the documentation of this file.
5
7
8[DebuggerTypeProxy(typeof(UnaryExpressionProxy))]
9public sealed class UnaryExpression : Expression
10{
11 public sealed override Type Type { get; }
12
13 public sealed override ExpressionType NodeType { get; }
14
15 public Expression Operand { get; }
16
17 public MethodInfo? Method { get; }
18
19 public bool IsLifted
20 {
21 get
22 {
23 if (NodeType == ExpressionType.TypeAs || NodeType == ExpressionType.Quote || NodeType == ExpressionType.Throw)
24 {
25 return false;
26 }
27 bool flag = Operand.Type.IsNullableType();
28 bool flag2 = Type.IsNullableType();
29 if (Method != null)
30 {
31 if (!flag || TypeUtils.AreEquivalent(Method.GetParametersCached()[0].ParameterType, Operand.Type))
32 {
33 if (flag2)
34 {
36 }
37 return false;
38 }
39 return true;
40 }
41 return flag || flag2;
42 }
43 }
44
45 public bool IsLiftedToNull
46 {
47 get
48 {
49 if (IsLifted)
50 {
51 return Type.IsNullableType();
52 }
53 return false;
54 }
55 }
56
57 public override bool CanReduce
58 {
59 get
60 {
61 ExpressionType nodeType = NodeType;
62 if ((uint)(nodeType - 77) <= 3u)
63 {
64 return true;
65 }
66 return false;
67 }
68 }
69
70 private bool IsPrefix
71 {
72 get
73 {
74 if (NodeType != ExpressionType.PreIncrementAssign)
75 {
76 return NodeType == ExpressionType.PreDecrementAssign;
77 }
78 return true;
79 }
80 }
81
82 internal UnaryExpression(ExpressionType nodeType, Expression expression, Type type, MethodInfo method)
83 {
84 Operand = expression;
85 Method = method;
86 NodeType = nodeType;
87 Type = type;
88 }
89
90 protected internal override Expression Accept(ExpressionVisitor visitor)
91 {
92 return visitor.VisitUnary(this);
93 }
94
95 public override Expression Reduce()
96 {
97 if (CanReduce)
98 {
99 return Operand.NodeType switch
100 {
101 ExpressionType.Index => ReduceIndex(),
102 ExpressionType.MemberAccess => ReduceMember(),
103 _ => ReduceVariable(),
104 };
105 }
106 return this;
107 }
108
110 {
111 ExpressionType nodeType = ((NodeType != ExpressionType.PreIncrementAssign && NodeType != ExpressionType.PostIncrementAssign) ? ExpressionType.Decrement : ExpressionType.Increment);
112 return new UnaryExpression(nodeType, operand, operand.Type, Method);
113 }
114
116 {
117 if (IsPrefix)
118 {
120 }
121 ParameterExpression parameterExpression = Expression.Parameter(Operand.Type, null);
122 return Expression.Block(new TrueReadOnlyCollection<ParameterExpression>(parameterExpression), new TrueReadOnlyCollection<Expression>(Expression.Assign(parameterExpression, Operand), Expression.Assign(Operand, FunctionalOp(parameterExpression)), parameterExpression));
123 }
124
126 {
127 MemberExpression memberExpression = (MemberExpression)Operand;
128 if (memberExpression.Expression == null)
129 {
130 return ReduceVariable();
131 }
132 ParameterExpression parameterExpression = Expression.Parameter(memberExpression.Expression.Type, null);
133 BinaryExpression binaryExpression = Expression.Assign(parameterExpression, memberExpression.Expression);
134 memberExpression = Expression.MakeMemberAccess(parameterExpression, memberExpression.Member);
135 if (IsPrefix)
136 {
137 return Expression.Block(new TrueReadOnlyCollection<ParameterExpression>(parameterExpression), new TrueReadOnlyCollection<Expression>(binaryExpression, Expression.Assign(memberExpression, FunctionalOp(memberExpression))));
138 }
139 ParameterExpression parameterExpression2 = Expression.Parameter(memberExpression.Type, null);
140 return Expression.Block(new TrueReadOnlyCollection<ParameterExpression>(parameterExpression, parameterExpression2), new TrueReadOnlyCollection<Expression>(binaryExpression, Expression.Assign(parameterExpression2, memberExpression), Expression.Assign(memberExpression, FunctionalOp(parameterExpression2)), parameterExpression2));
141 }
142
144 {
145 bool isPrefix = IsPrefix;
146 IndexExpression indexExpression = (IndexExpression)Operand;
147 int argumentCount = indexExpression.ArgumentCount;
148 Expression[] array = new Expression[argumentCount + (isPrefix ? 2 : 4)];
149 ParameterExpression[] array2 = new ParameterExpression[argumentCount + (isPrefix ? 1 : 2)];
150 ParameterExpression[] array3 = new ParameterExpression[argumentCount];
151 int num = 0;
152 array2[num] = Expression.Parameter(indexExpression.Object.Type, null);
153 array[num] = Expression.Assign(array2[num], indexExpression.Object);
154 for (num++; num <= argumentCount; num++)
155 {
156 Expression argument = indexExpression.GetArgument(num - 1);
157 array3[num - 1] = (array2[num] = Expression.Parameter(argument.Type, null));
158 array[num] = Expression.Assign(array2[num], argument);
159 }
160 ParameterExpression instance = array2[0];
161 PropertyInfo? indexer = indexExpression.Indexer;
162 Expression[] list = array3;
163 indexExpression = Expression.MakeIndex(instance, indexer, new TrueReadOnlyCollection<Expression>(list));
164 if (!isPrefix)
165 {
166 ParameterExpression parameterExpression = (array2[num] = Expression.Parameter(indexExpression.Type, null));
167 array[num] = Expression.Assign(array2[num], indexExpression);
168 num++;
169 array[num++] = Expression.Assign(indexExpression, FunctionalOp(parameterExpression));
170 array[num++] = parameterExpression;
171 }
172 else
173 {
174 array[num++] = Expression.Assign(indexExpression, FunctionalOp(indexExpression));
175 }
177 }
178
180 {
181 if (operand == Operand)
182 {
183 return this;
184 }
185 return Expression.MakeUnary(NodeType, operand, Type, Method);
186 }
187}
static bool AreEquivalent(Type t1, Type t2)
Definition TypeUtils.cs:664
virtual Expression VisitUnary(UnaryExpression node)
static BlockExpression Block(Expression arg0, Expression arg1)
static UnaryExpression MakeUnary(ExpressionType unaryType, Expression operand, Type type)
static BinaryExpression Assign(Expression left, Expression right)
static ParameterExpression Parameter(Type type)
static MemberExpression MakeMemberAccess(Expression? expression, MemberInfo member)
static IndexExpression MakeIndex(Expression instance, PropertyInfo? indexer, IEnumerable< Expression >? arguments)
UnaryExpression(ExpressionType nodeType, Expression expression, Type type, MethodInfo method)
override Expression Accept(ExpressionVisitor visitor)
UnaryExpression Update(Expression operand)
UnaryExpression FunctionalOp(Expression operand)