diff --git a/packages/babel-plugin-transform-block-scoping/src/tdz.js b/packages/babel-plugin-transform-block-scoping/src/tdz.js index 3d17a3028e..b0fdbbdd0f 100644 --- a/packages/babel-plugin-transform-block-scoping/src/tdz.js +++ b/packages/babel-plugin-transform-block-scoping/src/tdz.js @@ -27,6 +27,8 @@ function isReference(node, scope, state) { return scope.getBindingIdentifier(node.name) === declared; } +const visitedMaybeTDZNodes = new WeakSet(); + export const visitor = { ReferencedIdentifier(path, state) { if (!state.tdzEnabled) return; @@ -44,13 +46,15 @@ export const visitor = { if (status === "outside") return; if (status === "maybe") { + if (visitedMaybeTDZNodes.has(node)) { + return; + } + visitedMaybeTDZNodes.add(node); const assert = buildTDZAssert(node, state); // add tdzThis to parent variable declarator so it's exploded bindingPath.parent._tdzThis = true; - path.skip(); - if (path.parentPath.isUpdateExpression()) { if (parent._ignoreBlockScopingTDZ) return; path.parentPath.replaceWith(t.sequenceExpression([assert, parent])); diff --git a/packages/babel-traverse/src/path/context.ts b/packages/babel-traverse/src/path/context.ts index 44fd54bee8..0a8291bbae 100644 --- a/packages/babel-traverse/src/path/context.ts +++ b/packages/babel-traverse/src/path/context.ts @@ -251,13 +251,11 @@ export function setKey(this: NodePath, key) { export function requeue(this: NodePath, pathToQueue = this) { if (pathToQueue.removed) return; - // TODO: Uncomment in Babel 8. If a path is skipped, and then replaced with a + // If a path is skipped, and then replaced with a // new one, the new one shouldn't probably be skipped. - // Note that this currently causes an infinite loop because of - // packages/babel-plugin-transform-block-scoping/src/tdz.js#L52-L59 - // (b5b8055cc00756f94bf71deb45f288738520ee3c) - // - // pathToQueue.shouldSkip = false; + if (process.env.BABEL_8_BREAKING) { + pathToQueue.shouldSkip = false; + } // TODO(loganfsmyth): This should be switched back to queue in parent contexts // automatically once #2892 and #4135 have been resolved. See #4140.