A game about forced loneliness, made by TACStudios
1using System.Globalization;
2using System.Text;
3
4namespace Unity.VisualScripting.Dependencies.NCalc
5{
6 public class SerializationVisitor : LogicalExpressionVisitor
7 {
8 public SerializationVisitor()
9 {
10 Result = new StringBuilder();
11 _numberFormatInfo = new NumberFormatInfo { NumberDecimalSeparator = "." };
12 }
13
14 private readonly NumberFormatInfo _numberFormatInfo;
15
16 public StringBuilder Result { get; protected set; }
17
18 public override void Visit(TernaryExpression ternary)
19 {
20 EncapsulateNoValue(ternary.LeftExpression);
21
22 Result.Append("? ");
23
24 EncapsulateNoValue(ternary.MiddleExpression);
25
26 Result.Append(": ");
27
28 EncapsulateNoValue(ternary.RightExpression);
29 }
30
31 public override void Visit(BinaryExpression binary)
32 {
33 EncapsulateNoValue(binary.LeftExpression);
34
35 switch (binary.Type)
36 {
37 case BinaryExpressionType.And:
38 Result.Append("and ");
39 break;
40
41 case BinaryExpressionType.Or:
42 Result.Append("or ");
43 break;
44
45 case BinaryExpressionType.Div:
46 Result.Append("/ ");
47 break;
48
49 case BinaryExpressionType.Equal:
50 Result.Append("= ");
51 break;
52
53 case BinaryExpressionType.Greater:
54 Result.Append("> ");
55 break;
56
57 case BinaryExpressionType.GreaterOrEqual:
58 Result.Append(">= ");
59 break;
60
61 case BinaryExpressionType.Lesser:
62 Result.Append("< ");
63 break;
64
65 case BinaryExpressionType.LesserOrEqual:
66 Result.Append("<= ");
67 break;
68
69 case BinaryExpressionType.Minus:
70 Result.Append("- ");
71 break;
72
73 case BinaryExpressionType.Modulo:
74 Result.Append("% ");
75 break;
76
77 case BinaryExpressionType.NotEqual:
78 Result.Append("!= ");
79 break;
80
81 case BinaryExpressionType.Plus:
82 Result.Append("+ ");
83 break;
84
85 case BinaryExpressionType.Times:
86 Result.Append("* ");
87 break;
88
89 case BinaryExpressionType.BitwiseAnd:
90 Result.Append("& ");
91 break;
92
93 case BinaryExpressionType.BitwiseOr:
94 Result.Append("| ");
95 break;
96
97 case BinaryExpressionType.BitwiseXOr:
98 Result.Append("~ ");
99 break;
100
101 case BinaryExpressionType.LeftShift:
102 Result.Append("<< ");
103 break;
104
105 case BinaryExpressionType.RightShift:
106 Result.Append(">> ");
107 break;
108 }
109
110 EncapsulateNoValue(binary.RightExpression);
111 }
112
113 public override void Visit(UnaryExpression unary)
114 {
115 switch (unary.Type)
116 {
117 case UnaryExpressionType.Not:
118 Result.Append("!");
119 break;
120
121 case UnaryExpressionType.Negate:
122 Result.Append("-");
123 break;
124
125 case UnaryExpressionType.BitwiseNot:
126 Result.Append("~");
127 break;
128 }
129
130 EncapsulateNoValue(unary.Expression);
131 }
132
133 public override void Visit(ValueExpression value)
134 {
135 switch (value.Type)
136 {
137 case ValueType.Boolean:
138 Result.Append(value.Value).Append(" ");
139 break;
140
141 case ValueType.DateTime:
142 Result.Append("#").Append(value.Value).Append("#").Append(" ");
143 break;
144
145 case ValueType.Float:
146 Result.Append(decimal.Parse(value.Value.ToString()).ToString(_numberFormatInfo)).Append(" ");
147 break;
148
149 case ValueType.Integer:
150 Result.Append(value.Value).Append(" ");
151 break;
152
153 case ValueType.String:
154 Result.Append("'").Append(value.Value).Append("'").Append(" ");
155 break;
156 }
157 }
158
159 public override void Visit(FunctionExpression function)
160 {
161 Result.Append(function.Identifier.Name);
162
163 Result.Append("(");
164
165 for (var i = 0; i < function.Expressions.Length; i++)
166 {
167 function.Expressions[i].Accept(this);
168
169 if (i < function.Expressions.Length - 1)
170 {
171 Result.Remove(Result.Length - 1, 1);
172 Result.Append(", ");
173 }
174 }
175
176 // Trim spaces before adding a closing parenthesis
177 while (Result[Result.Length - 1] == ' ')
178 {
179 Result.Remove(Result.Length - 1, 1);
180 }
181
182 Result.Append(") ");
183 }
184
185 public override void Visit(IdentifierExpression identifier)
186 {
187 Result.Append("[").Append(identifier.Name).Append("] ");
188 }
189
190 protected void EncapsulateNoValue(LogicalExpression expression)
191 {
192 if (expression is ValueExpression)
193 {
194 expression.Accept(this);
195 }
196 else
197 {
198 Result.Append("(");
199 expression.Accept(this);
200
201 // Trim spaces before adding a closing parenthesis
202 while (Result[Result.Length - 1] == ' ')
203 {
204 Result.Remove(Result.Length - 1, 1);
205 }
206
207 Result.Append(") ");
208 }
209 }
210 }
211}