From 03ecb2009ef930fc7339c2da32674a21e5feff75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 18 Mar 2024 14:11:27 +0900 Subject: [PATCH 01/12] Add a test --- crates/swc_ecma_parser/tests/typescript/issue-8735/input.ts | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 crates/swc_ecma_parser/tests/typescript/issue-8735/input.ts diff --git a/crates/swc_ecma_parser/tests/typescript/issue-8735/input.ts b/crates/swc_ecma_parser/tests/typescript/issue-8735/input.ts new file mode 100644 index 000000000000..a68c40716e6f --- /dev/null +++ b/crates/swc_ecma_parser/tests/typescript/issue-8735/input.ts @@ -0,0 +1,5 @@ +function getFirstElement(array: T[]): T | null { + return array.length > 0 ? array[0] : null; +} + +let myFunction = getFirstElement as any; From 4113c0c768415daafe1a485d9b0aeffb888d58d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 18 Mar 2024 14:13:37 +0900 Subject: [PATCH 02/12] Add a test --- .../tests/typescript/issue-8735/{ => 1}/input.ts | 0 .../swc_ecma_parser/tests/typescript/issue-8735/2/input.tsx | 5 +++++ 2 files changed, 5 insertions(+) rename crates/swc_ecma_parser/tests/typescript/issue-8735/{ => 1}/input.ts (100%) create mode 100644 crates/swc_ecma_parser/tests/typescript/issue-8735/2/input.tsx diff --git a/crates/swc_ecma_parser/tests/typescript/issue-8735/input.ts b/crates/swc_ecma_parser/tests/typescript/issue-8735/1/input.ts similarity index 100% rename from crates/swc_ecma_parser/tests/typescript/issue-8735/input.ts rename to crates/swc_ecma_parser/tests/typescript/issue-8735/1/input.ts diff --git a/crates/swc_ecma_parser/tests/typescript/issue-8735/2/input.tsx b/crates/swc_ecma_parser/tests/typescript/issue-8735/2/input.tsx new file mode 100644 index 000000000000..a68c40716e6f --- /dev/null +++ b/crates/swc_ecma_parser/tests/typescript/issue-8735/2/input.tsx @@ -0,0 +1,5 @@ +function getFirstElement(array: T[]): T | null { + return array.length > 0 ? array[0] : null; +} + +let myFunction = getFirstElement as any; From 16a2192a7c38ed0d375ff26a91f76258b4136a91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 18 Mar 2024 14:17:46 +0900 Subject: [PATCH 03/12] Add a test --- .../swc/tests/fixture/issues-8xxx/8735/.swcrc | 19 +++++++++++++++++++ .../tests/fixture/issues-8xxx/8735/input.tsx | 5 +++++ 2 files changed, 24 insertions(+) create mode 100644 crates/swc/tests/fixture/issues-8xxx/8735/.swcrc create mode 100644 crates/swc/tests/fixture/issues-8xxx/8735/input.tsx diff --git a/crates/swc/tests/fixture/issues-8xxx/8735/.swcrc b/crates/swc/tests/fixture/issues-8xxx/8735/.swcrc new file mode 100644 index 000000000000..65f433d6c2c3 --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8735/.swcrc @@ -0,0 +1,19 @@ +{ + "jsc": { + "parser": { + "syntax": "typescript", + "tsx": true + }, + "target": "es5", + "loose": false, + "minify": { + "compress": false, + "mangle": false + } + }, + "module": { + "type": "es6" + }, + "minify": false, + "isModule": true +} \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-8xxx/8735/input.tsx b/crates/swc/tests/fixture/issues-8xxx/8735/input.tsx new file mode 100644 index 000000000000..a68c40716e6f --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8735/input.tsx @@ -0,0 +1,5 @@ +function getFirstElement(array: T[]): T | null { + return array.length > 0 ? array[0] : null; +} + +let myFunction = getFirstElement as any; From 9cad210ddef3234df8c65027a574d88e4b0c94f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 18 Mar 2024 14:18:38 +0900 Subject: [PATCH 04/12] fixup --- crates/swc/tests/fixture/issues-8xxx/8735/{ => input}/.swcrc | 0 crates/swc/tests/fixture/issues-8xxx/8735/{ => input}/input.tsx | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename crates/swc/tests/fixture/issues-8xxx/8735/{ => input}/.swcrc (100%) rename crates/swc/tests/fixture/issues-8xxx/8735/{ => input}/input.tsx (100%) diff --git a/crates/swc/tests/fixture/issues-8xxx/8735/.swcrc b/crates/swc/tests/fixture/issues-8xxx/8735/input/.swcrc similarity index 100% rename from crates/swc/tests/fixture/issues-8xxx/8735/.swcrc rename to crates/swc/tests/fixture/issues-8xxx/8735/input/.swcrc diff --git a/crates/swc/tests/fixture/issues-8xxx/8735/input.tsx b/crates/swc/tests/fixture/issues-8xxx/8735/input/input.tsx similarity index 100% rename from crates/swc/tests/fixture/issues-8xxx/8735/input.tsx rename to crates/swc/tests/fixture/issues-8xxx/8735/input/input.tsx From 4c40a7ebabe7b7ad3d109341a1c5f1cf0341f6d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 18 Mar 2024 14:57:37 +0900 Subject: [PATCH 05/12] fix --- crates/swc_ecma_parser/src/parser/expr.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/crates/swc_ecma_parser/src/parser/expr.rs b/crates/swc_ecma_parser/src/parser/expr.rs index cbbffbef53a0..cd3f7b560b10 100644 --- a/crates/swc_ecma_parser/src/parser/expr.rs +++ b/crates/swc_ecma_parser/src/parser/expr.rs @@ -1238,6 +1238,19 @@ impl Parser { })), true, ))) + } else if is!(p, "as") { + let type_ann = p.in_type().parse_with(|p| p.parse_ts_type())?; + Ok(Some(( + Box::new(Expr::TsAs(TsAsExpr { + span: span!(p, start), + expr: match mut_obj_opt { + Some(Callee::Expr(obj)) => obj.take(), + _ => unreachable!(), + }, + type_ann, + })), + true, + ))) } else if no_call { unexpected!(p, "`") } else { From f91a0c3caced5ae8debc17817144574ee62d3ccc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 18 Mar 2024 14:57:48 +0900 Subject: [PATCH 06/12] Update test refs --- .../typescript/issue-8735/1/input.ts.json | 354 ++++++++++++++++++ .../typescript/issue-8735/2/input.tsx.json | 354 ++++++++++++++++++ 2 files changed, 708 insertions(+) create mode 100644 crates/swc_ecma_parser/tests/typescript/issue-8735/1/input.ts.json create mode 100644 crates/swc_ecma_parser/tests/typescript/issue-8735/2/input.tsx.json diff --git a/crates/swc_ecma_parser/tests/typescript/issue-8735/1/input.ts.json b/crates/swc_ecma_parser/tests/typescript/issue-8735/1/input.ts.json new file mode 100644 index 000000000000..d2aa43da9a3c --- /dev/null +++ b/crates/swc_ecma_parser/tests/typescript/issue-8735/1/input.ts.json @@ -0,0 +1,354 @@ +{ + "type": "Script", + "span": { + "start": 1, + "end": 151, + "ctxt": 0 + }, + "body": [ + { + "type": "FunctionDeclaration", + "identifier": { + "type": "Identifier", + "span": { + "start": 10, + "end": 25, + "ctxt": 0 + }, + "value": "getFirstElement", + "optional": false + }, + "declare": false, + "params": [ + { + "type": "Parameter", + "span": { + "start": 29, + "end": 39, + "ctxt": 0 + }, + "decorators": [], + "pat": { + "type": "Identifier", + "span": { + "start": 29, + "end": 39, + "ctxt": 0 + }, + "value": "array", + "optional": false, + "typeAnnotation": { + "type": "TsTypeAnnotation", + "span": { + "start": 34, + "end": 39, + "ctxt": 0 + }, + "typeAnnotation": { + "type": "TsArrayType", + "span": { + "start": 36, + "end": 39, + "ctxt": 0 + }, + "elemType": { + "type": "TsTypeReference", + "span": { + "start": 36, + "end": 37, + "ctxt": 0 + }, + "typeName": { + "type": "Identifier", + "span": { + "start": 36, + "end": 37, + "ctxt": 0 + }, + "value": "T", + "optional": false + }, + "typeParams": null + } + } + } + } + } + ], + "decorators": [], + "span": { + "start": 1, + "end": 101, + "ctxt": 0 + }, + "body": { + "type": "BlockStatement", + "span": { + "start": 51, + "end": 101, + "ctxt": 0 + }, + "stmts": [ + { + "type": "ReturnStatement", + "span": { + "start": 57, + "end": 99, + "ctxt": 0 + }, + "argument": { + "type": "ConditionalExpression", + "span": { + "start": 64, + "end": 98, + "ctxt": 0 + }, + "test": { + "type": "BinaryExpression", + "span": { + "start": 64, + "end": 80, + "ctxt": 0 + }, + "operator": ">", + "left": { + "type": "MemberExpression", + "span": { + "start": 64, + "end": 76, + "ctxt": 0 + }, + "object": { + "type": "Identifier", + "span": { + "start": 64, + "end": 69, + "ctxt": 0 + }, + "value": "array", + "optional": false + }, + "property": { + "type": "Identifier", + "span": { + "start": 70, + "end": 76, + "ctxt": 0 + }, + "value": "length", + "optional": false + } + }, + "right": { + "type": "NumericLiteral", + "span": { + "start": 79, + "end": 80, + "ctxt": 0 + }, + "value": 0.0, + "raw": "0" + } + }, + "consequent": { + "type": "MemberExpression", + "span": { + "start": 83, + "end": 91, + "ctxt": 0 + }, + "object": { + "type": "Identifier", + "span": { + "start": 83, + "end": 88, + "ctxt": 0 + }, + "value": "array", + "optional": false + }, + "property": { + "type": "Computed", + "span": { + "start": 88, + "end": 91, + "ctxt": 0 + }, + "expression": { + "type": "NumericLiteral", + "span": { + "start": 89, + "end": 90, + "ctxt": 0 + }, + "value": 0.0, + "raw": "0" + } + } + }, + "alternate": { + "type": "NullLiteral", + "span": { + "start": 94, + "end": 98, + "ctxt": 0 + } + } + } + } + ] + }, + "generator": false, + "async": false, + "typeParameters": { + "type": "TsTypeParameterDeclaration", + "span": { + "start": 25, + "end": 28, + "ctxt": 0 + }, + "parameters": [ + { + "type": "TsTypeParameter", + "span": { + "start": 26, + "end": 27, + "ctxt": 0 + }, + "name": { + "type": "Identifier", + "span": { + "start": 26, + "end": 27, + "ctxt": 0 + }, + "value": "T", + "optional": false + }, + "in": false, + "out": false, + "const": false, + "constraint": null, + "default": null + } + ] + }, + "returnType": { + "type": "TsTypeAnnotation", + "span": { + "start": 40, + "end": 50, + "ctxt": 0 + }, + "typeAnnotation": { + "type": "TsUnionType", + "span": { + "start": 42, + "end": 50, + "ctxt": 0 + }, + "types": [ + { + "type": "TsTypeReference", + "span": { + "start": 42, + "end": 43, + "ctxt": 0 + }, + "typeName": { + "type": "Identifier", + "span": { + "start": 42, + "end": 43, + "ctxt": 0 + }, + "value": "T", + "optional": false + }, + "typeParams": null + }, + { + "type": "TsKeywordType", + "span": { + "start": 46, + "end": 50, + "ctxt": 0 + }, + "kind": "null" + } + ] + } + } + }, + { + "type": "VariableDeclaration", + "span": { + "start": 103, + "end": 151, + "ctxt": 0 + }, + "kind": "let", + "declare": false, + "declarations": [ + { + "type": "VariableDeclarator", + "span": { + "start": 107, + "end": 146, + "ctxt": 0 + }, + "id": { + "type": "Identifier", + "span": { + "start": 107, + "end": 117, + "ctxt": 0 + }, + "value": "myFunction", + "optional": false, + "typeAnnotation": null + }, + "init": { + "type": "TsAsExpression", + "span": { + "start": 120, + "end": 146, + "ctxt": 0 + }, + "expression": { + "type": "Identifier", + "span": { + "start": 120, + "end": 135, + "ctxt": 0 + }, + "value": "getFirstElement", + "optional": false + }, + "typeAnnotation": { + "type": "TsTypeReference", + "span": { + "start": 144, + "end": 146, + "ctxt": 0 + }, + "typeName": { + "type": "Identifier", + "span": { + "start": 144, + "end": 146, + "ctxt": 0 + }, + "value": "as", + "optional": false + }, + "typeParams": null + } + }, + "definite": false + } + ] + } + ], + "interpreter": null +} diff --git a/crates/swc_ecma_parser/tests/typescript/issue-8735/2/input.tsx.json b/crates/swc_ecma_parser/tests/typescript/issue-8735/2/input.tsx.json new file mode 100644 index 000000000000..d2aa43da9a3c --- /dev/null +++ b/crates/swc_ecma_parser/tests/typescript/issue-8735/2/input.tsx.json @@ -0,0 +1,354 @@ +{ + "type": "Script", + "span": { + "start": 1, + "end": 151, + "ctxt": 0 + }, + "body": [ + { + "type": "FunctionDeclaration", + "identifier": { + "type": "Identifier", + "span": { + "start": 10, + "end": 25, + "ctxt": 0 + }, + "value": "getFirstElement", + "optional": false + }, + "declare": false, + "params": [ + { + "type": "Parameter", + "span": { + "start": 29, + "end": 39, + "ctxt": 0 + }, + "decorators": [], + "pat": { + "type": "Identifier", + "span": { + "start": 29, + "end": 39, + "ctxt": 0 + }, + "value": "array", + "optional": false, + "typeAnnotation": { + "type": "TsTypeAnnotation", + "span": { + "start": 34, + "end": 39, + "ctxt": 0 + }, + "typeAnnotation": { + "type": "TsArrayType", + "span": { + "start": 36, + "end": 39, + "ctxt": 0 + }, + "elemType": { + "type": "TsTypeReference", + "span": { + "start": 36, + "end": 37, + "ctxt": 0 + }, + "typeName": { + "type": "Identifier", + "span": { + "start": 36, + "end": 37, + "ctxt": 0 + }, + "value": "T", + "optional": false + }, + "typeParams": null + } + } + } + } + } + ], + "decorators": [], + "span": { + "start": 1, + "end": 101, + "ctxt": 0 + }, + "body": { + "type": "BlockStatement", + "span": { + "start": 51, + "end": 101, + "ctxt": 0 + }, + "stmts": [ + { + "type": "ReturnStatement", + "span": { + "start": 57, + "end": 99, + "ctxt": 0 + }, + "argument": { + "type": "ConditionalExpression", + "span": { + "start": 64, + "end": 98, + "ctxt": 0 + }, + "test": { + "type": "BinaryExpression", + "span": { + "start": 64, + "end": 80, + "ctxt": 0 + }, + "operator": ">", + "left": { + "type": "MemberExpression", + "span": { + "start": 64, + "end": 76, + "ctxt": 0 + }, + "object": { + "type": "Identifier", + "span": { + "start": 64, + "end": 69, + "ctxt": 0 + }, + "value": "array", + "optional": false + }, + "property": { + "type": "Identifier", + "span": { + "start": 70, + "end": 76, + "ctxt": 0 + }, + "value": "length", + "optional": false + } + }, + "right": { + "type": "NumericLiteral", + "span": { + "start": 79, + "end": 80, + "ctxt": 0 + }, + "value": 0.0, + "raw": "0" + } + }, + "consequent": { + "type": "MemberExpression", + "span": { + "start": 83, + "end": 91, + "ctxt": 0 + }, + "object": { + "type": "Identifier", + "span": { + "start": 83, + "end": 88, + "ctxt": 0 + }, + "value": "array", + "optional": false + }, + "property": { + "type": "Computed", + "span": { + "start": 88, + "end": 91, + "ctxt": 0 + }, + "expression": { + "type": "NumericLiteral", + "span": { + "start": 89, + "end": 90, + "ctxt": 0 + }, + "value": 0.0, + "raw": "0" + } + } + }, + "alternate": { + "type": "NullLiteral", + "span": { + "start": 94, + "end": 98, + "ctxt": 0 + } + } + } + } + ] + }, + "generator": false, + "async": false, + "typeParameters": { + "type": "TsTypeParameterDeclaration", + "span": { + "start": 25, + "end": 28, + "ctxt": 0 + }, + "parameters": [ + { + "type": "TsTypeParameter", + "span": { + "start": 26, + "end": 27, + "ctxt": 0 + }, + "name": { + "type": "Identifier", + "span": { + "start": 26, + "end": 27, + "ctxt": 0 + }, + "value": "T", + "optional": false + }, + "in": false, + "out": false, + "const": false, + "constraint": null, + "default": null + } + ] + }, + "returnType": { + "type": "TsTypeAnnotation", + "span": { + "start": 40, + "end": 50, + "ctxt": 0 + }, + "typeAnnotation": { + "type": "TsUnionType", + "span": { + "start": 42, + "end": 50, + "ctxt": 0 + }, + "types": [ + { + "type": "TsTypeReference", + "span": { + "start": 42, + "end": 43, + "ctxt": 0 + }, + "typeName": { + "type": "Identifier", + "span": { + "start": 42, + "end": 43, + "ctxt": 0 + }, + "value": "T", + "optional": false + }, + "typeParams": null + }, + { + "type": "TsKeywordType", + "span": { + "start": 46, + "end": 50, + "ctxt": 0 + }, + "kind": "null" + } + ] + } + } + }, + { + "type": "VariableDeclaration", + "span": { + "start": 103, + "end": 151, + "ctxt": 0 + }, + "kind": "let", + "declare": false, + "declarations": [ + { + "type": "VariableDeclarator", + "span": { + "start": 107, + "end": 146, + "ctxt": 0 + }, + "id": { + "type": "Identifier", + "span": { + "start": 107, + "end": 117, + "ctxt": 0 + }, + "value": "myFunction", + "optional": false, + "typeAnnotation": null + }, + "init": { + "type": "TsAsExpression", + "span": { + "start": 120, + "end": 146, + "ctxt": 0 + }, + "expression": { + "type": "Identifier", + "span": { + "start": 120, + "end": 135, + "ctxt": 0 + }, + "value": "getFirstElement", + "optional": false + }, + "typeAnnotation": { + "type": "TsTypeReference", + "span": { + "start": 144, + "end": 146, + "ctxt": 0 + }, + "typeName": { + "type": "Identifier", + "span": { + "start": 144, + "end": 146, + "ctxt": 0 + }, + "value": "as", + "optional": false + }, + "typeParams": null + } + }, + "definite": false + } + ] + } + ], + "interpreter": null +} From 6e4da7ddcf160fad7f89b36141e15a8eeaa6349c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 18 Mar 2024 14:59:37 +0900 Subject: [PATCH 07/12] stop --- crates/swc_ecma_parser/src/parser/expr.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/swc_ecma_parser/src/parser/expr.rs b/crates/swc_ecma_parser/src/parser/expr.rs index cd3f7b560b10..5d34dc5931ff 100644 --- a/crates/swc_ecma_parser/src/parser/expr.rs +++ b/crates/swc_ecma_parser/src/parser/expr.rs @@ -1249,7 +1249,7 @@ impl Parser { }, type_ann, })), - true, + false, ))) } else if no_call { unexpected!(p, "`") From 4f598aabcfc5bfa2f01b0192bbd1751d9394cc43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 18 Mar 2024 15:00:05 +0900 Subject: [PATCH 08/12] real fix --- crates/swc_ecma_parser/src/parser/expr.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/swc_ecma_parser/src/parser/expr.rs b/crates/swc_ecma_parser/src/parser/expr.rs index 5d34dc5931ff..328a37ab21de 100644 --- a/crates/swc_ecma_parser/src/parser/expr.rs +++ b/crates/swc_ecma_parser/src/parser/expr.rs @@ -1238,7 +1238,7 @@ impl Parser { })), true, ))) - } else if is!(p, "as") { + } else if eat!(p, "as") { let type_ann = p.in_type().parse_with(|p| p.parse_ts_type())?; Ok(Some(( Box::new(Expr::TsAs(TsAsExpr { From e9982a8f0fc52a2938978f823eb0654188ae8962 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 18 Mar 2024 15:00:33 +0900 Subject: [PATCH 09/12] Revert "Update test refs" This reverts commit f91a0c3caced5ae8debc17817144574ee62d3ccc. --- .../typescript/issue-8735/1/input.ts.json | 354 ------------------ .../typescript/issue-8735/2/input.tsx.json | 354 ------------------ 2 files changed, 708 deletions(-) delete mode 100644 crates/swc_ecma_parser/tests/typescript/issue-8735/1/input.ts.json delete mode 100644 crates/swc_ecma_parser/tests/typescript/issue-8735/2/input.tsx.json diff --git a/crates/swc_ecma_parser/tests/typescript/issue-8735/1/input.ts.json b/crates/swc_ecma_parser/tests/typescript/issue-8735/1/input.ts.json deleted file mode 100644 index d2aa43da9a3c..000000000000 --- a/crates/swc_ecma_parser/tests/typescript/issue-8735/1/input.ts.json +++ /dev/null @@ -1,354 +0,0 @@ -{ - "type": "Script", - "span": { - "start": 1, - "end": 151, - "ctxt": 0 - }, - "body": [ - { - "type": "FunctionDeclaration", - "identifier": { - "type": "Identifier", - "span": { - "start": 10, - "end": 25, - "ctxt": 0 - }, - "value": "getFirstElement", - "optional": false - }, - "declare": false, - "params": [ - { - "type": "Parameter", - "span": { - "start": 29, - "end": 39, - "ctxt": 0 - }, - "decorators": [], - "pat": { - "type": "Identifier", - "span": { - "start": 29, - "end": 39, - "ctxt": 0 - }, - "value": "array", - "optional": false, - "typeAnnotation": { - "type": "TsTypeAnnotation", - "span": { - "start": 34, - "end": 39, - "ctxt": 0 - }, - "typeAnnotation": { - "type": "TsArrayType", - "span": { - "start": 36, - "end": 39, - "ctxt": 0 - }, - "elemType": { - "type": "TsTypeReference", - "span": { - "start": 36, - "end": 37, - "ctxt": 0 - }, - "typeName": { - "type": "Identifier", - "span": { - "start": 36, - "end": 37, - "ctxt": 0 - }, - "value": "T", - "optional": false - }, - "typeParams": null - } - } - } - } - } - ], - "decorators": [], - "span": { - "start": 1, - "end": 101, - "ctxt": 0 - }, - "body": { - "type": "BlockStatement", - "span": { - "start": 51, - "end": 101, - "ctxt": 0 - }, - "stmts": [ - { - "type": "ReturnStatement", - "span": { - "start": 57, - "end": 99, - "ctxt": 0 - }, - "argument": { - "type": "ConditionalExpression", - "span": { - "start": 64, - "end": 98, - "ctxt": 0 - }, - "test": { - "type": "BinaryExpression", - "span": { - "start": 64, - "end": 80, - "ctxt": 0 - }, - "operator": ">", - "left": { - "type": "MemberExpression", - "span": { - "start": 64, - "end": 76, - "ctxt": 0 - }, - "object": { - "type": "Identifier", - "span": { - "start": 64, - "end": 69, - "ctxt": 0 - }, - "value": "array", - "optional": false - }, - "property": { - "type": "Identifier", - "span": { - "start": 70, - "end": 76, - "ctxt": 0 - }, - "value": "length", - "optional": false - } - }, - "right": { - "type": "NumericLiteral", - "span": { - "start": 79, - "end": 80, - "ctxt": 0 - }, - "value": 0.0, - "raw": "0" - } - }, - "consequent": { - "type": "MemberExpression", - "span": { - "start": 83, - "end": 91, - "ctxt": 0 - }, - "object": { - "type": "Identifier", - "span": { - "start": 83, - "end": 88, - "ctxt": 0 - }, - "value": "array", - "optional": false - }, - "property": { - "type": "Computed", - "span": { - "start": 88, - "end": 91, - "ctxt": 0 - }, - "expression": { - "type": "NumericLiteral", - "span": { - "start": 89, - "end": 90, - "ctxt": 0 - }, - "value": 0.0, - "raw": "0" - } - } - }, - "alternate": { - "type": "NullLiteral", - "span": { - "start": 94, - "end": 98, - "ctxt": 0 - } - } - } - } - ] - }, - "generator": false, - "async": false, - "typeParameters": { - "type": "TsTypeParameterDeclaration", - "span": { - "start": 25, - "end": 28, - "ctxt": 0 - }, - "parameters": [ - { - "type": "TsTypeParameter", - "span": { - "start": 26, - "end": 27, - "ctxt": 0 - }, - "name": { - "type": "Identifier", - "span": { - "start": 26, - "end": 27, - "ctxt": 0 - }, - "value": "T", - "optional": false - }, - "in": false, - "out": false, - "const": false, - "constraint": null, - "default": null - } - ] - }, - "returnType": { - "type": "TsTypeAnnotation", - "span": { - "start": 40, - "end": 50, - "ctxt": 0 - }, - "typeAnnotation": { - "type": "TsUnionType", - "span": { - "start": 42, - "end": 50, - "ctxt": 0 - }, - "types": [ - { - "type": "TsTypeReference", - "span": { - "start": 42, - "end": 43, - "ctxt": 0 - }, - "typeName": { - "type": "Identifier", - "span": { - "start": 42, - "end": 43, - "ctxt": 0 - }, - "value": "T", - "optional": false - }, - "typeParams": null - }, - { - "type": "TsKeywordType", - "span": { - "start": 46, - "end": 50, - "ctxt": 0 - }, - "kind": "null" - } - ] - } - } - }, - { - "type": "VariableDeclaration", - "span": { - "start": 103, - "end": 151, - "ctxt": 0 - }, - "kind": "let", - "declare": false, - "declarations": [ - { - "type": "VariableDeclarator", - "span": { - "start": 107, - "end": 146, - "ctxt": 0 - }, - "id": { - "type": "Identifier", - "span": { - "start": 107, - "end": 117, - "ctxt": 0 - }, - "value": "myFunction", - "optional": false, - "typeAnnotation": null - }, - "init": { - "type": "TsAsExpression", - "span": { - "start": 120, - "end": 146, - "ctxt": 0 - }, - "expression": { - "type": "Identifier", - "span": { - "start": 120, - "end": 135, - "ctxt": 0 - }, - "value": "getFirstElement", - "optional": false - }, - "typeAnnotation": { - "type": "TsTypeReference", - "span": { - "start": 144, - "end": 146, - "ctxt": 0 - }, - "typeName": { - "type": "Identifier", - "span": { - "start": 144, - "end": 146, - "ctxt": 0 - }, - "value": "as", - "optional": false - }, - "typeParams": null - } - }, - "definite": false - } - ] - } - ], - "interpreter": null -} diff --git a/crates/swc_ecma_parser/tests/typescript/issue-8735/2/input.tsx.json b/crates/swc_ecma_parser/tests/typescript/issue-8735/2/input.tsx.json deleted file mode 100644 index d2aa43da9a3c..000000000000 --- a/crates/swc_ecma_parser/tests/typescript/issue-8735/2/input.tsx.json +++ /dev/null @@ -1,354 +0,0 @@ -{ - "type": "Script", - "span": { - "start": 1, - "end": 151, - "ctxt": 0 - }, - "body": [ - { - "type": "FunctionDeclaration", - "identifier": { - "type": "Identifier", - "span": { - "start": 10, - "end": 25, - "ctxt": 0 - }, - "value": "getFirstElement", - "optional": false - }, - "declare": false, - "params": [ - { - "type": "Parameter", - "span": { - "start": 29, - "end": 39, - "ctxt": 0 - }, - "decorators": [], - "pat": { - "type": "Identifier", - "span": { - "start": 29, - "end": 39, - "ctxt": 0 - }, - "value": "array", - "optional": false, - "typeAnnotation": { - "type": "TsTypeAnnotation", - "span": { - "start": 34, - "end": 39, - "ctxt": 0 - }, - "typeAnnotation": { - "type": "TsArrayType", - "span": { - "start": 36, - "end": 39, - "ctxt": 0 - }, - "elemType": { - "type": "TsTypeReference", - "span": { - "start": 36, - "end": 37, - "ctxt": 0 - }, - "typeName": { - "type": "Identifier", - "span": { - "start": 36, - "end": 37, - "ctxt": 0 - }, - "value": "T", - "optional": false - }, - "typeParams": null - } - } - } - } - } - ], - "decorators": [], - "span": { - "start": 1, - "end": 101, - "ctxt": 0 - }, - "body": { - "type": "BlockStatement", - "span": { - "start": 51, - "end": 101, - "ctxt": 0 - }, - "stmts": [ - { - "type": "ReturnStatement", - "span": { - "start": 57, - "end": 99, - "ctxt": 0 - }, - "argument": { - "type": "ConditionalExpression", - "span": { - "start": 64, - "end": 98, - "ctxt": 0 - }, - "test": { - "type": "BinaryExpression", - "span": { - "start": 64, - "end": 80, - "ctxt": 0 - }, - "operator": ">", - "left": { - "type": "MemberExpression", - "span": { - "start": 64, - "end": 76, - "ctxt": 0 - }, - "object": { - "type": "Identifier", - "span": { - "start": 64, - "end": 69, - "ctxt": 0 - }, - "value": "array", - "optional": false - }, - "property": { - "type": "Identifier", - "span": { - "start": 70, - "end": 76, - "ctxt": 0 - }, - "value": "length", - "optional": false - } - }, - "right": { - "type": "NumericLiteral", - "span": { - "start": 79, - "end": 80, - "ctxt": 0 - }, - "value": 0.0, - "raw": "0" - } - }, - "consequent": { - "type": "MemberExpression", - "span": { - "start": 83, - "end": 91, - "ctxt": 0 - }, - "object": { - "type": "Identifier", - "span": { - "start": 83, - "end": 88, - "ctxt": 0 - }, - "value": "array", - "optional": false - }, - "property": { - "type": "Computed", - "span": { - "start": 88, - "end": 91, - "ctxt": 0 - }, - "expression": { - "type": "NumericLiteral", - "span": { - "start": 89, - "end": 90, - "ctxt": 0 - }, - "value": 0.0, - "raw": "0" - } - } - }, - "alternate": { - "type": "NullLiteral", - "span": { - "start": 94, - "end": 98, - "ctxt": 0 - } - } - } - } - ] - }, - "generator": false, - "async": false, - "typeParameters": { - "type": "TsTypeParameterDeclaration", - "span": { - "start": 25, - "end": 28, - "ctxt": 0 - }, - "parameters": [ - { - "type": "TsTypeParameter", - "span": { - "start": 26, - "end": 27, - "ctxt": 0 - }, - "name": { - "type": "Identifier", - "span": { - "start": 26, - "end": 27, - "ctxt": 0 - }, - "value": "T", - "optional": false - }, - "in": false, - "out": false, - "const": false, - "constraint": null, - "default": null - } - ] - }, - "returnType": { - "type": "TsTypeAnnotation", - "span": { - "start": 40, - "end": 50, - "ctxt": 0 - }, - "typeAnnotation": { - "type": "TsUnionType", - "span": { - "start": 42, - "end": 50, - "ctxt": 0 - }, - "types": [ - { - "type": "TsTypeReference", - "span": { - "start": 42, - "end": 43, - "ctxt": 0 - }, - "typeName": { - "type": "Identifier", - "span": { - "start": 42, - "end": 43, - "ctxt": 0 - }, - "value": "T", - "optional": false - }, - "typeParams": null - }, - { - "type": "TsKeywordType", - "span": { - "start": 46, - "end": 50, - "ctxt": 0 - }, - "kind": "null" - } - ] - } - } - }, - { - "type": "VariableDeclaration", - "span": { - "start": 103, - "end": 151, - "ctxt": 0 - }, - "kind": "let", - "declare": false, - "declarations": [ - { - "type": "VariableDeclarator", - "span": { - "start": 107, - "end": 146, - "ctxt": 0 - }, - "id": { - "type": "Identifier", - "span": { - "start": 107, - "end": 117, - "ctxt": 0 - }, - "value": "myFunction", - "optional": false, - "typeAnnotation": null - }, - "init": { - "type": "TsAsExpression", - "span": { - "start": 120, - "end": 146, - "ctxt": 0 - }, - "expression": { - "type": "Identifier", - "span": { - "start": 120, - "end": 135, - "ctxt": 0 - }, - "value": "getFirstElement", - "optional": false - }, - "typeAnnotation": { - "type": "TsTypeReference", - "span": { - "start": 144, - "end": 146, - "ctxt": 0 - }, - "typeName": { - "type": "Identifier", - "span": { - "start": 144, - "end": 146, - "ctxt": 0 - }, - "value": "as", - "optional": false - }, - "typeParams": null - } - }, - "definite": false - } - ] - } - ], - "interpreter": null -} From b024cf01f9134abb5b3c41b0fd8d4c40860a9772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 18 Mar 2024 15:03:34 +0900 Subject: [PATCH 10/12] fix --- crates/swc_ecma_parser/src/parser/expr.rs | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/crates/swc_ecma_parser/src/parser/expr.rs b/crates/swc_ecma_parser/src/parser/expr.rs index 328a37ab21de..705b1e23f4e2 100644 --- a/crates/swc_ecma_parser/src/parser/expr.rs +++ b/crates/swc_ecma_parser/src/parser/expr.rs @@ -1226,7 +1226,7 @@ impl Parser { ) .map(|expr| (Box::new(Expr::TaggedTpl(expr)), true)) .map(Some) - } else if is!(p, '=') { + } else if is_one_of!(p, '=', "as") { Ok(Some(( Box::new(Expr::TsInstantiation(TsInstantiation { span: span!(p, start), @@ -1236,19 +1236,6 @@ impl Parser { }, type_args, })), - true, - ))) - } else if eat!(p, "as") { - let type_ann = p.in_type().parse_with(|p| p.parse_ts_type())?; - Ok(Some(( - Box::new(Expr::TsAs(TsAsExpr { - span: span!(p, start), - expr: match mut_obj_opt { - Some(Callee::Expr(obj)) => obj.take(), - _ => unreachable!(), - }, - type_ann, - })), false, ))) } else if no_call { From 4c6920f4b8664f5e613f31241afc6f5d67bc6b33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 18 Mar 2024 15:03:53 +0900 Subject: [PATCH 11/12] Update test refs --- crates/swc/tests/fixture/issues-8xxx/8735/output/input.tsx | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 crates/swc/tests/fixture/issues-8xxx/8735/output/input.tsx diff --git a/crates/swc/tests/fixture/issues-8xxx/8735/output/input.tsx b/crates/swc/tests/fixture/issues-8xxx/8735/output/input.tsx new file mode 100644 index 000000000000..4b12ddc03e08 --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8735/output/input.tsx @@ -0,0 +1,4 @@ +function getFirstElement(array) { + return array.length > 0 ? array[0] : null; +} +var myFunction = getFirstElement; From acd4d5d299029cba266f9de16b00e0e47b946261 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Mon, 18 Mar 2024 15:04:00 +0900 Subject: [PATCH 12/12] Update test refs --- .../typescript/issue-8735/1/input.ts.json | 371 ++++++++++++++++++ .../typescript/issue-8735/2/input.tsx.json | 371 ++++++++++++++++++ 2 files changed, 742 insertions(+) create mode 100644 crates/swc_ecma_parser/tests/typescript/issue-8735/1/input.ts.json create mode 100644 crates/swc_ecma_parser/tests/typescript/issue-8735/2/input.tsx.json diff --git a/crates/swc_ecma_parser/tests/typescript/issue-8735/1/input.ts.json b/crates/swc_ecma_parser/tests/typescript/issue-8735/1/input.ts.json new file mode 100644 index 000000000000..44d43e2a9f2f --- /dev/null +++ b/crates/swc_ecma_parser/tests/typescript/issue-8735/1/input.ts.json @@ -0,0 +1,371 @@ +{ + "type": "Script", + "span": { + "start": 1, + "end": 151, + "ctxt": 0 + }, + "body": [ + { + "type": "FunctionDeclaration", + "identifier": { + "type": "Identifier", + "span": { + "start": 10, + "end": 25, + "ctxt": 0 + }, + "value": "getFirstElement", + "optional": false + }, + "declare": false, + "params": [ + { + "type": "Parameter", + "span": { + "start": 29, + "end": 39, + "ctxt": 0 + }, + "decorators": [], + "pat": { + "type": "Identifier", + "span": { + "start": 29, + "end": 39, + "ctxt": 0 + }, + "value": "array", + "optional": false, + "typeAnnotation": { + "type": "TsTypeAnnotation", + "span": { + "start": 34, + "end": 39, + "ctxt": 0 + }, + "typeAnnotation": { + "type": "TsArrayType", + "span": { + "start": 36, + "end": 39, + "ctxt": 0 + }, + "elemType": { + "type": "TsTypeReference", + "span": { + "start": 36, + "end": 37, + "ctxt": 0 + }, + "typeName": { + "type": "Identifier", + "span": { + "start": 36, + "end": 37, + "ctxt": 0 + }, + "value": "T", + "optional": false + }, + "typeParams": null + } + } + } + } + } + ], + "decorators": [], + "span": { + "start": 1, + "end": 101, + "ctxt": 0 + }, + "body": { + "type": "BlockStatement", + "span": { + "start": 51, + "end": 101, + "ctxt": 0 + }, + "stmts": [ + { + "type": "ReturnStatement", + "span": { + "start": 57, + "end": 99, + "ctxt": 0 + }, + "argument": { + "type": "ConditionalExpression", + "span": { + "start": 64, + "end": 98, + "ctxt": 0 + }, + "test": { + "type": "BinaryExpression", + "span": { + "start": 64, + "end": 80, + "ctxt": 0 + }, + "operator": ">", + "left": { + "type": "MemberExpression", + "span": { + "start": 64, + "end": 76, + "ctxt": 0 + }, + "object": { + "type": "Identifier", + "span": { + "start": 64, + "end": 69, + "ctxt": 0 + }, + "value": "array", + "optional": false + }, + "property": { + "type": "Identifier", + "span": { + "start": 70, + "end": 76, + "ctxt": 0 + }, + "value": "length", + "optional": false + } + }, + "right": { + "type": "NumericLiteral", + "span": { + "start": 79, + "end": 80, + "ctxt": 0 + }, + "value": 0.0, + "raw": "0" + } + }, + "consequent": { + "type": "MemberExpression", + "span": { + "start": 83, + "end": 91, + "ctxt": 0 + }, + "object": { + "type": "Identifier", + "span": { + "start": 83, + "end": 88, + "ctxt": 0 + }, + "value": "array", + "optional": false + }, + "property": { + "type": "Computed", + "span": { + "start": 88, + "end": 91, + "ctxt": 0 + }, + "expression": { + "type": "NumericLiteral", + "span": { + "start": 89, + "end": 90, + "ctxt": 0 + }, + "value": 0.0, + "raw": "0" + } + } + }, + "alternate": { + "type": "NullLiteral", + "span": { + "start": 94, + "end": 98, + "ctxt": 0 + } + } + } + } + ] + }, + "generator": false, + "async": false, + "typeParameters": { + "type": "TsTypeParameterDeclaration", + "span": { + "start": 25, + "end": 28, + "ctxt": 0 + }, + "parameters": [ + { + "type": "TsTypeParameter", + "span": { + "start": 26, + "end": 27, + "ctxt": 0 + }, + "name": { + "type": "Identifier", + "span": { + "start": 26, + "end": 27, + "ctxt": 0 + }, + "value": "T", + "optional": false + }, + "in": false, + "out": false, + "const": false, + "constraint": null, + "default": null + } + ] + }, + "returnType": { + "type": "TsTypeAnnotation", + "span": { + "start": 40, + "end": 50, + "ctxt": 0 + }, + "typeAnnotation": { + "type": "TsUnionType", + "span": { + "start": 42, + "end": 50, + "ctxt": 0 + }, + "types": [ + { + "type": "TsTypeReference", + "span": { + "start": 42, + "end": 43, + "ctxt": 0 + }, + "typeName": { + "type": "Identifier", + "span": { + "start": 42, + "end": 43, + "ctxt": 0 + }, + "value": "T", + "optional": false + }, + "typeParams": null + }, + { + "type": "TsKeywordType", + "span": { + "start": 46, + "end": 50, + "ctxt": 0 + }, + "kind": "null" + } + ] + } + } + }, + { + "type": "VariableDeclaration", + "span": { + "start": 103, + "end": 151, + "ctxt": 0 + }, + "kind": "let", + "declare": false, + "declarations": [ + { + "type": "VariableDeclarator", + "span": { + "start": 107, + "end": 150, + "ctxt": 0 + }, + "id": { + "type": "Identifier", + "span": { + "start": 107, + "end": 117, + "ctxt": 0 + }, + "value": "myFunction", + "optional": false, + "typeAnnotation": null + }, + "init": { + "type": "TsAsExpression", + "span": { + "start": 120, + "end": 150, + "ctxt": 0 + }, + "expression": { + "type": "TsInstantiation", + "span": { + "start": 120, + "end": 143, + "ctxt": 0 + }, + "expression": { + "type": "Identifier", + "span": { + "start": 120, + "end": 135, + "ctxt": 0 + }, + "value": "getFirstElement", + "optional": false + }, + "typeArguments": { + "type": "TsTypeParameterInstantiation", + "span": { + "start": 135, + "end": 143, + "ctxt": 0 + }, + "params": [ + { + "type": "TsKeywordType", + "span": { + "start": 136, + "end": 142, + "ctxt": 0 + }, + "kind": "number" + } + ] + } + }, + "typeAnnotation": { + "type": "TsKeywordType", + "span": { + "start": 147, + "end": 150, + "ctxt": 0 + }, + "kind": "any" + } + }, + "definite": false + } + ] + } + ], + "interpreter": null +} diff --git a/crates/swc_ecma_parser/tests/typescript/issue-8735/2/input.tsx.json b/crates/swc_ecma_parser/tests/typescript/issue-8735/2/input.tsx.json new file mode 100644 index 000000000000..44d43e2a9f2f --- /dev/null +++ b/crates/swc_ecma_parser/tests/typescript/issue-8735/2/input.tsx.json @@ -0,0 +1,371 @@ +{ + "type": "Script", + "span": { + "start": 1, + "end": 151, + "ctxt": 0 + }, + "body": [ + { + "type": "FunctionDeclaration", + "identifier": { + "type": "Identifier", + "span": { + "start": 10, + "end": 25, + "ctxt": 0 + }, + "value": "getFirstElement", + "optional": false + }, + "declare": false, + "params": [ + { + "type": "Parameter", + "span": { + "start": 29, + "end": 39, + "ctxt": 0 + }, + "decorators": [], + "pat": { + "type": "Identifier", + "span": { + "start": 29, + "end": 39, + "ctxt": 0 + }, + "value": "array", + "optional": false, + "typeAnnotation": { + "type": "TsTypeAnnotation", + "span": { + "start": 34, + "end": 39, + "ctxt": 0 + }, + "typeAnnotation": { + "type": "TsArrayType", + "span": { + "start": 36, + "end": 39, + "ctxt": 0 + }, + "elemType": { + "type": "TsTypeReference", + "span": { + "start": 36, + "end": 37, + "ctxt": 0 + }, + "typeName": { + "type": "Identifier", + "span": { + "start": 36, + "end": 37, + "ctxt": 0 + }, + "value": "T", + "optional": false + }, + "typeParams": null + } + } + } + } + } + ], + "decorators": [], + "span": { + "start": 1, + "end": 101, + "ctxt": 0 + }, + "body": { + "type": "BlockStatement", + "span": { + "start": 51, + "end": 101, + "ctxt": 0 + }, + "stmts": [ + { + "type": "ReturnStatement", + "span": { + "start": 57, + "end": 99, + "ctxt": 0 + }, + "argument": { + "type": "ConditionalExpression", + "span": { + "start": 64, + "end": 98, + "ctxt": 0 + }, + "test": { + "type": "BinaryExpression", + "span": { + "start": 64, + "end": 80, + "ctxt": 0 + }, + "operator": ">", + "left": { + "type": "MemberExpression", + "span": { + "start": 64, + "end": 76, + "ctxt": 0 + }, + "object": { + "type": "Identifier", + "span": { + "start": 64, + "end": 69, + "ctxt": 0 + }, + "value": "array", + "optional": false + }, + "property": { + "type": "Identifier", + "span": { + "start": 70, + "end": 76, + "ctxt": 0 + }, + "value": "length", + "optional": false + } + }, + "right": { + "type": "NumericLiteral", + "span": { + "start": 79, + "end": 80, + "ctxt": 0 + }, + "value": 0.0, + "raw": "0" + } + }, + "consequent": { + "type": "MemberExpression", + "span": { + "start": 83, + "end": 91, + "ctxt": 0 + }, + "object": { + "type": "Identifier", + "span": { + "start": 83, + "end": 88, + "ctxt": 0 + }, + "value": "array", + "optional": false + }, + "property": { + "type": "Computed", + "span": { + "start": 88, + "end": 91, + "ctxt": 0 + }, + "expression": { + "type": "NumericLiteral", + "span": { + "start": 89, + "end": 90, + "ctxt": 0 + }, + "value": 0.0, + "raw": "0" + } + } + }, + "alternate": { + "type": "NullLiteral", + "span": { + "start": 94, + "end": 98, + "ctxt": 0 + } + } + } + } + ] + }, + "generator": false, + "async": false, + "typeParameters": { + "type": "TsTypeParameterDeclaration", + "span": { + "start": 25, + "end": 28, + "ctxt": 0 + }, + "parameters": [ + { + "type": "TsTypeParameter", + "span": { + "start": 26, + "end": 27, + "ctxt": 0 + }, + "name": { + "type": "Identifier", + "span": { + "start": 26, + "end": 27, + "ctxt": 0 + }, + "value": "T", + "optional": false + }, + "in": false, + "out": false, + "const": false, + "constraint": null, + "default": null + } + ] + }, + "returnType": { + "type": "TsTypeAnnotation", + "span": { + "start": 40, + "end": 50, + "ctxt": 0 + }, + "typeAnnotation": { + "type": "TsUnionType", + "span": { + "start": 42, + "end": 50, + "ctxt": 0 + }, + "types": [ + { + "type": "TsTypeReference", + "span": { + "start": 42, + "end": 43, + "ctxt": 0 + }, + "typeName": { + "type": "Identifier", + "span": { + "start": 42, + "end": 43, + "ctxt": 0 + }, + "value": "T", + "optional": false + }, + "typeParams": null + }, + { + "type": "TsKeywordType", + "span": { + "start": 46, + "end": 50, + "ctxt": 0 + }, + "kind": "null" + } + ] + } + } + }, + { + "type": "VariableDeclaration", + "span": { + "start": 103, + "end": 151, + "ctxt": 0 + }, + "kind": "let", + "declare": false, + "declarations": [ + { + "type": "VariableDeclarator", + "span": { + "start": 107, + "end": 150, + "ctxt": 0 + }, + "id": { + "type": "Identifier", + "span": { + "start": 107, + "end": 117, + "ctxt": 0 + }, + "value": "myFunction", + "optional": false, + "typeAnnotation": null + }, + "init": { + "type": "TsAsExpression", + "span": { + "start": 120, + "end": 150, + "ctxt": 0 + }, + "expression": { + "type": "TsInstantiation", + "span": { + "start": 120, + "end": 143, + "ctxt": 0 + }, + "expression": { + "type": "Identifier", + "span": { + "start": 120, + "end": 135, + "ctxt": 0 + }, + "value": "getFirstElement", + "optional": false + }, + "typeArguments": { + "type": "TsTypeParameterInstantiation", + "span": { + "start": 135, + "end": 143, + "ctxt": 0 + }, + "params": [ + { + "type": "TsKeywordType", + "span": { + "start": 136, + "end": 142, + "ctxt": 0 + }, + "kind": "number" + } + ] + } + }, + "typeAnnotation": { + "type": "TsKeywordType", + "span": { + "start": 147, + "end": 150, + "ctxt": 0 + }, + "kind": "any" + } + }, + "definite": false + } + ] + } + ], + "interpreter": null +}