diff --git a/packages/babel-plugin-transform-block-scoping/test/fixtures/tdz/function-expression/input.js b/packages/babel-plugin-transform-block-scoping/test/fixtures/tdz/function-expression/input.js new file mode 100644 index 000000000000..8608cad67717 --- /dev/null +++ b/packages/babel-plugin-transform-block-scoping/test/fixtures/tdz/function-expression/input.js @@ -0,0 +1,5 @@ +f(() => a); +let a; + +let b; +f(() => b); diff --git a/packages/babel-plugin-transform-block-scoping/test/fixtures/tdz/function-expression/output.js b/packages/babel-plugin-transform-block-scoping/test/fixtures/tdz/function-expression/output.js new file mode 100644 index 000000000000..fe366c5ce8a5 --- /dev/null +++ b/packages/babel-plugin-transform-block-scoping/test/fixtures/tdz/function-expression/output.js @@ -0,0 +1,5 @@ +var a = babelHelpers.temporalUndefined; +f(() => babelHelpers.temporalRef(a, "a")); +a = void 0; +var b; +f(() => b); diff --git a/packages/babel-traverse/src/path/introspection.ts b/packages/babel-traverse/src/path/introspection.ts index abcdea25da17..c1656fb505c1 100644 --- a/packages/babel-traverse/src/path/introspection.ts +++ b/packages/babel-traverse/src/path/introspection.ts @@ -267,7 +267,10 @@ export function willIMaybeExecuteBefore( } function getOuterFunction(path: NodePath) { - return (path.scope.getFunctionParent() || path.scope.getProgramParent()).path; + return ( + path.parentPath.scope.getFunctionParent() || + path.parentPath.scope.getProgramParent() + ).path; } function isExecutionUncertain(type: t.Node["type"], key: string) { @@ -445,10 +448,12 @@ function _guessExecutionStatusRelativeToDifferentFunctionsInternal( target: NodePath, cache: ExecutionStatusCache, ): RelativeExecutionStatus { - if ( - !target.isFunctionDeclaration() || - target.parentPath.isExportDeclaration() - ) { + if (!target.isFunctionDeclaration()) { + if (base._guessExecutionStatusRelativeTo(target) === "before") { + return "before"; + } + return "unknown"; + } else if (target.parentPath.isExportDeclaration()) { return "unknown"; } diff --git a/packages/babel-traverse/test/introspection.js b/packages/babel-traverse/test/introspection.js index 54f1df8b1f89..7650459bf9fa 100644 --- a/packages/babel-traverse/test/introspection.js +++ b/packages/babel-traverse/test/introspection.js @@ -213,4 +213,20 @@ describe("path/introspection", function () { expect(reference.referencesImport("source", "*")).toBe(false); }); }); + + describe("_guessExecutionStatusRelativeTo", function () { + it("works withs paths in function expressions", () => { + const program = getPath(` + a; + f(() => b); + c; + `); + const a = program.get("body.0.expression"); + const b = program.get("body.1.expression.arguments.0.body"); + const c = program.get("body.2.expression"); + + expect(a._guessExecutionStatusRelativeTo(b)).toBe("before"); + expect(c._guessExecutionStatusRelativeTo(b)).toBe("unknown"); + }); + }); });