From 32ef606678bac055c8a9f473c93ad2e4aca3bf30 Mon Sep 17 00:00:00 2001 From: Joe Savona Date: Wed, 26 Jun 2024 16:06:13 -0700 Subject: [PATCH] [compiler] Add todo fixtures for local reassignment in an async callback [ghstack-poisoned] --- ...local-variable-in-async-callback.expect.md | 58 +++++++++++++++++++ ...assign-local-variable-in-async-callback.js | 16 +++++ .../packages/snap/src/SproutTodoFilter.ts | 1 + 3 files changed, 75 insertions(+) create mode 100644 compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/todo.invalid-reassign-local-variable-in-async-callback.expect.md create mode 100644 compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/todo.invalid-reassign-local-variable-in-async-callback.js diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/todo.invalid-reassign-local-variable-in-async-callback.expect.md b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/todo.invalid-reassign-local-variable-in-async-callback.expect.md new file mode 100644 index 0000000000000..aa07cce436136 --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/todo.invalid-reassign-local-variable-in-async-callback.expect.md @@ -0,0 +1,58 @@ + +## Input + +```javascript +function Component() { + let value = null; + const reassign = async () => { + await foo().then((result) => { + // Reassigning a local variable in an async function is *always* mutating + // after render, so this should error regardless of where this ends up + // getting called + value = result; + }); + }; + + const onClick = async () => { + await reassign(); + }; + return
Click
; +} + +``` + +## Code + +```javascript +import { c as _c } from "react/compiler-runtime"; +function Component() { + const $ = _c(2); + let value; + if ($[0] === Symbol.for("react.memo_cache_sentinel")) { + value = null; + $[0] = value; + } else { + value = $[0]; + } + let t0; + if ($[1] === Symbol.for("react.memo_cache_sentinel")) { + const reassign = async () => { + await foo().then((result) => { + value = result; + }); + }; + + const onClick = async () => { + await reassign(); + }; + + t0 =
Click
; + $[1] = t0; + } else { + t0 = $[1]; + } + return t0; +} + +``` + \ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/todo.invalid-reassign-local-variable-in-async-callback.js b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/todo.invalid-reassign-local-variable-in-async-callback.js new file mode 100644 index 0000000000000..1ba759e3b8ae7 --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/todo.invalid-reassign-local-variable-in-async-callback.js @@ -0,0 +1,16 @@ +function Component() { + let value = null; + const reassign = async () => { + await foo().then((result) => { + // Reassigning a local variable in an async function is *always* mutating + // after render, so this should error regardless of where this ends up + // getting called + value = result; + }); + }; + + const onClick = async () => { + await reassign(); + }; + return
Click
; +} diff --git a/compiler/packages/snap/src/SproutTodoFilter.ts b/compiler/packages/snap/src/SproutTodoFilter.ts index c4bc6776da784..8d28ba239a368 100644 --- a/compiler/packages/snap/src/SproutTodoFilter.ts +++ b/compiler/packages/snap/src/SproutTodoFilter.ts @@ -487,6 +487,7 @@ const skipFilter = new Set([ "todo.invalid-reassign-local-variable-in-jsx-callback", "todo.invalid-reassign-local-variable-in-hook-argument", "todo.invalid-reassign-local-variable-in-effect", + "todo.invalid-reassign-local-variable-in-async-callback", // bugs "bug-invalid-hoisting-functionexpr",