Skip to content

Commit 60d42ef

Browse files
committed
Reuse rest/spread element for object rest/spread
Fix jquery#1588 Closes jquerygh-1778
1 parent 860acd2 commit 60d42ef

17 files changed

+34
-68
lines changed

src/nodes.ts

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ export type Expression = ArrayExpression | ArrowFunctionExpression | AssignmentE
1616
ThisExpression | UnaryExpression | UpdateExpression | YieldExpression;
1717
export type FunctionParameter = AssignmentPattern | BindingIdentifier | BindingPattern;
1818
export type ImportDeclarationSpecifier = ImportDefaultSpecifier | ImportNamespaceSpecifier | ImportSpecifier;
19-
export type ObjectExpressionProperty = Property | SpreadProperty;
20-
export type ObjectPatternProperty = Property | RestProperty;
19+
export type ObjectExpressionProperty = Property | SpreadElement;
20+
export type ObjectPatternProperty = Property | RestElement;
2121
export type Statement = AsyncFunctionDeclaration | BreakStatement | ContinueStatement | DebuggerStatement | DoWhileStatement |
2222
EmptyStatement | ExpressionStatement | Directive | ForStatement | ForInStatement | ForOfStatement |
2323
FunctionDeclaration | IfStatement | ReturnStatement | SwitchStatement | ThrowStatement |
@@ -647,15 +647,6 @@ export class RestElement {
647647
}
648648
}
649649

650-
export class RestProperty {
651-
readonly type: string;
652-
readonly argument: Expression;
653-
constructor(argument: Expression) {
654-
this.type = Syntax.RestProperty;
655-
this.argument = argument;
656-
}
657-
}
658-
659650
export class ReturnStatement {
660651
readonly type: string;
661652
readonly argument: Expression | null;
@@ -694,15 +685,6 @@ export class SpreadElement {
694685
}
695686
}
696687

