function reinterpretAsAssignmentBindingPattern(expr) {
            var i, len, property, element;
    
            if (expr.type === Syntax.ObjectExpression) {
                expr.type = Syntax.ObjectPattern;
                for (i = 0, len = expr.properties.length; i < len; i += 1) {
                    property = expr.properties[i];
                    if (property.type === Syntax.SpreadProperty) {
                        if (i < len - 1) {
                            throwError({}, Messages.PropertyAfterSpreadProperty);
                        }
                        reinterpretAsAssignmentBindingPattern(property.argument);
                    } else {
                        if (property.kind !== 'init') {
                            throwError({}, Messages.InvalidLHSInAssignment);
                        }
                        reinterpretAsAssignmentBindingPattern(property.value);
                    }
                }
            } else if (expr.type === Syntax.ArrayExpression) {
                expr.type = Syntax.ArrayPattern;
                for (i = 0, len = expr.elements.length; i < len; i += 1) {
                    element = expr.elements[i];
                    /* istanbul ignore else */
                    if (element) {
                        reinterpretAsAssignmentBindingPattern(element);
                    }
                }
            } else if (expr.type === Syntax.Identifier) {
                if (isRestrictedWord(expr.name)) {
                    throwError({}, Messages.InvalidLHSInAssignment);
                }
            } else if (expr.type === Syntax.SpreadElement) {
                reinterpretAsAssignmentBindingPattern(expr.argument);
                if (expr.argument.type === Syntax.ObjectPattern) {
                    throwError({}, Messages.ObjectPatternAsSpread);
                }
            } else {
                /* istanbul ignore else */
                if (expr.type !== Syntax.MemberExpression && expr.type !== Syntax.CallExpression && expr.type !== Syntax.NewExpression) {
                    throwError({}, Messages.InvalidLHSInAssignment);
                }
            }
        }
function reinterpretAsAssignmentBindingPattern(expr) {
            var i, len, property, element;
    
            if (expr.type === Syntax.ObjectExpression) {
                expr.type = Syntax.ObjectPattern;
                for (i = 0, len = expr.properties.length; i < len; i += 1) {
                    property = expr.properties[i];
                    if (property.type === Syntax.SpreadProperty) {
                        if (i < len - 1) {
                            throwError({}, Messages.PropertyAfterSpreadProperty);
                        }
                        reinterpretAsAssignmentBindingPattern(property.argument);
                    } else {
                        if (property.kind !== 'init') {
                            throwError({}, Messages.InvalidLHSInAssignment);
                        }
                        reinterpretAsAssignmentBindingPattern(property.value);
                    }
                }
            } else if (expr.type === Syntax.ArrayExpression) {
                expr.type = Syntax.ArrayPattern;
                for (i = 0, len = expr.elements.length; i < len; i += 1) {
                    element = expr.elements[i];
                    /* istanbul ignore else */
                    if (element) {
                        reinterpretAsAssignmentBindingPattern(element);
                    }
                }
            } else if (expr.type === Syntax.Identifier) {
                if (isRestrictedWord(expr.name)) {
                    throwError({}, Messages.InvalidLHSInAssignment);
                }
            } else if (expr.type === Syntax.SpreadElement) {
                reinterpretAsAssignmentBindingPattern(expr.argument);
                if (expr.argument.type === Syntax.ObjectPattern) {
                    throwError({}, Messages.ObjectPatternAsSpread);
                }
            } else {
                /* istanbul ignore else */
                if (expr.type !== Syntax.MemberExpression && expr.type !== Syntax.CallExpression && expr.type !== Syntax.NewExpression) {
                    throwError({}, Messages.InvalidLHSInAssignment);
                }
            }
        }
function reinterpretAsAssignmentBindingPattern ( expr ) { var i , len , property , element ; if ( expr . type === Syntax . ObjectExpression ) { expr . type = Syntax . ObjectPattern ; for ( i = 0 , len = expr . properties . length ; i < len ; i += 1 ) { property = expr . properties [ i ] ; if ( property . type === Syntax . SpreadProperty ) { if ( i < len - 1 ) { throwError ( { } , Messages . PropertyAfterSpreadProperty ) ; } reinterpretAsAssignmentBindingPattern ( property . argument ) ; } else { if ( property . kind !== 'init' ) { throwError ( { } , Messages . InvalidLHSInAssignment ) ; } reinterpretAsAssignmentBindingPattern ( property . value ) ; } } } else if ( expr . type === Syntax . ArrayExpression ) { expr . type = Syntax . ArrayPattern ; for ( i = 0 , len = expr . elements . length ; i < len ; i += 1 ) { element = expr . elements [ i ] ; /* istanbul ignore else */ if ( element ) { reinterpretAsAssignmentBindingPattern ( element ) ; } } } else if ( expr . type === Syntax . Identifier ) { if ( isRestrictedWord ( expr . name ) ) { throwError ( { } , Messages . InvalidLHSInAssignment ) ; } } else if ( expr . type === Syntax . SpreadElement ) { reinterpretAsAssignmentBindingPattern ( expr . argument ) ; if ( expr . argument . type === Syntax . ObjectPattern ) { throwError ( { } , Messages . ObjectPatternAsSpread ) ; } } else { /* istanbul ignore else */ if ( expr . type !== Syntax . MemberExpression && expr . type !== Syntax . CallExpression && expr . type !== Syntax . NewExpression ) { throwError ( { } , Messages . InvalidLHSInAssignment ) ; } } }
11.13 Assignment Operators 12.14.5 AssignmentPattern
11 . 13 Assignment Operators 12 . 14 . 5 AssignmentPattern