The library for web and native user interfaces.
Make JSX memoization optional (on by default)
Makes JSX memoized by default again, but adds an option to disable memoization of JSX. Also adds a new test and fixtures directory to test the opt-in no-jsx-memoization behavior.
Joe Savona committed
Mar 13, 2023 at 13:25 UTC
23e0ce02a61e57360b4eed57e4fdc38e43a2efbd
46 files changed
+894
-193
compiler/forget/src/CompilerPipeline.ts
+3
-1
@@ -146,7 +146,9 @@ export function* run(
146
value: reactiveFunction,
147
});
148
149
- pruneNonEscapingScopes(reactiveFunction);
149
+ pruneNonEscapingScopes(reactiveFunction, {
150
+ memoizeJsxElements: options?.memoizeJsxElements ?? true,
151
+ });
152
yield log({
153
kind: "reactive",
154
name: "PruneNonEscapingDependencies",
compiler/forget/src/HIR/Environment.ts
+2
@@ -8,11 +8,13 @@ const HOOK_PATTERN = /^_?use/;
8
export type EnvironmentOptions = {
9
customHooks: Map<string, Hook>;
10
globals: Set<string>;
11
+ memoizeJsxElements: boolean;
12
};
13
14
const DEFAULT_OPTIONS: EnvironmentOptions = {
15
customHooks: new Map(),
16
globals: DEFAULT_GLOBALS,
17
+ memoizeJsxElements: true,
18
};
19
20
export function mergeOptions(
compiler/forget/src/ReactiveScopes/PruneNonEscapingScopes.ts
+33
-17
@@ -102,7 +102,10 @@ import {
102
* conditional node with an aliased dep promotes to aliased).
103
* 4. Finally we prune scopes whose outputs weren't marked.
104
*/
105
-export function pruneNonEscapingScopes(fn: ReactiveFunction): void {
105
+export function pruneNonEscapingScopes(
106
+ fn: ReactiveFunction,
107
+ options: MemoizationOptions
108
+): void {
109
// First build up a map of which instructions are involved in creating which values,
110
// and which values are returned.
111
const state = new State();
@@ -112,7 +115,7 @@ export function pruneNonEscapingScopes(fn: ReactiveFunction): void {
115
for (const param of fn.params) {
116
state.declare(param.identifier.id);
117
}
115
- visitReactiveFunction(fn, new CollectDependenciesVisitor(), state);
118
+ visitReactiveFunction(fn, new CollectDependenciesVisitor(options), state);
119
120
log(() => prettyFormat(state));
121
@@ -128,6 +131,10 @@ export function pruneNonEscapingScopes(fn: ReactiveFunction): void {
131
visitReactiveFunction(fn, new PruneScopesTransform(), memoized);
132
}
133
134
+export type MemoizationOptions = {
135
+ memoizeJsxElements: boolean;
136
+};
137
+
138
// Describes how to determine whether a value should be memoized, relative to dependees and dependencies
139
enum MemoizationLevel {
140
// The value should be memoized if it escapes
@@ -316,7 +323,8 @@ type LValueMemoization = {
323
*/
324
function computeMemoizationInputs(
325
value: ReactiveValue,
319
- lvalue: Place | null
326
+ lvalue: Place | null,
327
+ options: MemoizationOptions
328
): {
329
// can optionally return a custom set of lvalues per instruction
330
lvalues: Array<LValueMemoization>;
@@ -332,8 +340,8 @@ function computeMemoizationInputs(
340
: [],
341
rvalues: [
342
// Conditionals do not alias their test value.
335
- ...computeMemoizationInputs(value.consequent, null).rvalues,
336
- ...computeMemoizationInputs(value.alternate, null).rvalues,
343
+ ...computeMemoizationInputs(value.consequent, null, options).rvalues,
344
+ ...computeMemoizationInputs(value.alternate, null, options).rvalues,
345
],
346
};
347
}
@@ -345,8 +353,8 @@ function computeMemoizationInputs(
353
? [{ place: lvalue, level: MemoizationLevel.Conditional }]
354
: [],
355
rvalues: [
348
- ...computeMemoizationInputs(value.left, null).rvalues,
349
- ...computeMemoizationInputs(value.right, null).rvalues,
356
+ ...computeMemoizationInputs(value.left, null, options).rvalues,
357
+ ...computeMemoizationInputs(value.right, null, options).rvalues,
358
],
359
};
360
}
@@ -360,7 +368,7 @@ function computeMemoizationInputs(
368
// Only the final value of the sequence is a true rvalue:
369
// values from the sequence's instructions are evaluated
370
// as separate nodes
363
- rvalues: computeMemoizationInputs(value.value, null).rvalues,
371
+ rvalues: computeMemoizationInputs(value.value, null, options).rvalues,
372
};
373
}
374
case "JsxExpression": {
@@ -378,24 +386,24 @@ function computeMemoizationInputs(
386
operands.push(child);
387
}
388
}
389
+ const level = options.memoizeJsxElements
390
+ ? MemoizationLevel.Memoized
391
+ : MemoizationLevel.Unmemoized;
392
return {
393
// JSX elements themselves are not memoized unless forced to
394
// avoid breaking downstream memoization
384
- lvalues:
385
- lvalue !== null
386
- ? [{ place: lvalue, level: MemoizationLevel.Unmemoized }]
387
- : [],
395
+ lvalues: lvalue !== null ? [{ place: lvalue, level }] : [],
396
rvalues: operands,
397
};
398
}
399
case "JsxFragment": {
400
+ const level = options.memoizeJsxElements
401
+ ? MemoizationLevel.Memoized
402
+ : MemoizationLevel.Unmemoized;
403
return {
404
// JSX elements themselves are not memoized unless forced to
405
// avoid breaking downstream memoization
395
- lvalues:
396
- lvalue !== null
397
- ? [{ place: lvalue, level: MemoizationLevel.Unmemoized }]
398
- : [],
406
+ lvalues: lvalue !== null ? [{ place: lvalue, level }] : [],
407
rvalues: value.children,
408
};
409
}
@@ -564,6 +572,13 @@ function computePatternLValues(pattern: Pattern): Array<LValueMemoization> {
572
* identifier's and scope's dependencies.
573
*/
574
class CollectDependenciesVisitor extends ReactiveFunctionVisitor<State> {
575
+ options: MemoizationOptions;
576
+
577
+ constructor(options: MemoizationOptions) {
578
+ super();
579
+ this.options = options;
580
+ }
581
+
582
override visitInstruction(
583
instruction: ReactiveInstruction,
584
state: State
@@ -573,7 +588,8 @@ class CollectDependenciesVisitor extends ReactiveFunctionVisitor<State> {
588
// Determe the level of memoization for this value and the lvalues/rvalues
589
const aliasing = computeMemoizationInputs(
590
instruction.value,
576
- instruction.lvalue
591
+ instruction.lvalue,
592
+ this.options
593
);
594
595
// Associate all the rvalues with the instruction's scope if it has one
compiler/forget/src/__tests__/compiler-test.ts
+1
-1
@@ -28,7 +28,7 @@ wasmFolder(
28
path.join(__dirname, "..", "..", "node_modules", "@hpcc-js", "wasm", "dist")
29
);
30
31
-describe("React Forget (HIR version)", () => {
31
+describe("React Forget", () => {
32
generateTestsFromFixtures(
33
path.join(__dirname, "fixtures", "compiler"),
34
(input, file, options) => {
compiler/forget/src/__tests__/disableMemoizeJsxElements-test.ts
new
+110
@@ -0,0 +1,110 @@
1
+/**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+"use strict";
9
+
10
+import path from "path";
11
+import runReactForgetBabelPlugin from "../Babel/RunReactForgetBabelPlugin";
12
+import { Effect, ValueKind } from "../index";
13
+import { toggleLogging } from "../Utils/logger";
14
+import generateTestsFromFixtures from "./test-utils/generateTestsFromFixtures";
15
+
16
+type TestOutput = {
17
+ js: string;
18
+};
19
+
20
+function wrapWithTripleBackticks(s: string, ext?: string) {
21
+ return `\`\`\`${ext ?? ""}
22
+${s}
23
+\`\`\``;
24
+}
25
+
26
+describe("React Forget (Disable memoization of JSX elements)", () => {
27
+ generateTestsFromFixtures(
28
+ path.join(__dirname, "fixtures", "disableMemoizeJsxElements"),
29
+ (input, file, options) => {
30
+ let items: Array<TestOutput> = [];
31
+ let error: Error | null = null;
32
+ if (options.debug) {
33
+ toggleLogging(options.debug);
34
+ }
35
+ try {
36
+ items.push({
37
+ js: runReactForgetBabelPlugin(input, file, options.language, {
38
+ enableOnlyOnUseForgetDirective:
39
+ options.enableOnlyOnUseForgetDirective,
40
+ environment: {
41
+ memoizeJsxElements: false,
42
+ customHooks: new Map([
43
+ [
44
+ "useFreeze",
45
+ {
46
+ name: "useFreeze",
47
+ kind: "Custom",
48
+ valueKind: ValueKind.Frozen,
49
+ effectKind: Effect.Freeze,
50
+ },
51
+ ],
52
+ ]),
53
+ },
54
+ logger: null,
55
+ gatingModule: options.gatingModule,
56
+ }).code,
57
+ });
58
+ } catch (e) {
59
+ error = e;
60
+ }
61
+ let outputs: Array<string>;
62
+
63
+ const expectError = file.startsWith("error.");
64
+ if (expectError) {
65
+ if (error === null) {
66
+ throw new Error(
67
+ `Expected an error to be thrown for fixture: '${file}', remove the 'error.' prefix if an error is not expected.`
68
+ );
69
+ } else {
70
+ outputs = [formatErrorOutput(error)];
71
+ }
72
+ } else {
73
+ if (error !== null) {
74
+ error.message = `Expected fixture '${file}' to succeed but it failed with error:\n\n${error.message}`;
75
+ throw error;
76
+ }
77
+ if (items === null || items.length === 0) {
78
+ throw new Error(`Expected at least one output for file '${file}'.`);
79
+ }
80
+ outputs = formatOutput(items);
81
+ }
82
+ return `
83
+## Input
84
+
85
+${wrapWithTripleBackticks(input, "javascript")}
86
+
87
+${outputs.join("\n")}
88
+ `;
89
+ }
90
+ );
91
+});
92
+
93
+function formatErrorOutput(error: Error): string {
94
+ error.message = error.message.replace(/^\/.*?:\s/, "");
95
+ return `
96
+## Error
97
+
98
+${wrapWithTripleBackticks(error.message)}
99
+ `;
100
+}
101
+
102
+function formatOutput(items: Array<TestOutput>): Array<string> {
103
+ return items.map(({ js }) => {
104
+ return `
105
+## Code
106
+
107
+${wrapWithTripleBackticks(js, "javascript")}
108
+ `.trim();
109
+ });
110
+}
compiler/forget/src/__tests__/fixtures/compiler/call.expect.md
+9
-2
@@ -21,7 +21,7 @@ function Component(props) {
21
function foo() {}
22
23
function Component(props) {
24
- const $ = React.unstable_useMemoCache(2);
24
+ const $ = React.unstable_useMemoCache(3);
25
let a;
26
let b;
27
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
@@ -36,7 +36,14 @@ function Component(props) {
36
a = $[0];
37
b = $[1];
38
}
39
- return <div a={a} b={b}></div>;
39
+ let t0;
40
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
41
+ t0 = <div a={a} b={b}></div>;
42
+ $[2] = t0;
43
+ } else {
44
+ t0 = $[2];
45
+ }
46
+ return t0;
47
}
48
49
```
compiler/forget/src/__tests__/fixtures/compiler/capture-func-passed-to-jsx.expect.md
+11
-2
@@ -20,7 +20,7 @@ function component(a, b) {
20
21
```javascript
22
function component(a, b) {
23
- const $ = React.unstable_useMemoCache(7);
23
+ const $ = React.unstable_useMemoCache(9);
24
const c_0 = $[0] !== b;
25
let t0;
26
if (c_0) {
@@ -56,7 +56,16 @@ function component(a, b) {
56
t2 = $[6];
57
}
58
const x = t2;
59
- const t = <Foo x={x}></Foo>;
59
+ const c_7 = $[7] !== x;
60
+ let t3;
61
+ if (c_7) {
62
+ t3 = <Foo x={x}></Foo>;
63
+ $[7] = x;
64
+ $[8] = t3;
65
+ } else {
66
+ t3 = $[8];
67
+ }
68
+ const t = t3;
69
mutate(x);
70
return t;
71
}
compiler/forget/src/__tests__/fixtures/compiler/capturing-function-member-expr-call.expect.md
+13
-2
@@ -20,7 +20,7 @@ function component({ mutator }) {
20
21
```javascript
22
function component(t27) {
23
- const $ = React.unstable_useMemoCache(4);
23
+ const $ = React.unstable_useMemoCache(7);
24
const { mutator } = t27;
25
const c_0 = $[0] !== mutator;
26
let t0;
@@ -46,7 +46,18 @@ function component(t27) {
46
t1 = $[3];
47
}
48
const hide = t1;
49
- return <Foo poke={poke} hide={hide}></Foo>;
49
+ const c_4 = $[4] !== poke;
50
+ const c_5 = $[5] !== hide;
51
+ let t2;
52
+ if (c_4 || c_5) {
53
+ t2 = <Foo poke={poke} hide={hide}></Foo>;
54
+ $[4] = poke;
55
+ $[5] = hide;
56
+ $[6] = t2;
57
+ } else {
58
+ t2 = $[6];
59
+ }
60
+ return t2;
61
}
62
63
```
compiler/forget/src/__tests__/fixtures/compiler/component.expect.md
+27
-7
@@ -35,7 +35,7 @@ function Component(props) {
35
36
```javascript
37
function Component(props) {
38
- const $ = React.unstable_useMemoCache(3);
38
+ const $ = React.unstable_useMemoCache(8);
39
const items = props.items;
40
const maxItems = props.maxItems;
41
const c_0 = $[0] !== maxItems;
@@ -65,12 +65,32 @@ function Component(props) {
65
}
66
67
const count = renderedItems.length;
68
- return (
69
- <div>
70
- {<h1>{count} Items</h1>}
71
- {renderedItems}
72
- </div>
73
- );
68
+ const c_3 = $[3] !== count;
69
+ let t0;
70
+ if (c_3) {
71
+ t0 = <h1>{count} Items</h1>;
72
+ $[3] = count;
73
+ $[4] = t0;
74
+ } else {
75
+ t0 = $[4];
76
+ }
77
+ const c_5 = $[5] !== t0;
78
+ const c_6 = $[6] !== renderedItems;
79
+ let t1;
80
+ if (c_5 || c_6) {
81
+ t1 = (
82
+ <div>
83
+ {t0}
84
+ {renderedItems}
85
+ </div>
86
+ );
87
+ $[5] = t0;
88
+ $[6] = renderedItems;
89
+ $[7] = t1;
90
+ } else {
91
+ t1 = $[7];
92
+ }
93
+ return t1;
94
}
95
96
```
compiler/forget/src/__tests__/fixtures/compiler/concise-arrow-expr.expect.md
+11
-2
@@ -14,7 +14,7 @@ function component() {
14
15
```javascript
16
function component() {
17
- const $ = React.unstable_useMemoCache(2);
17
+ const $ = React.unstable_useMemoCache(4);
18
const [x, setX] = useState(0);
19
const c_0 = $[0] !== setX;
20
let t0;
@@ -26,7 +26,16 @@ function component() {
26
t0 = $[1];
27
}
28
const handler = t0;
29
- return <Foo handler={handler}></Foo>;
29
+ const c_2 = $[2] !== handler;
30
+ let t1;
31
+ if (c_2) {
32
+ t1 = <Foo handler={handler}></Foo>;
33
+ $[2] = handler;
34
+ $[3] = t1;
35
+ } else {
36
+ t1 = $[3];
37
+ }
38
+ return t1;
39
}
40
41
```
compiler/forget/src/__tests__/fixtures/compiler/conditional-on-mutable.expect.md
+26
-4
@@ -35,7 +35,7 @@ function mayMutate() {}
35
36
```javascript
37
function ComponentA(props) {
38
- const $ = React.unstable_useMemoCache(3);
38
+ const $ = React.unstable_useMemoCache(6);
39
const c_0 = $[0] !== props;
40
let a;
41
let b;
@@ -55,11 +55,22 @@ function ComponentA(props) {
55
a = $[1];
56
b = $[2];
57
}
58
- return <Foo a={a} b={b}></Foo>;
58
+ const c_3 = $[3] !== a;
59
+ const c_4 = $[4] !== b;
60
+ let t0;
61
+ if (c_3 || c_4) {
62
+ t0 = <Foo a={a} b={b}></Foo>;
63
+ $[3] = a;
64
+ $[4] = b;
65
+ $[5] = t0;
66
+ } else {
67
+ t0 = $[5];
68
+ }
69
+ return t0;
70
}
71
72
function ComponentB(props) {
62
- const $ = React.unstable_useMemoCache(3);
73
+ const $ = React.unstable_useMemoCache(6);
74
const c_0 = $[0] !== props;
75
let a;
76
let b;
@@ -79,7 +90,18 @@ function ComponentB(props) {
90
a = $[1];
91
b = $[2];
92
}
82
- return <Foo a={a} b={b}></Foo>;
93
+ const c_3 = $[3] !== a;
94
+ const c_4 = $[4] !== b;
95
+ let t0;
96
+ if (c_3 || c_4) {
97
+ t0 = <Foo a={a} b={b}></Foo>;
98
+ $[3] = a;
99
+ $[4] = b;
100
+ $[5] = t0;
101
+ } else {
102
+ t0 = $[5];
103
+ }
104
+ return t0;
105
}
106
107
function Foo() {}
compiler/forget/src/__tests__/fixtures/compiler/constructor.expect.md
+9
-2
@@ -21,7 +21,7 @@ function Component(props) {
21
function Foo() {}
22
23
function Component(props) {
24
- const $ = React.unstable_useMemoCache(2);
24
+ const $ = React.unstable_useMemoCache(3);
25
let a;
26
let b;
27
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
@@ -35,7 +35,14 @@ function Component(props) {
35
a = $[0];
36
b = $[1];
37
}
38
- return <div a={a} b={b}></div>;
38
+ let t0;
39
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
40
+ t0 = <div a={a} b={b}></div>;
41
+ $[2] = t0;
42
+ } else {
43
+ t0 = $[2];
44
+ }
45
+ return t0;
46
}
47
48
```
compiler/forget/src/__tests__/fixtures/compiler/controlled-input.expect.md
+13
-2
@@ -14,7 +14,7 @@ function component() {
14
15
```javascript
16
function component() {
17
- const $ = React.unstable_useMemoCache(2);
17
+ const $ = React.unstable_useMemoCache(5);
18
const [x, setX] = useState(0);
19
const c_0 = $[0] !== setX;
20
let t0;
@@ -26,7 +26,18 @@ function component() {
26
t0 = $[1];
27
}
28
const handler = t0;
29
- return <input onChange={handler} value={x}></input>;
29
+ const c_2 = $[2] !== handler;
30
+ const c_3 = $[3] !== x;
31
+ let t1;
32
+ if (c_2 || c_3) {
33
+ t1 = <input onChange={handler} value={x}></input>;
34
+ $[2] = handler;
35
+ $[3] = x;
36
+ $[4] = t1;
37
+ } else {
38
+ t1 = $[4];
39
+ }
40
+ return t1;
41
}
42
43
```
compiler/forget/src/__tests__/fixtures/compiler/escape-analysis-destructured-rest-element.expect.md
+13
-2
@@ -16,7 +16,7 @@ function Component(props) {
16
17
```javascript
18
function Component(props) {
19
- const $ = React.unstable_useMemoCache(4);
19
+ const $ = React.unstable_useMemoCache(7);
20
const c_0 = $[0] !== props.a;
21
let b;
22
if (c_0) {
@@ -35,7 +35,18 @@ function Component(props) {
35
} else {
36
d = $[3];
37
}
38
- return <div b={b} d={d}></div>;
38
+ const c_4 = $[4] !== b;
39
+ const c_5 = $[5] !== d;
40
+ let t0;
41
+ if (c_4 || c_5) {
42
+ t0 = <div b={b} d={d}></div>;
43
+ $[4] = b;
44
+ $[5] = d;
45
+ $[6] = t0;
46
+ } else {
47
+ t0 = $[6];
48
+ }
49
+ return t0;
50
}
51
52
```
compiler/forget/src/__tests__/fixtures/compiler/escape-analysis-jsx-child.expect.md
+11
-3
@@ -20,7 +20,7 @@ function foo(a, b, c) {
20
21
```javascript
22
function foo(a, b, c) {
23
- const $ = React.unstable_useMemoCache(7);
23
+ const $ = React.unstable_useMemoCache(9);
24
const c_0 = $[0] !== a;
25
const c_1 = $[1] !== b;
26
const c_2 = $[2] !== c;
@@ -42,8 +42,16 @@ function foo(a, b, c) {
42
} else {
43
y = $[6];
44
}
45
-
46
- x.push(<div>{y}</div>);
45
+ const c_7 = $[7] !== y;
46
+ let t0;
47
+ if (c_7) {
48
+ t0 = <div>{y}</div>;
49
+ $[7] = y;
50
+ $[8] = t0;
51
+ } else {
52
+ t0 = $[8];
53
+ }
54
+ x.push(t0);
55
}
56
$[0] = a;
57
$[1] = b;
compiler/forget/src/__tests__/fixtures/compiler/gating-test-export-default-function.expect.md
+22
-2
@@ -28,7 +28,17 @@ function Bar_uncompiled(props) {
28
return <div>{props.bar}</div>;
29
}
30
function Bar_forget(props) {
31
- return <div>{props.bar}</div>;
31
+ const $ = React.unstable_useMemoCache(2);
32
+ const c_0 = $[0] !== props.bar;
33
+ let t0;
34
+ if (c_0) {
35
+ t0 = <div>{props.bar}</div>;
36
+ $[0] = props.bar;
37
+ $[1] = t0;
38
+ } else {
39
+ t0 = $[1];
40
+ }
41
+ return t0;
42
}
43
const Bar = isForgetEnabled ? Bar_forget : Bar_uncompiled;
44
export default Bar;
@@ -42,7 +52,17 @@ function Foo_uncompiled(props) {
52
return <Foo>{props.bar}</Foo>;
53
}
54
function Foo_forget(props) {
45
- return <Foo>{props.bar}</Foo>;
55
+ const $ = React.unstable_useMemoCache(2);
56
+ const c_0 = $[0] !== props.bar;
57
+ let t0;
58
+ if (c_0) {
59
+ t0 = <Foo>{props.bar}</Foo>;
60
+ $[0] = props.bar;
61
+ $[1] = t0;
62
+ } else {
63
+ t0 = $[1];
64
+ }
65
+ return t0;
66
}
67
const Foo = isForgetEnabled ? Foo_forget : Foo_uncompiled;
68
compiler/forget/src/__tests__/fixtures/compiler/gating-test-export-function-and-default.expect.md
+22
-2
@@ -28,7 +28,17 @@ function Bar_uncompiled(props) {
28
return <div>{props.bar}</div>;
29
}
30
function Bar_forget(props) {
31
- return <div>{props.bar}</div>;
31
+ const $ = React.unstable_useMemoCache(2);
32
+ const c_0 = $[0] !== props.bar;
33
+ let t0;
34
+ if (c_0) {
35
+ t0 = <div>{props.bar}</div>;
36
+ $[0] = props.bar;
37
+ $[1] = t0;
38
+ } else {
39
+ t0 = $[1];
40
+ }
41
+ return t0;
42
}
43
const Bar = isForgetEnabled ? Bar_forget : Bar_uncompiled;
44
export default Bar;
@@ -42,7 +52,17 @@ function Foo_uncompiled(props) {
52
return <Foo>{props.bar}</Foo>;
53
}
54
function Foo_forget(props) {
45
- return <Foo>{props.bar}</Foo>;
55
+ const $ = React.unstable_useMemoCache(2);
56
+ const c_0 = $[0] !== props.bar;
57
+ let t0;
58
+ if (c_0) {
59
+ t0 = <Foo>{props.bar}</Foo>;
60
+ $[0] = props.bar;
61
+ $[1] = t0;
62
+ } else {
63
+ t0 = $[1];
64
+ }
65
+ return t0;
66
}
67
export const Foo = isForgetEnabled ? Foo_forget : Foo_uncompiled;
68
compiler/forget/src/__tests__/fixtures/compiler/gating-test-export-function.expect.md
+22
-2
@@ -28,7 +28,17 @@ function Bar_uncompiled(props) {
28
return <div>{props.bar}</div>;
29
}
30
function Bar_forget(props) {
31
- return <div>{props.bar}</div>;
31
+ const $ = React.unstable_useMemoCache(2);
32
+ const c_0 = $[0] !== props.bar;
33
+ let t0;
34
+ if (c_0) {
35
+ t0 = <div>{props.bar}</div>;
36
+ $[0] = props.bar;
37
+ $[1] = t0;
38
+ } else {
39
+ t0 = $[1];
40
+ }
41
+ return t0;
42
}
43
export const Bar = isForgetEnabled ? Bar_forget : Bar_uncompiled;
44
@@ -41,7 +51,17 @@ function Foo_uncompiled(props) {
51
return <Foo>{props.bar}</Foo>;
52
}
53
function Foo_forget(props) {
44
- return <Foo>{props.bar}</Foo>;
54
+ const $ = React.unstable_useMemoCache(2);
55
+ const c_0 = $[0] !== props.bar;
56
+ let t0;
57
+ if (c_0) {
58
+ t0 = <Foo>{props.bar}</Foo>;
59
+ $[0] = props.bar;
60
+ $[1] = t0;
61
+ } else {
62
+ t0 = $[1];
63
+ }
64
+ return t0;
65
}
66
export const Foo = isForgetEnabled ? Foo_forget : Foo_uncompiled;
67
compiler/forget/src/__tests__/fixtures/compiler/gating-test.expect.md
+22
-2
@@ -28,7 +28,17 @@ function Bar_uncompiled(props) {
28
return <div>{props.bar}</div>;
29
}
30
function Bar_forget(props) {
31
- return <div>{props.bar}</div>;
31
+ const $ = React.unstable_useMemoCache(2);
32
+ const c_0 = $[0] !== props.bar;
33
+ let t0;
34
+ if (c_0) {
35
+ t0 = <div>{props.bar}</div>;
36
+ $[0] = props.bar;
37
+ $[1] = t0;
38
+ } else {
39
+ t0 = $[1];
40
+ }
41
+ return t0;
42
}
43
const Bar = isForgetEnabled ? Bar_forget : Bar_uncompiled;
44
@@ -41,7 +51,17 @@ function Foo_uncompiled(props) {
51
return <Foo>{props.bar}</Foo>;
52
}
53
function Foo_forget(props) {
44
- return <Foo>{props.bar}</Foo>;
54
+ const $ = React.unstable_useMemoCache(2);
55
+ const c_0 = $[0] !== props.bar;
56
+ let t0;
57
+ if (c_0) {
58
+ t0 = <Foo>{props.bar}</Foo>;
59
+ $[0] = props.bar;
60
+ $[1] = t0;
61
+ } else {
62
+ t0 = $[1];
63
+ }
64
+ return t0;
65
}
66
const Foo = isForgetEnabled ? Foo_forget : Foo_uncompiled;
67
compiler/forget/src/__tests__/fixtures/compiler/hook-call.expect.md
+16
-7
@@ -26,7 +26,7 @@ function useFreeze() {}
26
function foo() {}
27
28
function Component(props) {
29
- const $ = React.unstable_useMemoCache(1);
29
+ const $ = React.unstable_useMemoCache(3);
30
let t0;
31
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
32
t0 = [];
@@ -37,12 +37,21 @@ function Component(props) {
37
const x = t0;
38
const y = useFreeze(x);
39
foo(y, x);
40
- return (
41
- <Component>
42
- {x}
43
- {y}
44
- </Component>
45
- );
40
+ const c_1 = $[1] !== y;
41
+ let t1;
42
+ if (c_1) {
43
+ t1 = (
44
+ <Component>
45
+ {x}
46
+ {y}
47
+ </Component>
48
+ );
49
+ $[1] = y;
50
+ $[2] = t1;
51
+ } else {
52
+ t1 = $[2];
53
+ }
54
+ return t1;
55
}
56
57
```
compiler/forget/src/__tests__/fixtures/compiler/independent-across-if.expect.md
+13
-2
@@ -56,7 +56,7 @@ function Foo() {}
56
* return = <Foo a={a} b={b} />
57
*/
58
function Component(props) {
59
- const $ = React.unstable_useMemoCache(5);
59
+ const $ = React.unstable_useMemoCache(8);
60
const c_0 = $[0] !== props.a;
61
const c_1 = $[1] !== props.b;
62
const c_2 = $[2] !== props.c;
@@ -78,7 +78,18 @@ function Component(props) {
78
a = $[3];
79
b = $[4];
80
}
81
- return <Foo a={a} b={b}></Foo>;
81
+ const c_5 = $[5] !== a;
82
+ const c_6 = $[6] !== b;
83
+ let t0;
84
+ if (c_5 || c_6) {
85
+ t0 = <Foo a={a} b={b}></Foo>;
86
+ $[5] = a;
87
+ $[6] = b;
88
+ $[7] = t0;
89
+ } else {
90
+ t0 = $[7];
91
+ }
92
+ return t0;
93
}
94
95
```
compiler/forget/src/__tests__/fixtures/compiler/independent.expect.md
+13
-2
@@ -38,7 +38,7 @@ function Foo() {}
38
* return = <Foo a={a} b={b} />
39
*/
40
function Component(props) {
41
- const $ = React.unstable_useMemoCache(4);
41
+ const $ = React.unstable_useMemoCache(7);
42
const c_0 = $[0] !== props.a;
43
let t0;
44
if (c_0) {
@@ -59,7 +59,18 @@ function Component(props) {
59
t1 = $[3];
60
}
61
const b = t1;
62
- return <Foo a={a} b={b}></Foo>;
62
+ const c_4 = $[4] !== a;
63
+ const c_5 = $[5] !== b;
64
+ let t2;
65
+ if (c_4 || c_5) {
66
+ t2 = <Foo a={a} b={b}></Foo>;
67
+ $[4] = a;
68
+ $[5] = b;
69
+ $[6] = t2;
70
+ } else {
71
+ t2 = $[6];
72
+ }
73
+ return t2;
74
}
75
76
function compute() {}
compiler/forget/src/__tests__/fixtures/compiler/interdependent-across-if.expect.md
+13
-2
@@ -45,7 +45,7 @@ function Foo() {}
45
* return = <Foo a={a} b={b} />
46
*/
47
function Component(props) {
48
- const $ = React.unstable_useMemoCache(5);
48
+ const $ = React.unstable_useMemoCache(8);
49
const c_0 = $[0] !== props.a;
50
const c_1 = $[1] !== props.b;
51
const c_2 = $[2] !== props.c;
@@ -66,7 +66,18 @@ function Component(props) {
66
a = $[3];
67
b = $[4];
68
}
69
- return <Foo a={a} b={b}></Foo>;
69
+ const c_5 = $[5] !== a;
70
+ const c_6 = $[6] !== b;
71
+ let t0;
72
+ if (c_5 || c_6) {
73
+ t0 = <Foo a={a} b={b}></Foo>;
74
+ $[5] = a;
75
+ $[6] = b;
76
+ $[7] = t0;
77
+ } else {
78
+ t0 = $[7];
79
+ }
80
+ return t0;
81
}
82
83
```
compiler/forget/src/__tests__/fixtures/compiler/interdependent.expect.md
+13
-2
@@ -37,7 +37,7 @@ function Foo() {}
37
* return = <Foo a={a} b={b} />
38
*/
39
function Component(props) {
40
- const $ = React.unstable_useMemoCache(4);
40
+ const $ = React.unstable_useMemoCache(7);
41
const c_0 = $[0] !== props.a;
42
const c_1 = $[1] !== props.b;
43
let a;
@@ -54,7 +54,18 @@ function Component(props) {
54
a = $[2];
55
b = $[3];
56
}
57
- return <Foo a={a} b={b}></Foo>;
57
+ const c_4 = $[4] !== a;
58
+ const c_5 = $[5] !== b;
59
+ let t0;
60
+ if (c_4 || c_5) {
61
+ t0 = <Foo a={a} b={b}></Foo>;
62
+ $[4] = a;
63
+ $[5] = b;
64
+ $[6] = t0;
65
+ } else {
66
+ t0 = $[6];
67
+ }
68
+ return t0;
69
}
70
71
function compute() {}
compiler/forget/src/__tests__/fixtures/compiler/jsx-fragment.expect.md
+30
-6
@@ -19,12 +19,36 @@ function Foo(props) {
19
20
```javascript
21
function Foo(props) {
22
- return (
23
- <>
24
- Hello {props.greeting}
25
- {<div>{<>Text</>}</div>}
26
- </>
27
- );
22
+ const $ = React.unstable_useMemoCache(4);
23
+ let t0;
24
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
25
+ t0 = <>Text</>;
26
+ $[0] = t0;
27
+ } else {
28
+ t0 = $[0];
29
+ }
30
+ let t1;
31
+ if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
32
+ t1 = <div>{t0}</div>;
33
+ $[1] = t1;
34
+ } else {
35
+ t1 = $[1];
36
+ }
37
+ const c_2 = $[2] !== props.greeting;
38
+ let t2;
39
+ if (c_2) {
40
+ t2 = (
41
+ <>
42
+ Hello {props.greeting}
43
+ {t1}
44
+ </>
45
+ );
46
+ $[2] = props.greeting;
47
+ $[3] = t2;
48
+ } else {
49
+ t2 = $[3];
50
+ }
51
+ return t2;
52
}
53
54
```
compiler/forget/src/__tests__/fixtures/compiler/jsx-spread.expect.md
+13
-2
@@ -14,7 +14,7 @@ function Component(props) {
14
15
```javascript
16
function Component(props) {
17
- const $ = React.unstable_useMemoCache(2);
17
+ const $ = React.unstable_useMemoCache(5);
18
19
const t0 = props.cond ? props.foo : props.bar;
20
const c_0 = $[0] !== t0;
@@ -26,7 +26,18 @@ function Component(props) {
26
} else {
27
t1 = $[1];
28
}
29
- return <Component {...props} {...t1}></Component>;
29
+ const c_2 = $[2] !== props;
30
+ const c_3 = $[3] !== t1;
31
+ let t2;
32
+ if (c_2 || c_3) {
33
+ t2 = <Component {...props} {...t1}></Component>;
34
+ $[2] = props;
35
+ $[3] = t1;
36
+ $[4] = t2;
37
+ } else {
38
+ t2 = $[4];
39
+ }
40
+ return t2;
41
}
42
43
```
compiler/forget/src/__tests__/fixtures/compiler/overlapping-scopes-shadowing-within-block.expect.md
+11
-3
@@ -21,7 +21,7 @@ function foo(a, b, c) {
21
22
```javascript
23
function foo(a, b, c) {
24
- const $ = React.unstable_useMemoCache(7);
24
+ const $ = React.unstable_useMemoCache(9);
25
const c_0 = $[0] !== a;
26
const c_1 = $[1] !== b;
27
const c_2 = $[2] !== c;
@@ -43,8 +43,16 @@ function foo(a, b, c) {
43
} else {
44
y = $[6];
45
}
46
-
47
- x.push(<div>{y}</div>);
46
+ const c_7 = $[7] !== y;
47
+ let t0;
48
+ if (c_7) {
49
+ t0 = <div>{y}</div>;
50
+ $[7] = y;
51
+ $[8] = t0;
52
+ } else {
53
+ t0 = $[8];
54
+ }
55
+ x.push(t0);
56
}
57
$[0] = a;
58
$[1] = b;
compiler/forget/src/__tests__/fixtures/compiler/property-assignment.expect.md
+13
-2
@@ -17,7 +17,7 @@ function Component(props) {
17
18
```javascript
19
function Component(props) {
20
- const $ = React.unstable_useMemoCache(3);
20
+ const $ = React.unstable_useMemoCache(6);
21
const c_0 = $[0] !== props.p0;
22
let x;
23
let child;
@@ -35,7 +35,18 @@ function Component(props) {
35
x = $[1];
36
child = $[2];
37
}
38
- return <Component data={x}>{child}</Component>;
38
+ const c_3 = $[3] !== x;
39
+ const c_4 = $[4] !== child;
40
+ let t0;
41
+ if (c_3 || c_4) {
42
+ t0 = <Component data={x}>{child}</Component>;
43
+ $[3] = x;
44
+ $[4] = child;
45
+ $[5] = t0;
46
+ } else {
47
+ t0 = $[5];
48
+ }
49
+ return t0;
50
}
51
52
```
compiler/forget/src/__tests__/fixtures/compiler/reactive-scopes-if.expect.md
+11
-2
@@ -20,7 +20,7 @@ function foo(a, b, c) {
20
21
```javascript
22
function foo(a, b, c) {
23
- const $ = React.unstable_useMemoCache(6);
23
+ const $ = React.unstable_useMemoCache(8);
24
const c_0 = $[0] !== a;
25
const c_1 = $[1] !== b;
26
const c_2 = $[2] !== c;
@@ -38,7 +38,16 @@ function foo(a, b, c) {
38
} else {
39
y = $[5];
40
}
41
- x.push(<div>{y}</div>);
41
+ const c_6 = $[6] !== y;
42
+ let t0;
43
+ if (c_6) {
44
+ t0 = <div>{y}</div>;
45
+ $[6] = y;
46
+ $[7] = t0;
47
+ } else {
48
+ t0 = $[7];
49
+ }
50
+ x.push(t0);
51
} else {
52
x.push(c);
53
}
compiler/forget/src/__tests__/fixtures/compiler/reactive-scopes.expect.md
+11
-2
@@ -19,7 +19,7 @@ function f(a, b) {
19
20
```javascript
21
function f(a, b) {
22
- const $ = React.unstable_useMemoCache(3);
22
+ const $ = React.unstable_useMemoCache(5);
23
const c_0 = $[0] !== a.length;
24
const c_1 = $[1] !== b;
25
let x;
@@ -36,7 +36,16 @@ function f(a, b) {
36
} else {
37
x = $[2];
38
}
39
- return <div>{x}</div>;
39
+ const c_3 = $[3] !== x;
40
+ let t0;
41
+ if (c_3) {
42
+ t0 = <div>{x}</div>;
43
+ $[3] = x;
44
+ $[4] = t0;
45
+ } else {
46
+ t0 = $[4];
47
+ }
48
+ return t0;
49
}
50
51
```
compiler/forget/src/__tests__/fixtures/compiler/reassignment-conditional.expect.md
+13
-2
@@ -23,7 +23,7 @@ function Component(props) {
23
24
```javascript
25
function Component(props) {
26
- const $ = React.unstable_useMemoCache(3);
26
+ const $ = React.unstable_useMemoCache(6);
27
const c_0 = $[0] !== props.p0;
28
let x;
29
if (c_0) {
@@ -47,7 +47,18 @@ function Component(props) {
47
}
48
49
y.push(props.p2);
50
- return <Component x={x} y={y}></Component>;
50
+ const c_3 = $[3] !== x;
51
+ const c_4 = $[4] !== y;
52
+ let t1;
53
+ if (c_3 || c_4) {
54
+ t1 = <Component x={x} y={y}></Component>;
55
+ $[3] = x;
56
+ $[4] = y;
57
+ $[5] = t1;
58
+ } else {
59
+ t1 = $[5];
60
+ }
61
+ return t1;
62
}
63
64
```
compiler/forget/src/__tests__/fixtures/compiler/reassignment-separate-scopes.expect.md
+38
-19
@@ -34,7 +34,7 @@ function foo(a, b, c) {
34
35
```javascript
36
function foo(a, b, c) {
37
- const $ = React.unstable_useMemoCache(6);
37
+ const $ = React.unstable_useMemoCache(11);
38
const c_0 = $[0] !== a;
39
let x;
40
if (c_0) {
@@ -47,39 +47,58 @@ function foo(a, b, c) {
47
} else {
48
x = $[1];
49
}
50
-
51
- const y = <div>{x}</div>;
50
+ const c_2 = $[2] !== x;
51
+ let t0;
52
+ if (c_2) {
53
+ t0 = <div>{x}</div>;
54
+ $[2] = x;
55
+ $[3] = t0;
56
+ } else {
57
+ t0 = $[3];
58
+ }
59
+ const y = t0;
60
bb3: switch (b) {
61
case 0: {
54
- const c_2 = $[2] !== b;
55
- if (c_2) {
62
+ const c_4 = $[4] !== b;
63
+ if (c_4) {
64
x = [];
65
x.push(b);
58
- $[2] = b;
59
- $[3] = x;
66
+ $[4] = b;
67
+ $[5] = x;
68
} else {
61
- x = $[3];
69
+ x = $[5];
70
}
71
break bb3;
72
}
73
default: {
66
- const c_4 = $[4] !== c;
67
- if (c_4) {
74
+ const c_6 = $[6] !== c;
75
+ if (c_6) {
76
x = [];
77
x.push(c);
70
- $[4] = c;
71
- $[5] = x;
78
+ $[6] = c;
79
+ $[7] = x;
80
} else {
73
- x = $[5];
81
+ x = $[7];
82
}
83
}
84
}
77
- return (
78
- <div>
79
- {y}
80
- {x}
81
- </div>
82
- );
85
+ const c_8 = $[8] !== y;
86
+ const c_9 = $[9] !== x;
87
+ let t1;
88
+ if (c_8 || c_9) {
89
+ t1 = (
90
+ <div>
91
+ {y}
92
+ {x}
93
+ </div>
94
+ );
95
+ $[8] = y;
96
+ $[9] = x;
97
+ $[10] = t1;
98
+ } else {
99
+ t1 = $[10];
100
+ }
101
+ return t1;
102
}
103
104
```
compiler/forget/src/__tests__/fixtures/compiler/reassignment.expect.md
+13
-2
@@ -21,7 +21,7 @@ function Component(props) {
21
22
```javascript
23
function Component(props) {
24
- const $ = React.unstable_useMemoCache(5);
24
+ const $ = React.unstable_useMemoCache(8);
25
const c_0 = $[0] !== props.p0;
26
const c_1 = $[1] !== props.p1;
27
let x;
@@ -48,7 +48,18 @@ function Component(props) {
48
x = $[2];
49
y = $[3];
50
}
51
- return <Component x={x} y={y}></Component>;
51
+ const c_5 = $[5] !== x;
52
+ const c_6 = $[6] !== y;
53
+ let t1;
54
+ if (c_5 || c_6) {
55
+ t1 = <Component x={x} y={y}></Component>;
56
+ $[5] = x;
57
+ $[6] = y;
58
+ $[7] = t1;
59
+ } else {
60
+ t1 = $[7];
61
+ }
62
+ return t1;
63
}
64
65
```
compiler/forget/src/__tests__/fixtures/compiler/same-variable-as-dep-and-redeclare-maybe-frozen.expect.md
+58
-27
@@ -46,7 +46,7 @@ function foo(props) {
46
// note: comments are for the ideal scopes, not what is currently
47
// emitted
48
function foo(props) {
49
- const $ = React.unstable_useMemoCache(7);
49
+ const $ = React.unstable_useMemoCache(16);
50
const c_0 = $[0] !== props.a;
51
let x;
52
if (c_0) {
@@ -57,39 +57,70 @@ function foo(props) {
57
} else {
58
x = $[1];
59
}
60
-
61
- const header = props.showHeader ? <div>{x}</div> : null;
62
- const c_2 = $[2] !== x;
63
- const c_3 = $[3] !== props.b;
64
- const c_4 = $[4] !== props.c;
60
+ const c_2 = $[2] !== props.showHeader;
61
+ const c_3 = $[3] !== x;
62
+ let t0;
63
+ if (c_2 || c_3) {
64
+ t0 = props.showHeader ? <div>{x}</div> : null;
65
+ $[2] = props.showHeader;
66
+ $[3] = x;
67
+ $[4] = t0;
68
+ } else {
69
+ t0 = $[4];
70
+ }
71
+ const header = t0;
72
+ const c_5 = $[5] !== x;
73
+ const c_6 = $[6] !== props.b;
74
+ const c_7 = $[7] !== props.c;
75
let y;
66
- if (c_2 || c_3 || c_4) {
76
+ if (c_5 || c_6 || c_7) {
77
y = [x];
78
x = [];
79
y.push(props.b);
80
x.push(props.c);
71
- $[2] = x;
72
- $[3] = props.b;
73
- $[4] = props.c;
74
- $[5] = y;
75
- $[6] = x;
81
+ $[5] = x;
82
+ $[6] = props.b;
83
+ $[7] = props.c;
84
+ $[8] = y;
85
+ $[9] = x;
86
} else {
77
- y = $[5];
78
- x = $[6];
87
+ y = $[8];
88
+ x = $[9];
89
}
80
-
81
- const content = (
82
- <div>
83
- {x}
84
- {y}
85
- </div>
86
- );
87
- return (
88
- <>
89
- {header}
90
- {content}
91
- </>
92
- );
90
+ const c_10 = $[10] !== x;
91
+ const c_11 = $[11] !== y;
92
+ let t1;
93
+ if (c_10 || c_11) {
94
+ t1 = (
95
+ <div>
96
+ {x}
97
+ {y}
98
+ </div>
99
+ );
100
+ $[10] = x;
101
+ $[11] = y;
102
+ $[12] = t1;
103
+ } else {
104
+ t1 = $[12];
105
+ }
106
+ const content = t1;
107
+ const c_13 = $[13] !== header;
108
+ const c_14 = $[14] !== content;
109
+ let t2;
110
+ if (c_13 || c_14) {
111
+ t2 = (
112
+ <>
113
+ {header}
114
+ {content}
115
+ </>
116
+ );
117
+ $[13] = header;
118
+ $[14] = content;
119
+ $[15] = t2;
120
+ } else {
121
+ t2 = $[15];
122
+ }
123
+ return t2;
124
}
125
126
```
compiler/forget/src/__tests__/fixtures/compiler/same-variable-as-dep-and-redeclare.expect.md
+55
-26
@@ -46,7 +46,7 @@ function foo(props) {
46
// note: comments are for the ideal scopes, not what is currently
47
// emitted
48
function foo(props) {
49
- const $ = React.unstable_useMemoCache(7);
49
+ const $ = React.unstable_useMemoCache(15);
50
const c_0 = $[0] !== props.a;
51
let x;
52
if (c_0) {
@@ -57,39 +57,68 @@ function foo(props) {
57
} else {
58
x = $[1];
59
}
60
-
61
- const header = <div>{x}</div>;
60
const c_2 = $[2] !== x;
63
- const c_3 = $[3] !== props.b;
64
- const c_4 = $[4] !== props.c;
61
+ let t0;
62
+ if (c_2) {
63
+ t0 = <div>{x}</div>;
64
+ $[2] = x;
65
+ $[3] = t0;
66
+ } else {
67
+ t0 = $[3];
68
+ }
69
+ const header = t0;
70
+ const c_4 = $[4] !== x;
71
+ const c_5 = $[5] !== props.b;
72
+ const c_6 = $[6] !== props.c;
73
let y;
66
- if (c_2 || c_3 || c_4) {
74
+ if (c_4 || c_5 || c_6) {
75
y = [x];
76
x = [];
77
y.push(props.b);
78
x.push(props.c);
71
- $[2] = x;
72
- $[3] = props.b;
73
- $[4] = props.c;
74
- $[5] = y;
75
- $[6] = x;
79
+ $[4] = x;
80
+ $[5] = props.b;
81
+ $[6] = props.c;
82
+ $[7] = y;
83
+ $[8] = x;
84
} else {
77
- y = $[5];
78
- x = $[6];
85
+ y = $[7];
86
+ x = $[8];
87
}
80
-
81
- const content = (
82
- <div>
83
- {x}
84
- {y}
85
- </div>
86
- );
87
- return (
88
- <>
89
- {header}
90
- {content}
91
- </>
92
- );
88
+ const c_9 = $[9] !== x;
89
+ const c_10 = $[10] !== y;
90
+ let t1;
91
+ if (c_9 || c_10) {
92
+ t1 = (
93
+ <div>
94
+ {x}
95
+ {y}
96
+ </div>
97
+ );
98
+ $[9] = x;
99
+ $[10] = y;
100
+ $[11] = t1;
101
+ } else {
102
+ t1 = $[11];
103
+ }
104
+ const content = t1;
105
+ const c_12 = $[12] !== header;
106
+ const c_13 = $[13] !== content;
107
+ let t2;
108
+ if (c_12 || c_13) {
109
+ t2 = (
110
+ <>
111
+ {header}
112
+ {content}
113
+ </>
114
+ );
115
+ $[12] = header;
116
+ $[13] = content;
117
+ $[14] = t2;
118
+ } else {
119
+ t2 = $[14];
120
+ }
121
+ return t2;
122
}
123
124
```
compiler/forget/src/__tests__/fixtures/compiler/ssa-call-jsx-2.expect.md
+9
-2
@@ -25,7 +25,7 @@ function Component(props) {
25
function foo() {}
26
27
function Component(props) {
28
- const $ = React.unstable_useMemoCache(2);
28
+ const $ = React.unstable_useMemoCache(3);
29
let a;
30
let b;
31
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
@@ -42,7 +42,14 @@ function Component(props) {
42
a = $[0];
43
b = $[1];
44
}
45
- return <div a={a} b={b}></div>;
45
+ let t0;
46
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
47
+ t0 = <div a={a} b={b}></div>;
48
+ $[2] = t0;
49
+ } else {
50
+ t0 = $[2];
51
+ }
52
+ return t0;
53
}
54
55
```
compiler/forget/src/__tests__/fixtures/compiler/ssa-call-jsx.expect.md
+9
-2
@@ -21,7 +21,7 @@ function Component(props) {
21
function foo() {}
22
23
function Component(props) {
24
- const $ = React.unstable_useMemoCache(2);
24
+ const $ = React.unstable_useMemoCache(3);
25
let a;
26
let b;
27
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
@@ -36,7 +36,14 @@ function Component(props) {
36
a = $[0];
37
b = $[1];
38
}
39
- return <div a={a} b={b}></div>;
39
+ let t0;
40
+ if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
41
+ t0 = <div a={a} b={b}></div>;
42
+ $[2] = t0;
43
+ } else {
44
+ t0 = $[2];
45
+ }
46
+ return t0;
47
}
48
49
```
compiler/forget/src/__tests__/fixtures/compiler/ssa-leave-case.expect.md
+18
-7
@@ -23,7 +23,7 @@ function Component(props) {
23
24
```javascript
25
function Component(props) {
26
- const $ = React.unstable_useMemoCache(3);
26
+ const $ = React.unstable_useMemoCache(6);
27
const c_0 = $[0] !== props;
28
let x;
29
let y;
@@ -41,12 +41,23 @@ function Component(props) {
41
x = $[1];
42
y = $[2];
43
}
44
- return (
45
- <Component>
46
- {x}
47
- {y}
48
- </Component>
49
- );
44
+ const c_3 = $[3] !== x;
45
+ const c_4 = $[4] !== y;
46
+ let t0;
47
+ if (c_3 || c_4) {
48
+ t0 = (
49
+ <Component>
50
+ {x}
51
+ {y}
52
+ </Component>
53
+ );
54
+ $[3] = x;
55
+ $[4] = y;
56
+ $[5] = t0;
57
+ } else {
58
+ t0 = $[5];
59
+ }
60
+ return t0;
61
}
62
63
```
compiler/forget/src/__tests__/fixtures/compiler/switch-non-final-default.expect.md
+23
-4
@@ -32,7 +32,7 @@ function Component(props) {
32
33
```javascript
34
function Component(props) {
35
- const $ = React.unstable_useMemoCache(4);
35
+ const $ = React.unstable_useMemoCache(9);
36
const c_0 = $[0] !== props;
37
let x;
38
let y;
@@ -69,10 +69,29 @@ function Component(props) {
69
x = $[1];
70
y = $[2];
71
}
72
-
73
- const child = <Component data={x}></Component>;
72
+ const c_4 = $[4] !== x;
73
+ let t1;
74
+ if (c_4) {
75
+ t1 = <Component data={x}></Component>;
76
+ $[4] = x;
77
+ $[5] = t1;
78
+ } else {
79
+ t1 = $[5];
80
+ }
81
+ const child = t1;
82
y.push(props.p4);
75
- return <Component data={y}>{child}</Component>;
83
+ const c_6 = $[6] !== y;
84
+ const c_7 = $[7] !== child;
85
+ let t2;
86
+ if (c_6 || c_7) {
87
+ t2 = <Component data={y}>{child}</Component>;
88
+ $[6] = y;
89
+ $[7] = child;
90
+ $[8] = t2;
91
+ } else {
92
+ t2 = $[8];
93
+ }
94
+ return t2;
95
}
96
97
```
compiler/forget/src/__tests__/fixtures/compiler/switch.expect.md
+23
-4
@@ -27,7 +27,7 @@ function Component(props) {
27
28
```javascript
29
function Component(props) {
30
- const $ = React.unstable_useMemoCache(3);
30
+ const $ = React.unstable_useMemoCache(8);
31
const c_0 = $[0] !== props;
32
let x;
33
let y;
@@ -50,10 +50,29 @@ function Component(props) {
50
x = $[1];
51
y = $[2];
52
}
53
-
54
- const child = <Component data={x}></Component>;
53
+ const c_3 = $[3] !== x;
54
+ let t0;
55
+ if (c_3) {
56
+ t0 = <Component data={x}></Component>;
57
+ $[3] = x;
58
+ $[4] = t0;
59
+ } else {
60
+ t0 = $[4];
61
+ }
62
+ const child = t0;
63
y.push(props.p4);
56
- return <Component data={y}>{child}</Component>;
64
+ const c_5 = $[5] !== y;
65
+ const c_6 = $[6] !== child;
66
+ let t1;
67
+ if (c_5 || c_6) {
68
+ t1 = <Component data={y}>{child}</Component>;
69
+ $[5] = y;
70
+ $[6] = child;
71
+ $[7] = t1;
72
+ } else {
73
+ t1 = $[7];
74
+ }
75
+ return t1;
76
}
77
78
```
compiler/forget/src/__tests__/fixtures/compiler/temporary-at-start-of-value-block.expect.md
+11
-1
@@ -14,7 +14,17 @@ function component(props) {
14
15
```javascript
16
function component(props) {
17
- const x = isMenuShown ? <Bar> {props.a ? props.b : props.c}</Bar> : null;
17
+ const $ = React.unstable_useMemoCache(2);
18
+ const c_0 = $[0] !== props;
19
+ let t0;
20
+ if (c_0) {
21
+ t0 = isMenuShown ? <Bar> {props.a ? props.b : props.c}</Bar> : null;
22
+ $[0] = props;
23
+ $[1] = t0;
24
+ } else {
25
+ t0 = $[1];
26
+ }
27
+ const x = t0;
28
return x;
29
}
30
compiler/forget/src/__tests__/fixtures/compiler/timers.expect.md
+13
-6
@@ -19,7 +19,7 @@ function Component(props) {
19
20
```javascript
21
function Component(props) {
22
- const $ = React.unstable_useMemoCache(1);
22
+ const $ = React.unstable_useMemoCache(2);
23
const start = performance.now();
24
let t0;
25
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
@@ -30,11 +30,18 @@ function Component(props) {
30
}
31
const now = t0;
32
const time = performance.now() - start;
33
- return (
34
- <div>
35
- rendering took {time} at {now}
36
- </div>
37
- );
33
+ let t1;
34
+ if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
35
+ t1 = (
36
+ <div>
37
+ rendering took {time} at {now}
38
+ </div>
39
+ );
40
+ $[1] = t1;
41
+ } else {
42
+ t1 = $[1];
43
+ }
44
+ return t1;
45
}
46
47
```
compiler/forget/src/__tests__/fixtures/compiler/use-callback-simple.expect.md
+11
-2
@@ -15,7 +15,7 @@ function component() {
15
16
```javascript
17
function component() {
18
- const $ = React.unstable_useMemoCache(3);
18
+ const $ = React.unstable_useMemoCache(5);
19
const [count, setCount] = useState(0);
20
const c_0 = $[0] !== setCount;
21
const c_1 = $[1] !== count;
@@ -29,7 +29,16 @@ function component() {
29
t0 = $[2];
30
}
31
const increment = t0;
32
- return <Foo onClick={increment}></Foo>;
32
+ const c_3 = $[3] !== increment;
33
+ let t1;
34
+ if (c_3) {
35
+ t1 = <Foo onClick={increment}></Foo>;
36
+ $[3] = increment;
37
+ $[4] = t1;
38
+ } else {
39
+ t1 = $[4];
40
+ }
41
+ return t1;
42
}
43
44
```
compiler/forget/src/__tests__/fixtures/compiler/useMemo-simple.expect.md
+11
-2
@@ -13,7 +13,7 @@ function component(a) {
13
14
```javascript
15
function component(a) {
16
- const $ = React.unstable_useMemoCache(2);
16
+ const $ = React.unstable_useMemoCache(4);
17
const c_0 = $[0] !== a;
18
let t0;
19
if (c_0) {
@@ -24,7 +24,16 @@ function component(a) {
24
t0 = $[1];
25
}
26
const x = t0;
27
- return <Foo x={x}></Foo>;
27
+ const c_2 = $[2] !== x;
28
+ let t1;
29
+ if (c_2) {
30
+ t1 = <Foo x={x}></Foo>;
31
+ $[2] = x;
32
+ $[3] = t1;
33
+ } else {
34
+ t1 = $[3];
35
+ }
36
+ return t1;
37
}
38
39
```
compiler/forget/src/__tests__/fixtures/disableMemoizeJsxElements/Component.expect.md
new
+41
@@ -0,0 +1,41 @@
1
+
2
+## Input
3
+
4
+```javascript
5
+function Component(props) {
6
+ const [name, setName] = useState(null);
7
+ const onChange = function (e) {
8
+ setName(e.target.value);
9
+ };
10
+ return (
11
+ <form>
12
+ <input onChange={onChange} value={name} />
13
+ </form>
14
+ );
15
+}
16
+
17
+```
18
+
19
+## Code
20
+
21
+```javascript
22
+function Component(props) {
23
+ const $ = React.unstable_useMemoCache(2);
24
+ const [name, setName] = useState(null);
25
+ const c_0 = $[0] !== setName;
26
+ let t0;
27
+ if (c_0) {
28
+ t0 = function (e) {
29
+ setName(e.target.value);
30
+ };
31
+ $[0] = setName;
32
+ $[1] = t0;
33
+ } else {
34
+ t0 = $[1];
35
+ }
36
+ const onChange = t0;
37
+ return <form>{<input onChange={onChange} value={name}></input>}</form>;
38
+}
39
+
40
+```
41
+
\ No newline at end of file
compiler/forget/src/__tests__/fixtures/disableMemoizeJsxElements/Component.js
new
+11
@@ -0,0 +1,11 @@
1
+function Component(props) {
2
+ const [name, setName] = useState(null);
3
+ const onChange = function (e) {
4
+ setName(e.target.value);
5
+ };
6
+ return (
7
+ <form>
8
+ <input onChange={onChange} value={name} />
9
+ </form>
10
+ );
11
+}