From bfb84eed3b4c863474e0b2fa1d5dde3c638ec470 Mon Sep 17 00:00:00 2001 From: Joe Savona Date: Tue, 2 May 2023 10:47:48 -0700 Subject: [PATCH] Repro for memoized hook within logical expression Repro of a bug in which we incorrect memoize hook calls that are inside logical expressions (though the bug could occur for ternaries, optional calls, and sequence expressions too). --- .../hook-inside-logical-expression.expect.md | 32 +++++++++++++++++++ .../hook-inside-logical-expression.js | 4 +++ 2 files changed, 36 insertions(+) create mode 100644 compiler/forget/src/__tests__/fixtures/compiler/hook-inside-logical-expression.expect.md create mode 100644 compiler/forget/src/__tests__/fixtures/compiler/hook-inside-logical-expression.js diff --git a/compiler/forget/src/__tests__/fixtures/compiler/hook-inside-logical-expression.expect.md b/compiler/forget/src/__tests__/fixtures/compiler/hook-inside-logical-expression.expect.md new file mode 100644 index 0000000000..4d87e93b69 --- /dev/null +++ b/compiler/forget/src/__tests__/fixtures/compiler/hook-inside-logical-expression.expect.md @@ -0,0 +1,32 @@ + +## Input + +```javascript +function Component(props) { + const user = useFragment(graphql`...`, props.user) ?? {}; + return user.name; +} + +``` + +## Code + +```javascript +import { unstable_useMemoCache as useMemoCache } from "react"; +function Component(props) { + const $ = useMemoCache(2); + const c_0 = $[0] !== props.user; + let t0; + if (c_0) { + t0 = useFragment(graphql`...`, props.user) ?? {}; + $[0] = props.user; + $[1] = t0; + } else { + t0 = $[1]; + } + const user = t0; + return user.name; +} + +``` + \ No newline at end of file diff --git a/compiler/forget/src/__tests__/fixtures/compiler/hook-inside-logical-expression.js b/compiler/forget/src/__tests__/fixtures/compiler/hook-inside-logical-expression.js new file mode 100644 index 0000000000..483edd58bb --- /dev/null +++ b/compiler/forget/src/__tests__/fixtures/compiler/hook-inside-logical-expression.js @@ -0,0 +1,4 @@ +function Component(props) { + const user = useFragment(graphql`...`, props.user) ?? {}; + return user.name; +}