[babel 8] Do not skip requeued paths (#13291)

This commit is contained in:
Huáng Jùnliàng 2021-05-11 17:55:23 -04:00 committed by GitHub
parent b2d9156cc6
commit 875fc8e693
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 8 deletions

View File

@ -27,6 +27,8 @@ function isReference(node, scope, state) {
return scope.getBindingIdentifier(node.name) === declared; return scope.getBindingIdentifier(node.name) === declared;
} }
const visitedMaybeTDZNodes = new WeakSet();
export const visitor = { export const visitor = {
ReferencedIdentifier(path, state) { ReferencedIdentifier(path, state) {
if (!state.tdzEnabled) return; if (!state.tdzEnabled) return;
@ -44,13 +46,15 @@ export const visitor = {
if (status === "outside") return; if (status === "outside") return;
if (status === "maybe") { if (status === "maybe") {
if (visitedMaybeTDZNodes.has(node)) {
return;
}
visitedMaybeTDZNodes.add(node);
const assert = buildTDZAssert(node, state); const assert = buildTDZAssert(node, state);
// add tdzThis to parent variable declarator so it's exploded // add tdzThis to parent variable declarator so it's exploded
bindingPath.parent._tdzThis = true; bindingPath.parent._tdzThis = true;
path.skip();
if (path.parentPath.isUpdateExpression()) { if (path.parentPath.isUpdateExpression()) {
if (parent._ignoreBlockScopingTDZ) return; if (parent._ignoreBlockScopingTDZ) return;
path.parentPath.replaceWith(t.sequenceExpression([assert, parent])); path.parentPath.replaceWith(t.sequenceExpression([assert, parent]));

View File

@ -251,13 +251,11 @@ export function setKey(this: NodePath, key) {
export function requeue(this: NodePath, pathToQueue = this) { export function requeue(this: NodePath, pathToQueue = this) {
if (pathToQueue.removed) return; 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. // new one, the new one shouldn't probably be skipped.
// Note that this currently causes an infinite loop because of if (process.env.BABEL_8_BREAKING) {
// packages/babel-plugin-transform-block-scoping/src/tdz.js#L52-L59 pathToQueue.shouldSkip = false;
// (b5b8055cc00756f94bf71deb45f288738520ee3c) }
//
// pathToQueue.shouldSkip = false;
// TODO(loganfsmyth): This should be switched back to queue in parent contexts // TODO(loganfsmyth): This should be switched back to queue in parent contexts
// automatically once #2892 and #4135 have been resolved. See #4140. // automatically once #2892 and #4135 have been resolved. See #4140.