From 96a7a4d045d08547fed75c79a7156f79262edfc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Mon, 2 Oct 2023 15:16:08 +0900 Subject: [PATCH] fix(es/compat): Fix scoping of `explicit-resource-management` (#8044) **Related issue:** - Closes #8020 --- .../fixture/issues-8xxx/8020/input/.swcrc | 19 +++++++++++++++++++ .../tests/fixture/issues-8xxx/8020/input/1.js | 9 +++++++++ .../fixture/issues-8xxx/8020/output/1.js | 16 ++++++++++++++++ .../src/explicit_resource_management.rs | 4 ++++ .../transform-await/mixed/output.mjs | 6 +++--- .../only-using-await/output.mjs | 4 ++-- .../transform-sync/bare-block/output.js | 2 +- .../transform-sync/function-body/output.js | 2 +- .../transform-sync/if-body/output.js | 2 +- .../transform-sync/multiple-nested/output.js | 6 +++--- .../multiple-same-level/output.js | 6 +++--- .../transform-sync/static-block/output.js | 2 +- .../transform-top-level/hoisting/output.mjs | 2 +- 13 files changed, 64 insertions(+), 16 deletions(-) create mode 100644 crates/swc/tests/fixture/issues-8xxx/8020/input/.swcrc create mode 100644 crates/swc/tests/fixture/issues-8xxx/8020/input/1.js create mode 100644 crates/swc/tests/fixture/issues-8xxx/8020/output/1.js diff --git a/crates/swc/tests/fixture/issues-8xxx/8020/input/.swcrc b/crates/swc/tests/fixture/issues-8xxx/8020/input/.swcrc new file mode 100644 index 000000000000..7395508a93b9 --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8020/input/.swcrc @@ -0,0 +1,19 @@ +{ + "jsc": { + "parser": { + "syntax": "typescript", + "tsx": false + }, + "loose": false, + "minify": { + "compress": false, + "mangle": false + }, + "target": "es2022", + }, + "module": { + "type": "es6" + }, + "minify": false, + "isModule": true, +} \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-8xxx/8020/input/1.js b/crates/swc/tests/fixture/issues-8xxx/8020/input/1.js new file mode 100644 index 000000000000..a100d25cea06 --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8020/input/1.js @@ -0,0 +1,9 @@ +using foo = null + +const bar = 1 + +console.log(baz()) + +function baz() { + return bar +} \ No newline at end of file diff --git a/crates/swc/tests/fixture/issues-8xxx/8020/output/1.js b/crates/swc/tests/fixture/issues-8xxx/8020/output/1.js new file mode 100644 index 000000000000..acc0c8214eaf --- /dev/null +++ b/crates/swc/tests/fixture/issues-8xxx/8020/output/1.js @@ -0,0 +1,16 @@ +import { _ as _dispose } from "@swc/helpers/_/_dispose"; +import { _ as _using } from "@swc/helpers/_/_using"; +function baz() { + return bar; +} +try { + var _stack = []; + var foo = _using(_stack, null); + var bar = 1; + console.log(baz()); +} catch (_) { + var _error = _; + var _hasError = true; +} finally{ + _dispose(_stack, _error, _hasError); +} diff --git a/crates/swc_ecma_transforms_proposal/src/explicit_resource_management.rs b/crates/swc_ecma_transforms_proposal/src/explicit_resource_management.rs index e8600538989e..5f81501f0d89 100644 --- a/crates/swc_ecma_transforms_proposal/src/explicit_resource_management.rs +++ b/crates/swc_ecma_transforms_proposal/src/explicit_resource_management.rs @@ -87,6 +87,10 @@ impl ExplicitResourceManagement { Ok(stmt @ Stmt::Decl(Decl::Fn(..))) => { new.push(T::from_stmt(stmt)); } + Ok(Stmt::Decl(Decl::Var(mut var))) => { + var.kind = VarDeclKind::Var; + try_body.push(Stmt::Decl(Decl::Var(var))); + } Ok(stmt) => try_body.push(stmt), Err(stmt) => match stmt.try_into_module_decl() { Ok(ModuleDecl::ExportDefaultDecl(decl)) => { diff --git a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-await/mixed/output.mjs b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-await/mixed/output.mjs index cdfaa6e1ccfb..6f2b7f937492 100644 --- a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-await/mixed/output.mjs +++ b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-await/mixed/output.mjs @@ -1,9 +1,9 @@ { try { var _stack = []; - const a = _using(_stack, 1); - const b = _using(_stack, 2, true); - const c = _using(_stack, 3); + var a = _using(_stack, 1); + var b = _using(_stack, 2, true); + var c = _using(_stack, 3); } catch (_) { var _error = _; var _hasError = true; diff --git a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-await/only-using-await/output.mjs b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-await/only-using-await/output.mjs index 932415931004..5d4390b9ffbe 100644 --- a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-await/only-using-await/output.mjs +++ b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-await/only-using-await/output.mjs @@ -1,9 +1,9 @@ { try { var _stack = []; - const x = _using(_stack, obj, true); + var x = _using(_stack, obj, true); stmt; - const y = _using(_stack, obj, true), z = _using(_stack, obj, true); + var y = _using(_stack, obj, true), z = _using(_stack, obj, true); doSomethingWith(x, y); } catch (_) { var _error = _; diff --git a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/bare-block/output.js b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/bare-block/output.js index c145abe08922..6982b489b611 100644 --- a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/bare-block/output.js +++ b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/bare-block/output.js @@ -1,7 +1,7 @@ { try { var _stack = []; - const x = _using(_stack, obj); + var x = _using(_stack, obj); doSomethingWith(x); } catch (_) { var _error = _; diff --git a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/function-body/output.js b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/function-body/output.js index 06519087aaa3..4330fb187b30 100644 --- a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/function-body/output.js +++ b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/function-body/output.js @@ -1,7 +1,7 @@ function fn() { try { var _stack = []; - const x = _using(_stack, obj); + var x = _using(_stack, obj); return doSomethingWith(x); } catch (_) { var _error = _; diff --git a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/if-body/output.js b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/if-body/output.js index d419059d6693..41666e989ff9 100644 --- a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/if-body/output.js +++ b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/if-body/output.js @@ -1,7 +1,7 @@ if (test) { try { var _stack = []; - const x = _using(_stack, obj); + var x = _using(_stack, obj); doSomethingWith(x); } catch (_) { var _error = _; diff --git a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/multiple-nested/output.js b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/multiple-nested/output.js index 9dece6c4f6d6..84cc09b386a1 100644 --- a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/multiple-nested/output.js +++ b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/multiple-nested/output.js @@ -1,14 +1,14 @@ { try { var _stack = []; - const x = _using(_stack, obj); + var x = _using(_stack, obj); { try { var _stack1 = []; - const y = _using(_stack1, call(()=>{ + var y = _using(_stack1, call(()=>{ try { var _stack = []; - const z = _using(_stack, obj); + var z = _using(_stack, obj); return z; } catch (_) { var _error = _; diff --git a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/multiple-same-level/output.js b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/multiple-same-level/output.js index a82d21da8b72..8ac894590485 100644 --- a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/multiple-same-level/output.js +++ b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/multiple-same-level/output.js @@ -2,11 +2,11 @@ try { var _stack = []; stmt; - const x = _using(_stack, obj); + var x = _using(_stack, obj); stmt; - const y = _using(_stack, obj), z = _using(_stack, obj); + var y = _using(_stack, obj), z = _using(_stack, obj); stmt; - const w = _using(_stack, obj); + var w = _using(_stack, obj); doSomethingWith(x, z); } catch (_) { var _error = _; diff --git a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/static-block/output.js b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/static-block/output.js index 87287b0f550e..cec9c08fbe4e 100644 --- a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/static-block/output.js +++ b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/static-block/output.js @@ -2,7 +2,7 @@ class A { static{ try { var _stack = []; - const x = _using(_stack, y); + var x = _using(_stack, y); doSomethingWith(x); } catch (_) { var _error = _; diff --git a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-top-level/hoisting/output.mjs b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-top-level/hoisting/output.mjs index 28a2a262dc77..d37423ec0574 100644 --- a/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-top-level/hoisting/output.mjs +++ b/crates/swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-top-level/hoisting/output.mjs @@ -19,7 +19,7 @@ export class B { try { var _stack = []; doSomething(); - let c = 2; + var c = 2; class A { } var x = _using(_stack, null);