From 2ea4b4fbaabf2200bc87ec0feffc2dc22dc22568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Fri, 16 Dec 2022 13:35:46 +0100 Subject: [PATCH] Fix --- packages/babel-traverse/src/scope/index.ts | 5 +++++ .../babel-traverse/src/scope/lib/renamer.ts | 22 +++++++++++-------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/babel-traverse/src/scope/index.ts b/packages/babel-traverse/src/scope/index.ts index 3e96bccd3801..4103072fb912 100644 --- a/packages/babel-traverse/src/scope/index.ts +++ b/packages/babel-traverse/src/scope/index.ts @@ -457,6 +457,11 @@ export default class Scope { traverse(node: t.Node | t.Node[], opts?: TraverseOptions, state?: any): void; /** * Traverse node with current scope and path. + * + * !!! WARNING !!! + * This method assumes that `node` is a children of the current scope: + * after running the traversal, the .parentPath of the NodePath + * corresponding to `node` will be `this.path`. */ traverse(node: any, opts: any, state?: S) { traverse(node, opts, this, state, this.path); diff --git a/packages/babel-traverse/src/scope/lib/renamer.ts b/packages/babel-traverse/src/scope/lib/renamer.ts index c3ba79706d01..89edd9109847 100644 --- a/packages/babel-traverse/src/scope/lib/renamer.ts +++ b/packages/babel-traverse/src/scope/lib/renamer.ts @@ -3,6 +3,8 @@ import splitExportDeclaration from "@babel/helper-split-export-declaration"; import * as t from "@babel/types"; import type { NodePath, Visitor } from "../.."; import { requeueComputedKeyAndDecorators } from "@babel/helper-environment-visitor"; +import { traverseNode } from "../../traverse-node"; +import { explode } from "../../visitors"; const renameVisitor: Visitor = { ReferencedIdentifier({ node }, state) { @@ -111,6 +113,7 @@ export default class Renamer { // ); } + // TODO(Babel 8): Rename this `block` parameter. It's not needed anywhere. rename(block?: t.Pattern | t.Scopable) { const { binding, oldName, newName } = this; const { scope, path } = binding; @@ -130,15 +133,16 @@ export default class Renamer { } } - const blockToTraverse = block || scope.block; - if (blockToTraverse?.type === "SwitchStatement") { - // discriminant is not part of current scope, should be skipped. - blockToTraverse.cases.forEach(c => { - scope.traverse(c, renameVisitor, this); - }); - } else { - scope.traverse(blockToTraverse, renameVisitor, this); - } + traverseNode( + block || scope.block, + explode(renameVisitor), + scope, + this, + scope.path, + // When blockToTraverse is a SwitchStatement, the discriminant + // is not part of the current scope and thus should be skipped. + { discriminant: true }, + ); if (!block) { scope.removeOwnBinding(oldName);