diff --git a/ast/spec.md b/ast/spec.md index 2b57c89eac..9fb37f00fe 100644 --- a/ast/spec.md +++ b/ast/spec.md @@ -1,6 +1,7 @@ These are the core Babylon AST node types. - [Node objects](#node-objects) +- [Changes](#changes) - [Identifier](#identifier) - [Literals](#literals) - [RegExpLiteral](#regexpliteral) @@ -55,8 +56,6 @@ These are the core Babylon AST node types. - [ObjectMember](#objectmember) - [ObjectProperty](#objectproperty) - [ObjectMethod](#objectmethod) - - [RestProperty](#restproperty) - - [SpreadProperty](#spreadproperty) - [FunctionExpression](#functionexpression) - [Unary operations](#unary-operations) - [UnaryExpression](#unaryexpression) @@ -139,6 +138,22 @@ interface Position { } ``` +# Changes + +### Babylon 7 + +Flow: Node renamed from `ExistentialTypeParam` to `ExistsTypeAnnotation` [#322](https://github.com/babel/babylon/pull/322) + +Flow: Node renamed from `NumericLiteralTypeAnnotation` to `NumberLiteralTypeAnnotation` [babel/babylon#332](https://github.com/babel/babylon/pull/332) + +Flow: Node `Variance` which replaces the string value of the `variance` field on several nodes [babel/babylon#333](https://github.com/babel/babylon/pull/333) + +Flow: `ObjectTypeIndexer` location info matches Flow's better [babel/babylon#228](https://github.com/babel/babylon/pull/228) + +Node `ForAwaitStatement` has been removed [#349](https://github.com/babel/babylon/pull/349) in favor of modifying `ForOfStatement` + +`RestProperty` and `SpreadProperty` have been dropped in favor of `RestElement` and `SpreadElement`. + # Identifier ```js @@ -641,7 +656,7 @@ An array expression. ```js interface ObjectExpression <: Expression { type: "ObjectExpression"; - properties: [ ObjectProperty | ObjectMethod | SpreadProperty ]; + properties: [ ObjectProperty | ObjectMethod | SpreadElement ]; } ``` @@ -676,24 +691,6 @@ interface ObjectMethod <: ObjectMember, Function { } ``` -## RestProperty - -```js -interface RestProperty <: Node { - type: "RestProperty"; - argument: Expression; -} -``` - -## SpreadProperty - -```js -interface SpreadProperty <: Node { - type: "SpreadProperty"; - argument: Expression; -} -``` - ## FunctionExpression ```js @@ -960,7 +957,7 @@ interface AssignmentProperty <: ObjectProperty { interface ObjectPattern <: Pattern { type: "ObjectPattern"; - properties: [ AssignmentProperty | RestProperty ]; + properties: [ AssignmentProperty | RestPattern ]; } ``` diff --git a/src/parser/expression.js b/src/parser/expression.js index 11daa9e671..2f76616ba6 100644 --- a/src/parser/expression.js +++ b/src/parser/expression.js @@ -739,7 +739,7 @@ pp.parseObj = function (isPattern, refShorthandDefaultPos) { if (this.hasPlugin("objectRestSpread") && this.match(tt.ellipsis)) { prop = this.parseSpread(isPattern ? { start: 0 } : undefined); - prop.type = isPattern ? "RestProperty" : "SpreadProperty"; + prop.type = isPattern ? "RestElement" : "SpreadElement"; if (isPattern) this.toAssignable(prop.argument, true, "object pattern"); node.properties.push(prop); if (isPattern) { diff --git a/src/parser/lval.js b/src/parser/lval.js index da712e3298..60c26ec9f3 100644 --- a/src/parser/lval.js +++ b/src/parser/lval.js @@ -34,8 +34,8 @@ pp.toAssignable = function (node, isBinding, contextDescription) { this.toAssignable(node.value, isBinding, contextDescription); break; - case "SpreadProperty": - node.type = "RestProperty"; + case "SpreadElement": + node.type = "RestElement"; break; case "ArrayExpression": @@ -85,6 +85,8 @@ pp.toAssignableList = function (exprList, isBinding, contextDescription) { } for (let i = 0; i < end; i++) { const elt = exprList[i]; + if (elt && elt.type === "SpreadElement") + this.raise(elt.start, "The rest element has to be the last element when destructuring"); if (elt) this.toAssignable(elt, isBinding, contextDescription); } return exprList; @@ -246,10 +248,6 @@ pp.checkLVal = function (expr, isBinding, checkClashes, contextDescription) { this.checkLVal(expr.left, isBinding, checkClashes, "assignment pattern"); break; - case "RestProperty": - this.checkLVal(expr.argument, isBinding, checkClashes, "rest property"); - break; - case "RestElement": this.checkLVal(expr.argument, isBinding, checkClashes, "rest element"); break; diff --git a/src/parser/statement.js b/src/parser/statement.js index ab1347ff28..21846879bb 100644 --- a/src/parser/statement.js +++ b/src/parser/statement.js @@ -941,7 +941,7 @@ pp.checkDeclaration = function(node) { } } else if (node.type === "ObjectProperty") { this.checkDeclaration(node.value); - } else if (node.type === "RestElement" || node.type === "RestProperty") { + } else if (node.type === "RestElement") { this.checkDeclaration(node.argument); } else if (node.type === "Identifier") { this.checkDuplicateExports(node, node.name); diff --git a/test/fixtures/es2015/uncategorised/288/actual.js b/test/fixtures/es2015/array-rest-spread/invalid-location/actual.js similarity index 100% rename from test/fixtures/es2015/uncategorised/288/actual.js rename to test/fixtures/es2015/array-rest-spread/invalid-location/actual.js diff --git a/test/fixtures/es2015/array-rest-spread/invalid-location/options.json b/test/fixtures/es2015/array-rest-spread/invalid-location/options.json new file mode 100644 index 0000000000..beef14a214 --- /dev/null +++ b/test/fixtures/es2015/array-rest-spread/invalid-location/options.json @@ -0,0 +1,3 @@ +{ + "throws": "The rest element has to be the last element when destructuring (1:1)" +} diff --git a/test/fixtures/es2015/arrow-functions/object-rest-spread/expected.json b/test/fixtures/es2015/arrow-functions/object-rest-spread/expected.json index 00b780b1c4..e733023e1c 100644 --- a/test/fixtures/es2015/arrow-functions/object-rest-spread/expected.json +++ b/test/fixtures/es2015/arrow-functions/object-rest-spread/expected.json @@ -160,7 +160,7 @@ } }, { - "type": "RestProperty", + "type": "RestElement", "start": 21, "end": 29, "loc": { @@ -218,4 +218,4 @@ ], "directives": [] } -} \ No newline at end of file +} diff --git a/test/fixtures/es2015/uncategorised/288/options.json b/test/fixtures/es2015/uncategorised/288/options.json deleted file mode 100644 index d8b91465e5..0000000000 --- a/test/fixtures/es2015/uncategorised/288/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "throws": "Invalid left-hand side in assignment expression (1:1)" -} \ No newline at end of file diff --git a/test/fixtures/experimental/object-rest-spread/1/expected.json b/test/fixtures/experimental/object-rest-spread/1/expected.json index 5ee0540170..ee18f60048 100644 --- a/test/fixtures/experimental/object-rest-spread/1/expected.json +++ b/test/fixtures/experimental/object-rest-spread/1/expected.json @@ -73,7 +73,7 @@ }, "properties": [ { - "type": "RestProperty", + "type": "RestElement", "start": 5, "end": 9, "loc": { @@ -128,4 +128,4 @@ ], "directives": [] } -} \ No newline at end of file +} diff --git a/test/fixtures/experimental/object-rest-spread/10/expected.json b/test/fixtures/experimental/object-rest-spread/10/expected.json index bce210e65b..181a07c888 100644 --- a/test/fixtures/experimental/object-rest-spread/10/expected.json +++ b/test/fixtures/experimental/object-rest-spread/10/expected.json @@ -208,4 +208,4 @@ ], "directives": [] } -} \ No newline at end of file +} diff --git a/test/fixtures/experimental/object-rest-spread/16/expected.json b/test/fixtures/experimental/object-rest-spread/16/expected.json index 6f6be6d836..a722ab4fb5 100644 --- a/test/fixtures/experimental/object-rest-spread/16/expected.json +++ b/test/fixtures/experimental/object-rest-spread/16/expected.json @@ -73,7 +73,7 @@ }, "properties": [ { - "type": "RestProperty", + "type": "RestElement", "start": 5, "end": 11, "loc": { @@ -240,4 +240,4 @@ ], "directives": [] } -} \ No newline at end of file +} diff --git a/test/fixtures/experimental/object-rest-spread/17/expected.json b/test/fixtures/experimental/object-rest-spread/17/expected.json index 0c15cfbe9c..fa2ec13b14 100644 --- a/test/fixtures/experimental/object-rest-spread/17/expected.json +++ b/test/fixtures/experimental/object-rest-spread/17/expected.json @@ -73,7 +73,7 @@ }, "properties": [ { - "type": "RestProperty", + "type": "RestElement", "start": 6, "end": 18, "loc": { @@ -275,4 +275,4 @@ ], "directives": [] } -} \ No newline at end of file +} diff --git a/test/fixtures/experimental/object-rest-spread/2/expected.json b/test/fixtures/experimental/object-rest-spread/2/expected.json index f017a9cc8e..3e67ea3d00 100644 --- a/test/fixtures/experimental/object-rest-spread/2/expected.json +++ b/test/fixtures/experimental/object-rest-spread/2/expected.json @@ -123,7 +123,7 @@ } }, { - "type": "RestProperty", + "type": "RestElement", "start": 8, "end": 12, "loc": { @@ -178,4 +178,4 @@ ], "directives": [] } -} \ No newline at end of file +} diff --git a/test/fixtures/experimental/object-rest-spread/3/expected.json b/test/fixtures/experimental/object-rest-spread/3/expected.json index 64c2046836..170cb077f2 100644 --- a/test/fixtures/experimental/object-rest-spread/3/expected.json +++ b/test/fixtures/experimental/object-rest-spread/3/expected.json @@ -126,7 +126,7 @@ } }, { - "type": "RestProperty", + "type": "RestElement", "start": 14, "end": 18, "loc": { @@ -184,4 +184,4 @@ ], "directives": [] } -} \ No newline at end of file +} diff --git a/test/fixtures/experimental/object-rest-spread/4/expected.json b/test/fixtures/experimental/object-rest-spread/4/expected.json index 0a777c2a2f..1d025448b2 100644 --- a/test/fixtures/experimental/object-rest-spread/4/expected.json +++ b/test/fixtures/experimental/object-rest-spread/4/expected.json @@ -89,7 +89,7 @@ }, "properties": [ { - "type": "SpreadProperty", + "type": "SpreadElement", "start": 9, "end": 13, "loc": { @@ -127,4 +127,4 @@ } ] } -} \ No newline at end of file +} diff --git a/test/fixtures/experimental/object-rest-spread/5/expected.json b/test/fixtures/experimental/object-rest-spread/5/expected.json index 13c6c8dc0c..4089ed42a6 100644 --- a/test/fixtures/experimental/object-rest-spread/5/expected.json +++ b/test/fixtures/experimental/object-rest-spread/5/expected.json @@ -139,7 +139,7 @@ } }, { - "type": "SpreadProperty", + "type": "SpreadElement", "start": 8, "end": 12, "loc": { @@ -176,4 +176,4 @@ ], "directives": [] } -} \ No newline at end of file +} diff --git a/test/fixtures/experimental/object-rest-spread/6/expected.json b/test/fixtures/experimental/object-rest-spread/6/expected.json index 748d406185..4950385f5f 100644 --- a/test/fixtures/experimental/object-rest-spread/6/expected.json +++ b/test/fixtures/experimental/object-rest-spread/6/expected.json @@ -113,7 +113,7 @@ } }, { - "type": "SpreadProperty", + "type": "SpreadElement", "start": 5, "end": 9, "loc": { @@ -200,7 +200,7 @@ } }, { - "type": "SpreadProperty", + "type": "SpreadElement", "start": 14, "end": 18, "loc": { @@ -296,4 +296,4 @@ ], "directives": [] } -} \ No newline at end of file +}