From 4ef6387da3b8f5b35ba5fa24cd0a14cdac75b9aa Mon Sep 17 00:00:00 2001 From: Joe Savona Date: Tue, 23 Jul 2024 16:34:03 +0900 Subject: [PATCH] [compiler] repro of false positive for ValidatePreserveManualMemo [ghstack-poisoned] --- ...-positive-useMemo-with-refs.flow.expect.md | 38 +++++++++++++++++++ ...r.false-positive-useMemo-with-refs.flow.js | 13 +++++++ 2 files changed, 51 insertions(+) create mode 100644 compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.false-positive-useMemo-with-refs.flow.expect.md create mode 100644 compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.false-positive-useMemo-with-refs.flow.js diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.false-positive-useMemo-with-refs.flow.expect.md b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.false-positive-useMemo-with-refs.flow.expect.md new file mode 100644 index 0000000000000..369fd755717e9 --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.false-positive-useMemo-with-refs.flow.expect.md @@ -0,0 +1,38 @@ + +## Input + +```javascript +// @flow @validatePreserveExistingMemoizationGuarantees +import { identity } from "shared-runtime"; + +component Component( + disableLocalRef, + ref, +) { + const localRef = useFooRef(); + const mergedRef = useMemo(() => { + return disableLocalRef ? ref : identity(ref, localRef); + }, [disableLocalRef, ref, localRef]); + return
; +} + +``` + + +## Error + +``` + 7 | ) { + 8 | const localRef = useFooRef(); +> 9 | const mergedRef = useMemo(() => { + | ^^^^^^^ +> 10 | return disableLocalRef ? ref : identity(ref, localRef); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +> 11 | }, [disableLocalRef, ref, localRef]); + | ^^^^ CannotPreserveMemoization: React Compiler has skipped optimizing this component because the existing manual memoization could not be preserved. This value may be mutated later, which could cause the value to change unexpectedly (9:11) + 12 | return
; + 13 | } + 14 | +``` + + \ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.false-positive-useMemo-with-refs.flow.js b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.false-positive-useMemo-with-refs.flow.js new file mode 100644 index 0000000000000..c3355ead16ef5 --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.false-positive-useMemo-with-refs.flow.js @@ -0,0 +1,13 @@ +// @flow @validatePreserveExistingMemoizationGuarantees +import { identity } from "shared-runtime"; + +component Component( + disableLocalRef, + ref, +) { + const localRef = useFooRef(); + const mergedRef = useMemo(() => { + return disableLocalRef ? ref : identity(ref, localRef); + }, [disableLocalRef, ref, localRef]); + return
; +}