public BoundInvalidExpressionStatement(ExpressionStatementSyntax syntax, BaseBoundExpression expression)
        {
            Debug.Assert(!syntax.IsDefault(), "'syntax' must not be null.");
            Debug.Assert(!expression.IsDefault(), "'expression' must not be null.");

            this.Syntax     = syntax;
            this.Expression = expression;
        }
        public BoundParenthesisExpression(ParenthesisExpressionSyntax syntax, bool hasValue, bool hasErrors, BaseBoundExpression expression)
            : base(hasValue, hasErrors)
        {
            Debug.Assert(!syntax.IsDefault(), "'syntax' must not be null.");
            Debug.Assert(!expression.IsDefault(), "'expression' must not be null.");

            this.Syntax     = syntax;
            this.Expression = expression;
        }
        public BoundArrayAssignmentStatement(ExpressionStatementSyntax syntax, BoundArrayAccessExpression array, BaseBoundExpression expression)
        {
            Debug.Assert(!syntax.IsDefault(), "'syntax' must not be null.");
            Debug.Assert(!array.IsDefault(), "'array' must not be null.");
            Debug.Assert(!expression.IsDefault(), "'expression' must not be null.");

            this.Syntax     = syntax;
            this.Array      = array;
            this.Expression = expression;
        }
        public BoundPropertyAssignmentStatement(ExpressionStatementSyntax syntax, BoundLibraryPropertyExpression property, BaseBoundExpression expression)
        {
            Debug.Assert(!syntax.IsDefault(), "'syntax' must not be null.");
            Debug.Assert(!property.IsDefault(), "'property' must not be null.");
            Debug.Assert(!expression.IsDefault(), "'expression' must not be null.");

            this.Syntax     = syntax;
            this.Property   = property;
            this.Expression = expression;
        }
        public BoundVariableAssignmentStatement(ExpressionStatementSyntax syntax, BoundVariableExpression variable, BaseBoundExpression expression)
        {
            Debug.Assert(!syntax.IsDefault(), "'syntax' must not be null.");
            Debug.Assert(!variable.IsDefault(), "'variable' must not be null.");
            Debug.Assert(!expression.IsDefault(), "'expression' must not be null.");

            this.Syntax     = syntax;
            this.Variable   = variable;
            this.Expression = expression;
        }
        public BoundWhileStatement(WhileStatementSyntax syntax, BaseBoundExpression condition, BoundStatementBlock body)
        {
            Debug.Assert(!syntax.IsDefault(), "'syntax' must not be null.");
            Debug.Assert(!condition.IsDefault(), "'condition' must not be null.");
            Debug.Assert(!body.IsDefault(), "'body' must not be null.");

            this.Syntax    = syntax;
            this.Condition = condition;
            this.Body      = body;
        }
        public BoundUnaryExpression(UnaryOperatorExpressionSyntax syntax, bool hasValue, bool hasErrors, TokenKind kind, BaseBoundExpression expression)
            : base(hasValue, hasErrors)
        {
            Debug.Assert(!syntax.IsDefault(), "'syntax' must not be null.");
            Debug.Assert(!kind.IsDefault(), "'kind' must not be null.");
            Debug.Assert(!expression.IsDefault(), "'expression' must not be null.");

            this.Syntax     = syntax;
            this.Kind       = kind;
            this.Expression = expression;
        }
        public BoundBinaryExpression(BinaryOperatorExpressionSyntax syntax, bool hasValue, bool hasErrors, TokenKind kind, BaseBoundExpression left, BaseBoundExpression right)
            : base(hasValue, hasErrors)
        {
            Debug.Assert(!syntax.IsDefault(), "'syntax' must not be null.");
            Debug.Assert(!kind.IsDefault(), "'kind' must not be null.");
            Debug.Assert(!left.IsDefault(), "'left' must not be null.");
            Debug.Assert(!right.IsDefault(), "'right' must not be null.");

            this.Syntax = syntax;
            this.Kind   = kind;
            this.Left   = left;
            this.Right  = right;
        }
        public BoundForStatement(ForStatementSyntax syntax, string identifier, BaseBoundExpression fromExpression, BaseBoundExpression toExpression, BaseBoundExpression stepExpressionOpt, BoundStatementBlock body)
        {
            Debug.Assert(!syntax.IsDefault(), "'syntax' must not be null.");
            Debug.Assert(!identifier.IsDefault(), "'identifier' must not be null.");
            Debug.Assert(!fromExpression.IsDefault(), "'fromExpression' must not be null.");
            Debug.Assert(!toExpression.IsDefault(), "'toExpression' must not be null.");
            Debug.Assert(!body.IsDefault(), "'body' must not be null.");

            this.Syntax            = syntax;
            this.Identifier        = identifier;
            this.FromExpression    = fromExpression;
            this.ToExpression      = toExpression;
            this.StepExpressionOpt = stepExpressionOpt;
            this.Body = body;
        }