diff --git a/src/compiler/transformers/esnext.ts b/src/compiler/transformers/esnext.ts index 2c89d082ae9..0cdb03ad253 100644 --- a/src/compiler/transformers/esnext.ts +++ b/src/compiler/transformers/esnext.ts @@ -292,11 +292,6 @@ export function transformESNext(context: TransformationContext): (x: SourceFile return visitEachChild(node, visitor, context); } - /** - * Collects all variable declarations that shadow a given identifier name in a statement. - */ - - function visitForOfStatement(node: ForOfStatement) { if (isUsingVariableDeclarationList(node.initializer)) { // given: @@ -322,9 +317,17 @@ export function transformESNext(context: TransformationContext): (x: SourceFile const usingVarStatement = factory.createVariableStatement(/*modifiers*/ undefined, usingVarList); // Wrap the original loop body in an additional block scope to handle shadowing - const wrappedStatement = isBlock(node.statement) ? - node.statement : - factory.createBlock([node.statement], /*multiLine*/ true); + // Don't create an extra block if the original statement is empty + const isEmptyBlock = isBlock(node.statement) && node.statement.statements.length === 0; + const shouldWrapInBlock = !isEmptyBlock; + + const statements: Statement[] = [usingVarStatement]; + if (shouldWrapInBlock) { + const wrappedStatement = isBlock(node.statement) ? + node.statement : + factory.createBlock([node.statement], /*multiLine*/ true); + statements.push(wrappedStatement); + } return visitNode( factory.updateForOfStatement( @@ -334,10 +337,7 @@ export function transformESNext(context: TransformationContext): (x: SourceFile factory.createVariableDeclaration(temp), ], NodeFlags.Const), node.expression, - factory.createBlock([ - usingVarStatement, - wrappedStatement, - ], /*multiLine*/ true), + factory.createBlock(statements, /*multiLine*/ true), ), visitor, isStatement, diff --git a/tests/baselines/reference/awaitUsingDeclarationsInForAwaitOf(target=es2015).js b/tests/baselines/reference/awaitUsingDeclarationsInForAwaitOf(target=es2015).js index b994b9f538c..aa6dd826bd5 100644 --- a/tests/baselines/reference/awaitUsingDeclarationsInForAwaitOf(target=es2015).js +++ b/tests/baselines/reference/awaitUsingDeclarationsInForAwaitOf(target=es2015).js @@ -88,8 +88,6 @@ function main() { const env_1 = { stack: [], error: void 0, hasError: false }; try { const d1 = __addDisposableResource(env_1, d1_1, true); - { - } } catch (e_2) { env_1.error = e_2; diff --git a/tests/baselines/reference/awaitUsingDeclarationsInForAwaitOf(target=es2017).js b/tests/baselines/reference/awaitUsingDeclarationsInForAwaitOf(target=es2017).js index e4a640e0ea9..18c95ea8e4f 100644 --- a/tests/baselines/reference/awaitUsingDeclarationsInForAwaitOf(target=es2017).js +++ b/tests/baselines/reference/awaitUsingDeclarationsInForAwaitOf(target=es2017).js @@ -76,8 +76,6 @@ async function main() { const env_1 = { stack: [], error: void 0, hasError: false }; try { const d1 = __addDisposableResource(env_1, d1_1, true); - { - } } catch (e_2) { env_1.error = e_2; diff --git a/tests/baselines/reference/awaitUsingDeclarationsInForAwaitOf(target=es2022).js b/tests/baselines/reference/awaitUsingDeclarationsInForAwaitOf(target=es2022).js index 05178b52df5..ac74f897e70 100644 --- a/tests/baselines/reference/awaitUsingDeclarationsInForAwaitOf(target=es2022).js +++ b/tests/baselines/reference/awaitUsingDeclarationsInForAwaitOf(target=es2022).js @@ -64,8 +64,6 @@ async function main() { const env_1 = { stack: [], error: void 0, hasError: false }; try { const d1 = __addDisposableResource(env_1, d1_1, true); - { - } } catch (e_1) { env_1.error = e_1; diff --git a/tests/baselines/reference/awaitUsingDeclarationsInForAwaitOf(target=es5).js b/tests/baselines/reference/awaitUsingDeclarationsInForAwaitOf(target=es5).js index 6a7212e524a..4deda344151 100644 --- a/tests/baselines/reference/awaitUsingDeclarationsInForAwaitOf(target=es5).js +++ b/tests/baselines/reference/awaitUsingDeclarationsInForAwaitOf(target=es5).js @@ -128,8 +128,6 @@ function main() { case 3: _j.trys.push([3, 4, 5, 8]); d1 = __addDisposableResource(env_1, d1_1, true); - { - } return [3 /*break*/, 8]; case 4: e_1 = _j.sent(); diff --git a/tests/baselines/reference/awaitUsingDeclarationsInForOf.1(target=es2015).js b/tests/baselines/reference/awaitUsingDeclarationsInForOf.1(target=es2015).js index 842b9e4efab..9ea879d8b74 100644 --- a/tests/baselines/reference/awaitUsingDeclarationsInForOf.1(target=es2015).js +++ b/tests/baselines/reference/awaitUsingDeclarationsInForOf.1(target=es2015).js @@ -77,8 +77,6 @@ function main() { const env_1 = { stack: [], error: void 0, hasError: false }; try { const d1 = __addDisposableResource(env_1, d1_1, true); - { - } } catch (e_1) { env_1.error = e_1; diff --git a/tests/baselines/reference/awaitUsingDeclarationsInForOf.1(target=es2017).js b/tests/baselines/reference/awaitUsingDeclarationsInForOf.1(target=es2017).js index 1befc14d6d7..4d81c8b1f5f 100644 --- a/tests/baselines/reference/awaitUsingDeclarationsInForOf.1(target=es2017).js +++ b/tests/baselines/reference/awaitUsingDeclarationsInForOf.1(target=es2017).js @@ -65,8 +65,6 @@ async function main() { const env_1 = { stack: [], error: void 0, hasError: false }; try { const d1 = __addDisposableResource(env_1, d1_1, true); - { - } } catch (e_1) { env_1.error = e_1; diff --git a/tests/baselines/reference/awaitUsingDeclarationsInForOf.1(target=es2022).js b/tests/baselines/reference/awaitUsingDeclarationsInForOf.1(target=es2022).js index 1befc14d6d7..4d81c8b1f5f 100644 --- a/tests/baselines/reference/awaitUsingDeclarationsInForOf.1(target=es2022).js +++ b/tests/baselines/reference/awaitUsingDeclarationsInForOf.1(target=es2022).js @@ -65,8 +65,6 @@ async function main() { const env_1 = { stack: [], error: void 0, hasError: false }; try { const d1 = __addDisposableResource(env_1, d1_1, true); - { - } } catch (e_1) { env_1.error = e_1; diff --git a/tests/baselines/reference/awaitUsingDeclarationsInForOf.1(target=es5).js b/tests/baselines/reference/awaitUsingDeclarationsInForOf.1(target=es5).js index 898f349ac8e..b48951bbe6d 100644 --- a/tests/baselines/reference/awaitUsingDeclarationsInForOf.1(target=es5).js +++ b/tests/baselines/reference/awaitUsingDeclarationsInForOf.1(target=es5).js @@ -117,8 +117,6 @@ function main() { case 2: _d.trys.push([2, 3, 4, 7]); d1 = __addDisposableResource(env_1, d1_1, true); - { - } return [3 /*break*/, 7]; case 3: e_1 = _d.sent(); diff --git a/tests/baselines/reference/usingDeclarationsInForAwaitOf(target=es2015).js b/tests/baselines/reference/usingDeclarationsInForAwaitOf(target=es2015).js index 75740f92dd8..52a0d20d1ef 100644 --- a/tests/baselines/reference/usingDeclarationsInForAwaitOf(target=es2015).js +++ b/tests/baselines/reference/usingDeclarationsInForAwaitOf(target=es2015).js @@ -87,8 +87,6 @@ function main() { const env_1 = { stack: [], error: void 0, hasError: false }; try { const d1 = __addDisposableResource(env_1, d1_1, false); - { - } } catch (e_2) { env_1.error = e_2; diff --git a/tests/baselines/reference/usingDeclarationsInForAwaitOf(target=es2017).js b/tests/baselines/reference/usingDeclarationsInForAwaitOf(target=es2017).js index 1438154e3b8..9d4fa33d6ef 100644 --- a/tests/baselines/reference/usingDeclarationsInForAwaitOf(target=es2017).js +++ b/tests/baselines/reference/usingDeclarationsInForAwaitOf(target=es2017).js @@ -77,8 +77,6 @@ async function main() { const env_1 = { stack: [], error: void 0, hasError: false }; try { const d1 = __addDisposableResource(env_1, d1_1, false); - { - } } catch (e_2) { env_1.error = e_2; diff --git a/tests/baselines/reference/usingDeclarationsInForAwaitOf(target=es2022).js b/tests/baselines/reference/usingDeclarationsInForAwaitOf(target=es2022).js index 3466b933764..353ac015ec2 100644 --- a/tests/baselines/reference/usingDeclarationsInForAwaitOf(target=es2022).js +++ b/tests/baselines/reference/usingDeclarationsInForAwaitOf(target=es2022).js @@ -65,8 +65,6 @@ async function main() { const env_1 = { stack: [], error: void 0, hasError: false }; try { const d1 = __addDisposableResource(env_1, d1_1, false); - { - } } catch (e_1) { env_1.error = e_1; diff --git a/tests/baselines/reference/usingDeclarationsInForAwaitOf(target=es5).js b/tests/baselines/reference/usingDeclarationsInForAwaitOf(target=es5).js index 63b53693efb..31d3c5ab036 100644 --- a/tests/baselines/reference/usingDeclarationsInForAwaitOf(target=es5).js +++ b/tests/baselines/reference/usingDeclarationsInForAwaitOf(target=es5).js @@ -123,8 +123,6 @@ function main() { env_1 = { stack: [], error: void 0, hasError: false }; try { d1 = __addDisposableResource(env_1, d1_1, false); - { - } } catch (e_2) { env_1.error = e_2; diff --git a/tests/baselines/reference/usingDeclarationsInForOf.1(target=es2015).js b/tests/baselines/reference/usingDeclarationsInForOf.1(target=es2015).js index 974b23c8cc5..3ae4724bd55 100644 --- a/tests/baselines/reference/usingDeclarationsInForOf.1(target=es2015).js +++ b/tests/baselines/reference/usingDeclarationsInForOf.1(target=es2015).js @@ -62,8 +62,6 @@ for (const d1_1 of [{ [Symbol.dispose]() { } }, null, undefined]) { const env_1 = { stack: [], error: void 0, hasError: false }; try { const d1 = __addDisposableResource(env_1, d1_1, false); - { - } } catch (e_1) { env_1.error = e_1; diff --git a/tests/baselines/reference/usingDeclarationsInForOf.1(target=es2017).js b/tests/baselines/reference/usingDeclarationsInForOf.1(target=es2017).js index 974b23c8cc5..3ae4724bd55 100644 --- a/tests/baselines/reference/usingDeclarationsInForOf.1(target=es2017).js +++ b/tests/baselines/reference/usingDeclarationsInForOf.1(target=es2017).js @@ -62,8 +62,6 @@ for (const d1_1 of [{ [Symbol.dispose]() { } }, null, undefined]) { const env_1 = { stack: [], error: void 0, hasError: false }; try { const d1 = __addDisposableResource(env_1, d1_1, false); - { - } } catch (e_1) { env_1.error = e_1; diff --git a/tests/baselines/reference/usingDeclarationsInForOf.1(target=es2022).js b/tests/baselines/reference/usingDeclarationsInForOf.1(target=es2022).js index 974b23c8cc5..3ae4724bd55 100644 --- a/tests/baselines/reference/usingDeclarationsInForOf.1(target=es2022).js +++ b/tests/baselines/reference/usingDeclarationsInForOf.1(target=es2022).js @@ -62,8 +62,6 @@ for (const d1_1 of [{ [Symbol.dispose]() { } }, null, undefined]) { const env_1 = { stack: [], error: void 0, hasError: false }; try { const d1 = __addDisposableResource(env_1, d1_1, false); - { - } } catch (e_1) { env_1.error = e_1; diff --git a/tests/baselines/reference/usingDeclarationsInForOf.1(target=es5).js b/tests/baselines/reference/usingDeclarationsInForOf.1(target=es5).js index 245ad434ecb..caec071966f 100644 --- a/tests/baselines/reference/usingDeclarationsInForOf.1(target=es5).js +++ b/tests/baselines/reference/usingDeclarationsInForOf.1(target=es5).js @@ -64,8 +64,6 @@ for (var _i = 0, _b = [(_a = {}, _a[Symbol.dispose] = function () { }, _a), null var env_1 = { stack: [], error: void 0, hasError: false }; try { var d1 = __addDisposableResource(env_1, d1_1, false); - { - } } catch (e_1) { env_1.error = e_1;