Skip to content

Commit

Permalink
Introduce RestElement as a parameter instead of Function.rest
Browse files Browse the repository at this point in the history
  • Loading branch information
mikesherov committed Mar 7, 2015
1 parent 286a1b0 commit ab6b44b
Show file tree
Hide file tree
Showing 149 changed files with 677 additions and 711 deletions.
103 changes: 55 additions & 48 deletions esprima.js
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@
ObjectExpression: 'ObjectExpression',
Program: 'Program',
Property: 'Property',
RestElement: 'RestElement',
ReturnStatement: 'ReturnStatement',
SequenceExpression: 'SequenceExpression',
SwitchStatement: 'SwitchStatement',
Expand Down Expand Up @@ -1624,12 +1625,11 @@
return this;
},

finishArrowFunctionExpression: function (params, defaults, rest, body, expression) {
finishArrowFunctionExpression: function (params, defaults, body, expression) {
this.type = Syntax.ArrowFunctionExpression;
this.id = null;
this.params = params;
this.defaults = defaults;
this.rest = rest;
this.body = body;
this.generator = false;
this.expression = expression;
Expand Down Expand Up @@ -1773,26 +1773,24 @@
return this;
},

finishFunctionDeclaration: function (id, params, defaults, body, rest) {
finishFunctionDeclaration: function (id, params, defaults, body) {
this.type = Syntax.FunctionDeclaration;
this.id = id;
this.params = params;
this.defaults = defaults;
this.body = body;
this.rest = rest;
this.generator = false;
this.expression = false;
this.finish();
return this;
},

finishFunctionExpression: function (id, params, defaults, body, rest) {
finishFunctionExpression: function (id, params, defaults, body) {
this.type = Syntax.FunctionExpression;
this.id = id;
this.params = params;
this.defaults = defaults;
this.body = body;
this.rest = rest;
this.generator = false;
this.expression = false;
this.finish();
Expand Down Expand Up @@ -1886,6 +1884,13 @@
return this;
},

finishRestElement: function (argument) {
this.type = Syntax.RestElement;
this.argument = argument;
this.finish();
return this;
},

finishReturnStatement: function (argument) {
this.type = Syntax.ReturnStatement;
this.argument = argument;
Expand Down Expand Up @@ -2239,7 +2244,7 @@
}

strict = previousStrict;
return node.finishFunctionExpression(null, paramInfo.params, paramInfo.defaults, body, paramInfo.rest);
return node.finishFunctionExpression(null, paramInfo.params, paramInfo.defaults, body);
}

function parsePropertyMethodFunction() {
Expand Down Expand Up @@ -2322,8 +2327,7 @@
defaults: [],
stricted: null,
firstRestricted: null,
message: null,
rest: null
message: null
});
return node.finishProperty('get', key, computed, value, false, false);
} else if (token.value === 'set' && lookaheadPropertyName()) {
Expand All @@ -2337,8 +2341,7 @@
defaultCount: 0,
defaults: [],
firstRestricted: null,
paramSet: {},
rest: null
paramSet: {}
};
if (match(')')) {
tolerateUnexpectedToken(lookahead);
Expand Down Expand Up @@ -2436,23 +2439,20 @@
}
return {
type: PlaceHolders.ArrowParameterPlaceHolder,
params: [],
rest: null
params: []
};
}

startToken = lookahead;
if (match('...')) {
lex();
expr = parseVariableIdentifier();
expr = parseRestElement();
expect(')');
if (!match('=>')) {
expect('=>');
}
return {
type: PlaceHolders.ArrowParameterPlaceHolder,
params: [],
rest: expr
params: [expr]
};
}

Expand All @@ -2475,16 +2475,14 @@
if (!isValidArrowParameter) {
throwUnexpectedToken(lookahead);
}
lex();
expr = parseVariableIdentifier();
expressions.push(parseRestElement());
expect(')');
if (!match('=>')) {
expect('=>');
}
return {
type: PlaceHolders.ArrowParameterPlaceHolder,
params: expressions,
rest: expr
params: expressions
};
} else if (match('(')) {
isValidArrowParameter = false;
Expand Down Expand Up @@ -2913,12 +2911,11 @@
}

