No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SerializationVisitor.cs 6.0KB

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