diff --git a/esprima.js b/esprima.js index cea5e8091..8cff30214 100644 --- a/esprima.js +++ b/esprima.js @@ -2958,9 +2958,11 @@ parseYieldExpression: true } function reinterpretAsCoverFormalsList(expressions) { - var i, len, param, params, options, rest; + var i, len, param, params, defaults, defaultCount, options, rest; params = []; + defaults = []; + defaultCount = 0; rest = null; options = { paramSet: {} @@ -2970,14 +2972,20 @@ parseYieldExpression: true param = expressions[i]; if (param.type === Syntax.Identifier) { params.push(param); + defaults.push(null); validateParam(options, param, param.name); } else if (param.type === Syntax.ObjectExpression || param.type === Syntax.ArrayExpression) { reinterpretAsDestructuredParameter(options, param); params.push(param); + defaults.push(null); } else if (param.type === Syntax.SpreadElement) { assert(i === len - 1, "It is guaranteed that SpreadElement is last element by parseExpression"); reinterpretAsDestructuredParameter(options, param.argument); rest = param.argument; + } else if (param.type === Syntax.AssignmentExpression) { + params.push(param.left); + defaults.push(param.right); + ++defaultCount; } else { return null; } @@ -2990,7 +2998,11 @@ parseYieldExpression: true throwErrorTolerant(options.stricted, options.message); } - return { params: params, rest: rest }; + if (defaultCount === 0) { + defaults = []; + } + + return { params: params, defaults: defaults, rest: rest }; } function parseArrowFunctionExpression(options) { @@ -3006,7 +3018,7 @@ parseYieldExpression: true strict = previousStrict; state.yieldAllowed = previousYieldAllowed; - return delegate.createArrowFunctionExpression(options.params, [], body, options.rest, body.type !== Syntax.BlockStatement); + return delegate.createArrowFunctionExpression(options.params, options.defaults, body, options.rest, body.type !== Syntax.BlockStatement); } function parseAssignmentExpression() { @@ -3037,7 +3049,7 @@ parseYieldExpression: true if (isRestrictedWord(expr.name)) { throwError({}, Messages.StrictParamName); } - return parseArrowFunctionExpression({ params: [ expr ], rest: null }); + return parseArrowFunctionExpression({ params: [ expr ], defaults: [], rest: null }); } } diff --git a/test/harmonytest.js b/test/harmonytest.js index 83e6897ff..0ad6ea679 100644 --- a/test/harmonytest.js +++ b/test/harmonytest.js @@ -1289,6 +1289,73 @@ var harmonyTestFixture = { start: { line: 1, column: 0 }, end: { line: 1, column: 13 } } + }, + + '(x=1) => x * x': { + type: 'ExpressionStatement', + expression: { + type: 'ArrowFunctionExpression', + id: null, + params: [{ + type: 'Identifier', + name: 'x', + range: [1, 2], + loc: { + start: { line: 1, column: 1 }, + end: { line: 1, column: 2 } + } + }], + defaults: [{ + type: 'Literal', + value: 1, + raw: '1', + range: [3, 4], + loc: { + start: { line: 1, column: 3 }, + end: { line: 1, column: 4 } + } + }], + body: { + type: 'BinaryExpression', + operator: '*', + left: { + type: 'Identifier', + name: 'x', + range: [9, 10], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 10 } + } + }, + right: { + type: 'Identifier', + name: 'x', + range: [13, 14], + loc: { + start: { line: 1, column: 13 }, + end: { line: 1, column: 14 } + } + }, + range: [9, 14], + loc: { + start: { line: 1, column: 9 }, + end: { line: 1, column: 14 } + } + }, + rest: null, + generator: false, + expression: true, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } + }, + range: [0, 14], + loc: { + start: { line: 1, column: 0 }, + end: { line: 1, column: 14 } + } } },