697-
export class SpreadProperty {
698-
readonly type: string;
699-
readonly argument: Expression;
700-
constructor(argument: Expression) {
701-
this.type = Syntax.SpreadProperty;
702-
this.argument = argument;
703-
}
704-
}
705-
706688
export class StaticMemberExpression {
707689
readonly type: string;
708690
readonly computed: boolean;

src/parser.ts

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -914,21 +914,14 @@ export class Parser {
914914
return this.finalize(node, new Node.Property(kind, key as Node.PropertyKey, computed, value, method, shorthand));
915915
}
916916

917-
parseSpreadProperty(): Node.SpreadProperty {
918-
const node = this.createNode();
919-
this.expect('...');
920-
const arg = this.inheritCoverGrammar(this.parseAssignmentExpression);
921-
return this.finalize(node, new Node.SpreadProperty(arg));
922-
}
923-
924917
parseObjectInitializer(): Node.ObjectExpression {
925918
const node = this.createNode();
926919

927920
this.expect('{');
928921
const properties: Node.ObjectExpressionProperty[] = [];
929922
let hasProto = { value: false };
930923
while (!this.match('}')) {
931-
properties.push(this.match('...') ? this.parseSpreadProperty() : this.parseObjectProperty(hasProto));
924+
properties.push(this.match('...') ? this.parseSpreadElement() : this.parseObjectProperty(hasProto));
932925
if (!this.match('}')) {
933926
this.expectCommaSeparator();
934927
}
@@ -994,10 +987,6 @@ export class Parser {
994987
expr.type = Syntax.RestElement;
995988
this.reinterpretExpressionAsPattern(expr.argument);
996989
break;
997-
case Syntax.SpreadProperty:
998-
expr.type = Syntax.RestProperty;
999-
this.reinterpretExpressionAsPattern(expr.argument);
1000-
break;
1001990
case Syntax.ArrayExpression:
1002991
expr.type = Syntax.ArrayPattern;
1003992
for (let i = 0; i < expr.elements.length; i++) {
@@ -1010,7 +999,7 @@ export class Parser {
1010999
expr.type = Syntax.ObjectPattern;
10111000
for (let i = 0; i < expr.properties.length; i++) {
10121001
const property = expr.properties[i];
1013-
this.reinterpretExpressionAsPattern(property.type === Syntax.SpreadProperty ? property : property.value);
1002+
this.reinterpretExpressionAsPattern(property.type === Syntax.SpreadElement ? property : property.value);
10141003
}
10151004
break;
10161005
case Syntax.AssignmentExpression:
@@ -1580,7 +1569,6 @@ export class Parser {
15801569
this.validateParam(options, param, param.name);
15811570
break;
15821571
case Syntax.RestElement:
1583-
case Syntax.RestProperty:
15841572
this.checkPatternParam(options, param.argument);
15851573
break;
15861574
case Syntax.AssignmentPattern:
@@ -1596,7 +1584,7 @@ export class Parser {
15961584
case Syntax.ObjectPattern:
15971585
for (let i = 0; i < param.properties.length; i++) {
15981586
const property = param.properties[i];
1599-
this.checkPatternParam(options, (property.type === Syntax.RestProperty) ? property : property.value);
1587+
this.checkPatternParam(options, (property.type === Syntax.RestElement) ? property : property.value);
16001588
}
16011589
break;
16021590
default:
@@ -1997,7 +1985,7 @@ export class Parser {
19971985
return this.finalize(node, new Node.Property('init', key, computed, value, method, shorthand));
19981986
}
19991987

2000-
parseRestProperty(params, kind): Node.RestProperty {
1988+
parseRestProperty(params, kind): Node.RestElement {
20011989
const node = this.createNode();
20021990
this.expect('...');
20031991
const arg = this.parsePattern(params);
@@ -2007,7 +1995,7 @@ export class Parser {
20071995
if (!this.match('}')) {
20081996
this.throwError(Messages.PropertyAfterRestProperty);
20091997
}
2010-
return this.finalize(node, new Node.RestProperty(arg));
1998+
return this.finalize(node, new Node.RestElement(arg));
20111999
}
20122000

20132001
parseObjectPattern(params, kind?: string): Node.ObjectPattern {

src/syntax.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,9 @@ export const Syntax = {
4747
Program: 'Program',
4848
Property: 'Property',
4949
RestElement: 'RestElement',
50-
RestProperty: 'RestProperty',
5150
ReturnStatement: 'ReturnStatement',
5251
SequenceExpression: 'SequenceExpression',
5352
SpreadElement: 'SpreadElement',
54-
SpreadProperty: 'SpreadProperty',
5553
Super: 'Super',
5654
SwitchCase: 'SwitchCase',
5755
SwitchStatement: 'SwitchStatement',

test/api-tests.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,9 @@ describe('esprima.Syntax', function () {
7777
Program: 'Program',
7878
Property: 'Property',
7979
RestElement: 'RestElement',
80-
RestProperty: 'RestProperty',
8180
ReturnStatement: 'ReturnStatement',
8281
SequenceExpression: 'SequenceExpression',
8382
SpreadElement: 'SpreadElement',
84-
SpreadProperty: 'SpreadProperty',
8583
Super: 'Super',
8684
SwitchCase: 'SwitchCase',
8785
SwitchStatement: 'SwitchStatement',

test/fixtures/es2018/rest-property/destructuring-mirror.tree.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
}
6868
},
6969
{
70-
"type": "RestProperty",
70+
"type": "RestElement",
7171
"argument": {
7272
"type": "Identifier",
7373
"name": "y",
@@ -178,7 +178,7 @@
178178
}
179179
},
180180
{
181-
"type": "SpreadProperty",
181+
"type": "SpreadElement",
182182
"argument": {
183183
"type": "Identifier",
184184
"name": "y",

test/fixtures/es2018/rest-property/function-extension.tree.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@
140140
}
141141
},
142142
{
143-
"type": "RestProperty",
143+
"type": "RestElement",
144144
"argument": {
145145
"type": "Identifier",
146146
"name": "z",

test/fixtures/es2018/rest-property/rest-property-object-pattern-arrow.tree.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
}
6969
},
7070
{
71-
"type": "RestProperty",
71+
"type": "RestElement",
7272
"argument": {
7373
"type": "Identifier",
7474
"name": "y",

test/fixtures/es2018/rest-property/shallow-clone.tree.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"type": "ObjectPattern",
1111
"properties": [
1212
{
13-
"type": "RestProperty",
13+
"type": "RestElement",
1414
"argument": {
1515
"type": "Identifier",
1616
"name": "x",

test/fixtures/es2018/rest-property/simple-rest-properties.tree.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@
124124
}
125125
},
126126
{
127-
"type": "RestProperty",
127+
"type": "RestElement",
128128
"argument": {
129129
"type": "Identifier",
130130
"name": "z",

test/fixtures/es2018/spread-property/default-properties.tree.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@
144144
}
145145
},
146146
{
147-
"type": "SpreadProperty",
147+
"type": "SpreadElement",
148148
"argument": {
149149
"type": "Identifier",
150150
"name": "a",
@@ -532,4 +532,4 @@
532532
}
533533
}
534534
]
535-
}
535+
}

0 commit comments

Comments
 (0)