From 13a1cfd396e6c1f1735c546b3bc4196f69bc52d1 Mon Sep 17 00:00:00 2001 From: Brian Ng Date: Sun, 11 Oct 2020 06:03:57 -0500 Subject: [PATCH] Move check for TSTypeCastExpression to catch another case (#12161) --- .../src/plugins/typescript/index.js | 35 ++++++----- .../cast/parameter-typecast/input.ts | 1 + .../cast/parameter-typecast/output.json | 59 ++++++++++++++++++- 3 files changed, 78 insertions(+), 17 deletions(-) diff --git a/packages/babel-parser/src/plugins/typescript/index.js b/packages/babel-parser/src/plugins/typescript/index.js index 1b9b7f1f3e83..58427987d33c 100644 --- a/packages/babel-parser/src/plugins/typescript/index.js +++ b/packages/babel-parser/src/plugins/typescript/index.js @@ -1803,6 +1803,27 @@ export default (superClass: Class): Class => } } + parseExprListItem( + allowEmpty: ?boolean, + refExpressionErrors?: ?ExpressionErrors, + refNeedsArrowPos: ?Pos, + allowPlaceholder: ?boolean, + ): ?N.Expression { + const node = super.parseExprListItem( + allowEmpty, + refExpressionErrors, + refNeedsArrowPos, + allowPlaceholder, + ); + + // Handle `func(a: T)` or `func(a: T)` + if (!refNeedsArrowPos && node?.type === "TSTypeCastExpression") { + this.raise(node.start, TSErrors.UnexpectedTypeAnnotation); + } + + return node; + } + parseSubscript( base: N.Expression, startPos: number, @@ -2725,20 +2746,6 @@ export default (superClass: Class): Class => return node.expression; } - toReferencedList( - exprList: $ReadOnlyArray, - isInParens?: boolean, // eslint-disable-line no-unused-vars - ): $ReadOnlyArray { - for (let i = 0; i < exprList.length; i++) { - const expr = exprList[i]; - if (expr?.type === "TSTypeCastExpression") { - this.raise(expr.start, TSErrors.UnexpectedTypeAnnotation); - } - } - - return exprList; - } - shouldParseArrow() { return this.match(tt.colon) || super.shouldParseArrow(); } diff --git a/packages/babel-parser/test/fixtures/typescript/cast/parameter-typecast/input.ts b/packages/babel-parser/test/fixtures/typescript/cast/parameter-typecast/input.ts index c494cc00bc39..0a26da3585bc 100644 --- a/packages/babel-parser/test/fixtures/typescript/cast/parameter-typecast/input.ts +++ b/packages/babel-parser/test/fixtures/typescript/cast/parameter-typecast/input.ts @@ -1 +1,2 @@ func(a: T); +func(a: T); diff --git a/packages/babel-parser/test/fixtures/typescript/cast/parameter-typecast/output.json b/packages/babel-parser/test/fixtures/typescript/cast/parameter-typecast/output.json index 1ed571551016..d9518e74b169 100644 --- a/packages/babel-parser/test/fixtures/typescript/cast/parameter-typecast/output.json +++ b/packages/babel-parser/test/fixtures/typescript/cast/parameter-typecast/output.json @@ -1,12 +1,13 @@ { "type": "File", - "start":0,"end":11,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":11}}, + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":2,"column":14}}, "errors": [ - "SyntaxError: Did not expect a type annotation here. (1:5)" + "SyntaxError: Did not expect a type annotation here. (1:5)", + "SyntaxError: Did not expect a type annotation here. (2:8)" ], "program": { "type": "Program", - "start":0,"end":11,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":11}}, + "start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":2,"column":14}}, "sourceType": "module", "interpreter": null, "body": [ @@ -46,6 +47,58 @@ } ] } + }, + { + "type": "ExpressionStatement", + "start":12,"end":26,"loc":{"start":{"line":2,"column":0},"end":{"line":2,"column":14}}, + "expression": { + "type": "CallExpression", + "start":12,"end":25,"loc":{"start":{"line":2,"column":0},"end":{"line":2,"column":13}}, + "callee": { + "type": "Identifier", + "start":12,"end":16,"loc":{"start":{"line":2,"column":0},"end":{"line":2,"column":4},"identifierName":"func"}, + "name": "func" + }, + "arguments": [ + { + "type": "TSTypeCastExpression", + "start":20,"end":24,"loc":{"start":{"line":2,"column":8},"end":{"line":2,"column":12}}, + "expression": { + "type": "Identifier", + "start":20,"end":21,"loc":{"start":{"line":2,"column":8},"end":{"line":2,"column":9},"identifierName":"a"}, + "name": "a" + }, + "typeAnnotation": { + "type": "TSTypeAnnotation", + "start":21,"end":24,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":12}}, + "typeAnnotation": { + "type": "TSTypeReference", + "start":23,"end":24,"loc":{"start":{"line":2,"column":11},"end":{"line":2,"column":12}}, + "typeName": { + "type": "Identifier", + "start":23,"end":24,"loc":{"start":{"line":2,"column":11},"end":{"line":2,"column":12},"identifierName":"T"}, + "name": "T" + } + } + } + } + ], + "typeParameters": { + "type": "TSTypeParameterInstantiation", + "start":16,"end":19,"loc":{"start":{"line":2,"column":4},"end":{"line":2,"column":7}}, + "params": [ + { + "type": "TSTypeReference", + "start":17,"end":18,"loc":{"start":{"line":2,"column":5},"end":{"line":2,"column":6}}, + "typeName": { + "type": "Identifier", + "start":17,"end":18,"loc":{"start":{"line":2,"column":5},"end":{"line":2,"column":6},"identifierName":"T"}, + "name": "T" + } + } + ] + } + } } ], "directives": []