Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ExpressionStringBuilder.cs
Go to the documentation of this file.
6using System.Text;
7
9
11{
12 private readonly StringBuilder _out;
13
15
17 {
18 _out = new StringBuilder();
19 }
20
21 public override string ToString()
22 {
23 return _out.ToString();
24 }
25
27 {
28 return GetId(label);
29 }
30
32 {
33 return GetId(p);
34 }
35
36 private int GetId(object o)
37 {
38 if (_ids == null)
39 {
41 }
43 {
45 _ids.Add(o, value);
46 }
47 return value;
48 }
49
50 private void Out(string s)
51 {
52 _out.Append(s);
53 }
54
55 private void Out(char c)
56 {
57 _out.Append(c);
58 }
59
66
73
80
87
94
99
101 {
102 Out(open);
103 if (expressions != null)
104 {
105 bool flag = true;
106 foreach (T expression in expressions)
107 {
108 if (flag)
109 {
110 flag = false;
111 }
112 else
113 {
114 Out(seperator);
115 }
117 }
118 }
119 Out(close);
120 }
121
122 protected internal override Expression VisitBinary(BinaryExpression node)
123 {
124 if (node.NodeType == ExpressionType.ArrayIndex)
125 {
126 Visit(node.Left);
127 Out('[');
128 Visit(node.Right);
129 Out(']');
130 }
131 else
132 {
133 string s;
134 switch (node.NodeType)
135 {
136 case ExpressionType.AndAlso:
137 s = "AndAlso";
138 break;
139 case ExpressionType.OrElse:
140 s = "OrElse";
141 break;
142 case ExpressionType.Assign:
143 s = "=";
144 break;
145 case ExpressionType.Equal:
146 s = "==";
147 break;
148 case ExpressionType.NotEqual:
149 s = "!=";
150 break;
151 case ExpressionType.GreaterThan:
152 s = ">";
153 break;
154 case ExpressionType.LessThan:
155 s = "<";
156 break;
157 case ExpressionType.GreaterThanOrEqual:
158 s = ">=";
159 break;
160 case ExpressionType.LessThanOrEqual:
161 s = "<=";
162 break;
163 case ExpressionType.Add:
164 case ExpressionType.AddChecked:
165 s = "+";
166 break;
167 case ExpressionType.AddAssign:
168 case ExpressionType.AddAssignChecked:
169 s = "+=";
170 break;
171 case ExpressionType.Subtract:
172 case ExpressionType.SubtractChecked:
173 s = "-";
174 break;
175 case ExpressionType.SubtractAssign:
176 case ExpressionType.SubtractAssignChecked:
177 s = "-=";
178 break;
179 case ExpressionType.Divide:
180 s = "/";
181 break;
182 case ExpressionType.DivideAssign:
183 s = "/=";
184 break;
185 case ExpressionType.Modulo:
186 s = "%";
187 break;
188 case ExpressionType.ModuloAssign:
189 s = "%=";
190 break;
191 case ExpressionType.Multiply:
192 case ExpressionType.MultiplyChecked:
193 s = "*";
194 break;
195 case ExpressionType.MultiplyAssign:
196 case ExpressionType.MultiplyAssignChecked:
197 s = "*=";
198 break;
199 case ExpressionType.LeftShift:
200 s = "<<";
201 break;
202 case ExpressionType.LeftShiftAssign:
203 s = "<<=";
204 break;
205 case ExpressionType.RightShift:
206 s = ">>";
207 break;
208 case ExpressionType.RightShiftAssign:
209 s = ">>=";
210 break;
211 case ExpressionType.And:
212 s = (IsBool(node) ? "And" : "&");
213 break;
214 case ExpressionType.AndAssign:
215 s = (IsBool(node) ? "&&=" : "&=");
216 break;
217 case ExpressionType.Or:
218 s = (IsBool(node) ? "Or" : "|");
219 break;
220 case ExpressionType.OrAssign:
221 s = (IsBool(node) ? "||=" : "|=");
222 break;
223 case ExpressionType.ExclusiveOr:
224 s = "^";
225 break;
226 case ExpressionType.ExclusiveOrAssign:
227 s = "^=";
228 break;
229 case ExpressionType.Power:
230 s = "**";
231 break;
232 case ExpressionType.PowerAssign:
233 s = "**=";
234 break;
235 case ExpressionType.Coalesce:
236 s = "??";
237 break;
238 default:
239 throw new InvalidOperationException();
240 }
241 Out('(');
242 Visit(node.Left);
243 Out(' ');
244 Out(s);
245 Out(' ');
246 Visit(node.Right);
247 Out(')');
248 }
249 return node;
250 }
251
253 {
254 if (node.IsByRef)
255 {
256 Out("ref ");
257 }
258 string name = node.Name;
259 if (string.IsNullOrEmpty(name))
260 {
261 Out("Param_" + GetParamId(node));
262 }
263 else
264 {
265 Out(name);
266 }
267 return node;
268 }
269
270 protected internal override Expression VisitLambda<T>(Expression<T> node)
271 {
272 if (node.ParameterCount == 1)
273 {
274 Visit(node.GetParameter(0));
275 }
276 else
277 {
278 Out('(');
279 string s = ", ";
280 int i = 0;
281 for (int parameterCount = node.ParameterCount; i < parameterCount; i++)
282 {
283 if (i > 0)
284 {
285 Out(s);
286 }
287 Visit(node.GetParameter(i));
288 }
289 Out(')');
290 }
291 Out(" => ");
292 Visit(node.Body);
293 return node;
294 }
295
296 protected internal override Expression VisitListInit(ListInitExpression node)
297 {
298 Visit(node.NewExpression);
299 Out(" {");
300 int i = 0;
301 for (int count = node.Initializers.Count; i < count; i++)
302 {
303 if (i > 0)
304 {
305 Out(", ");
306 }
307 VisitElementInit(node.Initializers[i]);
308 }
309 Out('}');
310 return node;
311 }
312
314 {
315 Out("IIF(");
316 Visit(node.Test);
317 Out(", ");
318 Visit(node.IfTrue);
319 Out(", ");
320 Visit(node.IfFalse);
321 Out(')');
322 return node;
323 }
324
325 protected internal override Expression VisitConstant(ConstantExpression node)
326 {
327 if (node.Value != null)
328 {
329 string text = node.Value.ToString();
330 if (node.Value is string)
331 {
332 Out('"');
333 Out(text);
334 Out('"');
335 }
336 else if (text == node.Value.GetType().ToString())
337 {
338 Out("value(");
339 Out(text);
340 Out(')');
341 }
342 else
343 {
344 Out(text);
345 }
346 }
347 else
348 {
349 Out("null");
350 }
351 return node;
352 }
353
355 {
356 Out($"<DebugInfo({node.Document.FileName}: {node.StartLine}, {node.StartColumn}, {node.EndLine}, {node.EndColumn})>");
357 return node;
358 }
359
361 {
362 VisitExpressions('(', node.Variables, ')');
363 return node;
364 }
365
366 private void OutMember(Expression instance, MemberInfo member)
367 {
368 if (instance != null)
369 {
370 Visit(instance);
371 }
372 else
373 {
374 Out(member.DeclaringType.Name);
375 }
376 Out('.');
377 Out(member.Name);
378 }
379
380 protected internal override Expression VisitMember(MemberExpression node)
381 {
382 OutMember(node.Expression, node.Member);
383 return node;
384 }
385
387 {
388 if (node.NewExpression.ArgumentCount == 0 && node.NewExpression.Type.Name.Contains('<'))
389 {
390 Out("new");
391 }
392 else
393 {
394 Visit(node.NewExpression);
395 }
396 Out(" {");
397 int i = 0;
398 for (int count = node.Bindings.Count; i < count; i++)
399 {
400 MemberBinding node2 = node.Bindings[i];
401 if (i > 0)
402 {
403 Out(", ");
404 }
406 }
407 Out('}');
408 return node;
409 }
410
412 {
413 Out(assignment.Member.Name);
414 Out(" = ");
415 Visit(assignment.Expression);
416 return assignment;
417 }
418
420 {
421 Out(binding.Member.Name);
422 Out(" = {");
423 int i = 0;
424 for (int count = binding.Initializers.Count; i < count; i++)
425 {
426 if (i > 0)
427 {
428 Out(", ");
429 }
430 VisitElementInit(binding.Initializers[i]);
431 }
432 Out('}');
433 return binding;
434 }
435
437 {
438 Out(binding.Member.Name);
439 Out(" = {");
440 int i = 0;
441 for (int count = binding.Bindings.Count; i < count; i++)
442 {
443 if (i > 0)
444 {
445 Out(", ");
446 }
447 VisitMemberBinding(binding.Bindings[i]);
448 }
449 Out('}');
450 return binding;
451 }
452
454 {
455 Out(initializer.AddMethod.ToString());
456 string s = ", ";
457 Out('(');
458 int i = 0;
459 for (int argumentCount = initializer.ArgumentCount; i < argumentCount; i++)
460 {
461 if (i > 0)
462 {
463 Out(s);
464 }
465 Visit(initializer.GetArgument(i));
466 }
467 Out(')');
468 return initializer;
469 }
470
472 {
473 Out("Invoke(");
474 Visit(node.Expression);
475 string s = ", ";
476 int i = 0;
477 for (int argumentCount = node.ArgumentCount; i < argumentCount; i++)
478 {
479 Out(s);
480 Visit(node.GetArgument(i));
481 }
482 Out(')');
483 return node;
484 }
485
487 {
488 int num = 0;
489 Expression expression = node.Object;
490 if (node.Method.GetCustomAttribute(typeof(ExtensionAttribute)) != null)
491 {
492 num = 1;
493 expression = node.GetArgument(0);
494 }
495 if (expression != null)
496 {
498 Out('.');
499 }
500 Out(node.Method.Name);
501 Out('(');
502 int i = num;
503 for (int argumentCount = node.ArgumentCount; i < argumentCount; i++)
504 {
505 if (i > num)
506 {
507 Out(", ");
508 }
509 Visit(node.GetArgument(i));
510 }
511 Out(')');
512 return node;
513 }
514
515 protected internal override Expression VisitNewArray(NewArrayExpression node)
516 {
517 switch (node.NodeType)
518 {
519 case ExpressionType.NewArrayBounds:
520 Out("new ");
521 Out(node.Type.ToString());
522 VisitExpressions('(', node.Expressions, ')');
523 break;
524 case ExpressionType.NewArrayInit:
525 Out("new [] ");
526 VisitExpressions('{', node.Expressions, '}');
527 break;
528 }
529 return node;
530 }
531
532 protected internal override Expression VisitNew(NewExpression node)
533 {
534 Out("new ");
535 Out(node.Type.Name);
536 Out('(');
538 for (int i = 0; i < node.ArgumentCount; i++)
539 {
540 if (i > 0)
541 {
542 Out(", ");
543 }
544 if (members != null)
545 {
546 string name = members[i].Name;
547 Out(name);
548 Out(" = ");
549 }
550 Visit(node.GetArgument(i));
551 }
552 Out(')');
553 return node;
554 }
555
557 {
558 Out('(');
559 Visit(node.Expression);
560 switch (node.NodeType)
561 {
562 case ExpressionType.TypeIs:
563 Out(" Is ");
564 break;
565 case ExpressionType.TypeEqual:
566 Out(" TypeEqual ");
567 break;
568 }
569 Out(node.TypeOperand.Name);
570 Out(')');
571 return node;
572 }
573
574 protected internal override Expression VisitUnary(UnaryExpression node)
575 {
576 switch (node.NodeType)
577 {
578 case ExpressionType.Negate:
579 case ExpressionType.NegateChecked:
580 Out('-');
581 break;
582 case ExpressionType.Not:
583 Out("Not(");
584 break;
585 case ExpressionType.IsFalse:
586 Out("IsFalse(");
587 break;
588 case ExpressionType.IsTrue:
589 Out("IsTrue(");
590 break;
591 case ExpressionType.OnesComplement:
592 Out("~(");
593 break;
594 case ExpressionType.ArrayLength:
595 Out("ArrayLength(");
596 break;
597 case ExpressionType.Convert:
598 Out("Convert(");
599 break;
600 case ExpressionType.ConvertChecked:
601 Out("ConvertChecked(");
602 break;
603 case ExpressionType.Throw:
604 Out("throw(");
605 break;
606 case ExpressionType.TypeAs:
607 Out('(');
608 break;
609 case ExpressionType.UnaryPlus:
610 Out('+');
611 break;
612 case ExpressionType.Unbox:
613 Out("Unbox(");
614 break;
615 case ExpressionType.Increment:
616 Out("Increment(");
617 break;
618 case ExpressionType.Decrement:
619 Out("Decrement(");
620 break;
621 case ExpressionType.PreIncrementAssign:
622 Out("++");
623 break;
624 case ExpressionType.PreDecrementAssign:
625 Out("--");
626 break;
627 default:
628 throw new InvalidOperationException();
629 case ExpressionType.Quote:
630 case ExpressionType.PostIncrementAssign:
631 case ExpressionType.PostDecrementAssign:
632 break;
633 }
634 Visit(node.Operand);
635 switch (node.NodeType)
636 {
637 case ExpressionType.TypeAs:
638 Out(" As ");
639 Out(node.Type.Name);
640 Out(')');
641 break;
642 case ExpressionType.Convert:
643 case ExpressionType.ConvertChecked:
644 Out(", ");
645 Out(node.Type.Name);
646 Out(')');
647 break;
648 case ExpressionType.PostIncrementAssign:
649 Out("++");
650 break;
651 case ExpressionType.PostDecrementAssign:
652 Out("--");
653 break;
654 default:
655 Out(')');
656 break;
657 case ExpressionType.Negate:
658 case ExpressionType.UnaryPlus:
659 case ExpressionType.NegateChecked:
660 case ExpressionType.Quote:
661 case ExpressionType.PreIncrementAssign:
662 case ExpressionType.PreDecrementAssign:
663 break;
664 }
665 return node;
666 }
667
668 protected internal override Expression VisitBlock(BlockExpression node)
669 {
670 Out('{');
671 foreach (ParameterExpression variable in node.Variables)
672 {
673 Out("var ");
675 Out(';');
676 }
677 Out(" ... }");
678 return node;
679 }
680
681 protected internal override Expression VisitDefault(DefaultExpression node)
682 {
683 Out("default(");
684 Out(node.Type.Name);
685 Out(')');
686 return node;
687 }
688
689 protected internal override Expression VisitLabel(LabelExpression node)
690 {
691 Out("{ ... } ");
692 DumpLabel(node.Target);
693 Out(':');
694 return node;
695 }
696
697 protected internal override Expression VisitGoto(GotoExpression node)
698 {
699 Out(node.Kind switch
700 {
701 GotoExpressionKind.Goto => "goto",
702 GotoExpressionKind.Break => "break",
703 GotoExpressionKind.Continue => "continue",
704 GotoExpressionKind.Return => "return",
705 _ => throw new InvalidOperationException(),
706 });
707 Out(' ');
708 DumpLabel(node.Target);
709 if (node.Value != null)
710 {
711 Out(" (");
712 Visit(node.Value);
713 Out(")");
714 }
715 return node;
716 }
717
718 protected internal override Expression VisitLoop(LoopExpression node)
719 {
720 Out("loop { ... }");
721 return node;
722 }
723
725 {
726 Out("case ");
727 VisitExpressions('(', node.TestValues, ')');
728 Out(": ...");
729 return node;
730 }
731
732 protected internal override Expression VisitSwitch(SwitchExpression node)
733 {
734 Out("switch ");
735 Out('(');
736 Visit(node.SwitchValue);
737 Out(") { ... }");
738 return node;
739 }
740
742 {
743 Out("catch (");
744 Out(node.Test.Name);
745 if (!string.IsNullOrEmpty(node.Variable?.Name))
746 {
747 Out(' ');
748 Out(node.Variable.Name);
749 }
750 Out(") { ... }");
751 return node;
752 }
753
754 protected internal override Expression VisitTry(TryExpression node)
755 {
756 Out("try { ... }");
757 return node;
758 }
759
760 protected internal override Expression VisitIndex(IndexExpression node)
761 {
762 if (node.Object != null)
763 {
764 Visit(node.Object);
765 }
766 else
767 {
768 Out(node.Indexer.DeclaringType.Name);
769 }
770 if (node.Indexer != null)
771 {
772 Out('.');
773 Out(node.Indexer.Name);
774 }
775 Out('[');
776 int i = 0;
777 for (int argumentCount = node.ArgumentCount; i < argumentCount; i++)
778 {
779 if (i > 0)
780 {
781 Out(", ");
782 }
783 Visit(node.GetArgument(i));
784 }
785 Out(']');
786 return node;
787 }
788
789 [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2075:UnrecognizedReflectionPattern", Justification = "The 'ToString' method cannot be trimmed on any Expression type because we are calling Expression.ToString() in this method.")]
790 protected internal override Expression VisitExtension(Expression node)
791 {
792 MethodInfo method = node.GetType().GetMethod("ToString", Type.EmptyTypes);
793 if (method.DeclaringType != typeof(Expression) && !method.IsStatic)
794 {
795 Out(node.ToString());
796 return node;
797 }
798 Out('[');
799 Out((node.NodeType == ExpressionType.Extension) ? node.GetType().FullName : node.NodeType.ToString());
800 Out(']');
801 return node;
802 }
803
804 private void DumpLabel(LabelTarget target)
805 {
806 if (!string.IsNullOrEmpty(target.Name))
807 {
808 Out(target.Name);
809 }
810 else
811 {
812 Out("UnnamedLabel_" + GetLabelId(target));
813 }
814 }
815
816 private static bool IsBool(Expression node)
817 {
818 if (!(node.Type == typeof(bool)))
819 {
820 return node.Type == typeof(bool?);
821 }
822 return true;
823 }
824}
bool TryGetValue(TKey key, [MaybeNullWhen(false)] out TValue value)
bool ICollection< KeyValuePair< TKey, TValue > >. Contains(KeyValuePair< TKey, TValue > keyValuePair)
void Add(TKey key, TValue value)
override Expression VisitUnary(UnaryExpression node)
override Expression VisitConstant(ConstantExpression node)
override Expression VisitLambda< T >(Expression< T > node)
override Expression VisitInvocation(InvocationExpression node)
override MemberListBinding VisitMemberListBinding(MemberListBinding binding)
override Expression VisitParameter(ParameterExpression node)
override ElementInit VisitElementInit(ElementInit initializer)
void VisitExpressions< T >(char open, ReadOnlyCollection< T > expressions, char close)
override Expression VisitExtension(Expression node)
override Expression VisitMemberInit(MemberInitExpression node)
override Expression VisitTry(TryExpression node)
override Expression VisitListInit(ListInitExpression node)
void OutMember(Expression instance, MemberInfo member)
override CatchBlock VisitCatchBlock(CatchBlock node)
override Expression VisitNewArray(NewArrayExpression node)
override MemberAssignment VisitMemberAssignment(MemberAssignment assignment)
override Expression VisitNew(NewExpression node)
override Expression VisitTypeBinary(TypeBinaryExpression node)
override Expression VisitMember(MemberExpression node)
override Expression VisitSwitch(SwitchExpression node)
override Expression VisitRuntimeVariables(RuntimeVariablesExpression node)
static string MemberBindingToString(MemberBinding node)
override Expression VisitGoto(GotoExpression node)
override Expression VisitBlock(BlockExpression node)
static string ElementInitBindingToString(ElementInit node)
override SwitchCase VisitSwitchCase(SwitchCase node)
override Expression VisitMethodCall(MethodCallExpression node)
override Expression VisitDefault(DefaultExpression node)
override Expression VisitConditional(ConditionalExpression node)
override Expression VisitDebugInfo(DebugInfoExpression node)
override MemberMemberBinding VisitMemberMemberBinding(MemberMemberBinding binding)
override Expression VisitIndex(IndexExpression node)
override Expression VisitLoop(LoopExpression node)
override Expression VisitLabel(LabelExpression node)
override Expression VisitBinary(BinaryExpression node)
virtual ? Expression Visit(Expression? node)
virtual MemberBinding VisitMemberBinding(MemberBinding node)
override string ToString()
StringBuilder Append(char value, int repeatCount)
static readonly Type[] EmptyTypes
Definition Type.cs:19