From fc3604301983d8adcd1b5c4b8dce4ece48d4f615 Mon Sep 17 00:00:00 2001 From: Joe Savona Date: Thu, 14 Dec 2023 12:05:25 -0800 Subject: [PATCH] Fixture for pruning unmemoized nonreactive deps Adds a fixture for our existing behavior that reactive scope dependencies exclude values which are non-reactive. The idea is that regardless of whether the value may actually get recreated over time or not, a "nonreactive" value cannot semantically change and therefore we can ignore changes in its pointer address. --- ...pendency-is-pruned-as-dependency.expect.md | 55 +++++++++++++++++++ ...tive-dependency-is-pruned-as-dependency.js | 17 ++++++ 2 files changed, 72 insertions(+) create mode 100644 compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/unmemoized-nonreactive-dependency-is-pruned-as-dependency.expect.md create mode 100644 compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/unmemoized-nonreactive-dependency-is-pruned-as-dependency.js diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/unmemoized-nonreactive-dependency-is-pruned-as-dependency.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/unmemoized-nonreactive-dependency-is-pruned-as-dependency.expect.md new file mode 100644 index 0000000000..221790fc43 --- /dev/null +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/unmemoized-nonreactive-dependency-is-pruned-as-dependency.expect.md @@ -0,0 +1,55 @@ + +## Input + +```javascript +import { mutate, useNoAlias } from "shared-runtime"; + +function Component(props) { + // Here `x` cannot be memoized bc its mutable range spans a hook call: + const x = []; + useNoAlias(); + mutate(x); + + // However, `x` is non-reactive. It cannot semantically change, so we + // exclude it as a dependency of the JSX element: + return
{x}
; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{ value: 42 }], +}; + +``` + +## Code + +```javascript +import { unstable_useMemoCache as useMemoCache } from "react"; +import { mutate, useNoAlias } from "shared-runtime"; + +function Component(props) { + const $ = useMemoCache(1); + + const x = []; + useNoAlias(); + mutate(x); + let t0; + if ($[0] === Symbol.for("react.memo_cache_sentinel")) { + t0 =
{x}
; + $[0] = t0; + } else { + t0 = $[0]; + } + return t0; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{ value: 42 }], +}; + +``` + +### Eval output +(kind: ok)
\ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/unmemoized-nonreactive-dependency-is-pruned-as-dependency.js b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/unmemoized-nonreactive-dependency-is-pruned-as-dependency.js new file mode 100644 index 0000000000..d2d39122a8 --- /dev/null +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/unmemoized-nonreactive-dependency-is-pruned-as-dependency.js @@ -0,0 +1,17 @@ +import { mutate, useNoAlias } from "shared-runtime"; + +function Component(props) { + // Here `x` cannot be memoized bc its mutable range spans a hook call: + const x = []; + useNoAlias(); + mutate(x); + + // However, `x` is non-reactive. It cannot semantically change, so we + // exclude it as a dependency of the JSX element: + return
{x}
; +} + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{ value: 42 }], +};