function reinterpretAsCoverFormalsList(expr) {
var i, len, param, params, defaults, defaultCount, options, rest, token;
var i, len, param, params, defaults, defaultCount, options, token;

defaults = [];
defaultCount = 0;
params = [expr];
rest = null;

switch (expr.type) {
case Syntax.Identifier:
Expand All @@ -2929,7 +2926,6 @@
break;
case PlaceHolders.ArrowParameterPlaceHolder:
params = expr.params;
rest = expr.rest;
break;
default:
return null;
Expand All @@ -2945,6 +2941,10 @@
params[i] = param;
defaults.push(null);
validateParam(options, param, param.name);
} else if (param.type === Syntax.RestElement) {
params[i] = param;
defaults.push(null);
validateParam(options, param.argument, param.argument.name);
} else if (param.type === Syntax.AssignmentExpression) {
params[i] = param.left;
defaults.push(param.right);
Expand All @@ -2967,7 +2967,6 @@
return {
params: params,
defaults: defaults,
rest: rest,
stricted: options.stricted,
firstRestricted: options.firstRestricted,
message: options.message
Expand All @@ -2991,7 +2990,7 @@

strict = previousStrict;

return node.finishArrowFunctionExpression(options.params, options.defaults, options.rest, body, body.type !== Syntax.BlockStatement);
return node.finishArrowFunctionExpression(options.params, options.defaults, body, body.type !== Syntax.BlockStatement);
}

// 11.13 Assignment Operators
Expand Down Expand Up @@ -3209,6 +3208,28 @@
return node.finishLexicalDeclaration(declarations, kind);
}

function parseRestElement() {
var param, node = new Node();

lex();

if (match('{')) {
throwError(Messages.ObjectPatternAsRestParameter);
}

param = parseVariableIdentifier();

if (match('=')) {
throwError(Messages.DefaultRestParameter);
}

if (!match(')')) {
throwError(Messages.ParameterAfterRestParameter);
}

return node.finishRestElement(param);
}

// 12.3 Empty Statement

function parseEmptyStatement(node) {
Expand Down Expand Up @@ -3859,38 +3880,26 @@
}

function parseParam(options) {
var token, param, def, rest;
var token, param, def;

token = lookahead;
if (token.value === '...') {
token = lex();
rest = true;
if (match('{')) {
throwError(Messages.ObjectPatternAsRestParameter);
}
param = parseRestElement();
validateParam(options, param.argument, param.argument.name);
options.params.push(param);
options.defaults.push(null);
return false;
}

param = parseVariableIdentifier();
validateParam(options, token, token.value);

if (match('=')) {
if (rest) {
throwError(Messages.DefaultRestParameter);
}

lex();
def = parseAssignmentExpression();
++options.defaultCount;
}

if (rest) {
if (!match(')')) {
throwError(Messages.ParameterAfterRestParameter);
}
options.rest = param;
return false;
}

options.params.push(param);
options.defaults.push(def);

Expand All @@ -3904,7 +3913,6 @@
params: [],
defaultCount: 0,
defaults: [],
rest: null,
firstRestricted: firstRestricted
};

Expand All @@ -3929,7 +3937,6 @@
return {
params: options.params,
defaults: options.defaults,
rest: options.rest,
stricted: options.stricted,
firstRestricted: options.firstRestricted,
message: options.message
Expand Down Expand Up @@ -3975,7 +3982,7 @@
}
strict = previousStrict;

return node.finishFunctionDeclaration(id, params, defaults, body, tmp.rest);
return node.finishFunctionDeclaration(id, params, defaults, body);
}

function parseFunctionExpression() {
Expand Down Expand Up @@ -4021,7 +4028,7 @@
}
strict = previousStrict;

return node.finishFunctionExpression(id, params, defaults, body, tmp.rest);
return node.finishFunctionExpression(id, params, defaults, body);
}


Expand Down
2 changes: 1 addition & 1 deletion test/3rdparty/syntax/angular-1.2.5.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion test/3rdparty/syntax/backbone-1.1.0.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion test/3rdparty/syntax/jquery-1.9.1.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion test/3rdparty/syntax/jquery.mobile-1.4.2.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion test/3rdparty/syntax/mootools-1.4.5.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion test/3rdparty/syntax/underscore-1.5.2.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion test/3rdparty/syntax/yui-3.12.0.json

Large diffs are not rendered by default.

Loading

0 comments on commit ab6b44b

Please sign in to comment.