public Node GetOptimisedNode(Node node) { var result = _engine.Executor.ExecuteExpression(node, _engine.GlobalScope); Node newNode = node; Type resultType = result.GetType(); if (resultType == typeof(Library.Native.System.Numeric)) { newNode = new NumericNode { Value = ((Library.Native.System.Numeric)result).Value }; } else if (resultType == typeof(Library.Native.System.String)) { newNode = new StringNode { Value = ((Library.Native.System.String)result).Value }; } else if (resultType == typeof(Library.Native.System.Boolean)) { newNode = new BooleanNode { Value = ((Library.Native.System.Boolean)result).Value }; } else if (resultType == typeof(Library.Native.System.Null)) { newNode = new NullNode(); } newNode.Nodes = node.Nodes; return(newNode); }
public static Node OptimiseExpressionNode(Node node, SkryptEngine engine) { if (!node.Nodes.Any()) { return(node); } var isBinaryExpression = node.Nodes.Count == 2; var onlyHasLiterals = true; var token = node.Token; var newNode = node.Copy(); for (int i = 0; i < node.Nodes.Count; i++) { newNode.Nodes[i] = OptimiseExpressionNode(node.Nodes[i], engine); } foreach (var n in newNode.Nodes) { if ((n.Type & TokenTypes.Literal) == 0) { onlyHasLiterals = false; break; } } if (onlyHasLiterals) { var retVal = engine.Executor.ExecuteExpression(newNode, engine.GlobalScope); if (retVal.GetType() == typeof(Skrypt.Library.Native.System.Numeric)) { newNode = new NumericNode { Value = (Skrypt.Library.Native.System.Numeric)retVal, Token = node.Token }; } else if (retVal.GetType() == typeof(Skrypt.Library.Native.System.String)) { newNode = new StringNode { Value = (Skrypt.Library.Native.System.String)retVal, Token = node.Token }; } else if (retVal.GetType() == typeof(Skrypt.Library.Native.System.Boolean)) { newNode = new BooleanNode { Value = (Skrypt.Library.Native.System.Boolean)retVal, Token = node.Token }; } //else if (retVal.GetType() == typeof(Skrypt.Library.Native.System.Array)) { // newNode = new ArrayNode { // Value = (Skrypt.Library.Native.System.Array)retVal, // Token = node.Token // }; //} } return(newNode); }