Skip to content

Commit

Permalink
Support default parameters for arrow function.
Browse files Browse the repository at this point in the history
  • Loading branch information
ariya committed Jul 30, 2013
1 parent ae14b2c commit d3702a2
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 4 deletions.
20 changes: 16 additions & 4 deletions esprima.js
Expand Up @@ -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: {}
Expand All @@ -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;
}
Expand All @@ -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) {
Expand All @@ -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() {
Expand Down Expand Up @@ -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 });
}
}

Expand Down
67 changes: 67 additions & 0 deletions test/harmonytest.js
Expand Up @@ -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 }
}
}

},
Expand Down

0 comments on commit d3702a2

Please sign in to comment.