IExpressionNode CreateNode(INode node) { IExpressionNode expressionNode = null; if (node is ExpressionStatement) { var statementNode = (ExpressionStatement)node; expressionNode = new StatementExpressionNode { Expression = CreateNode(statementNode.Expression) }; } else if (node is BinaryOperatorExpression) { var binaryNode = ((BinaryOperatorExpression)node); expressionNode = new BinaryExpressionNode { Operator = (BinaryExpressionNode.Operators)binaryNode.Op, Left = CreateNode(binaryNode.Left), Right = CreateNode(binaryNode.Right), }; } else if (node is PrimitiveExpression) { var primitiveNode = (PrimitiveExpression)node; var valueType = primitiveNode.Value == null ? typeof(object) : primitiveNode.Value.GetType(); var value = (IValueNode)Activator.CreateInstance(typeof(ValueNode <>).MakeGenericType(valueType), primitiveNode.Value); expressionNode = new ValueExpressionNode { Value = value, }; } return(expressionNode); }
public IEnumerable <StatementNode> Visit(StatementExpressionNode node) => Flatten(node.Value);