From bded3cec2e69ed30f9341a693a2b3dd67eaa8ccc Mon Sep 17 00:00:00 2001 From: Carl Bergman <30546+carlbergman@users.noreply.github.com> Date: Thu, 5 Mar 2026 15:52:29 +0100 Subject: [PATCH 1/2] [compiler] Add fixture for custom hook with use() not compiled Custom hooks whose only invocation is the `use()` function are skipped by the compiler. This fixture demonstrates the current (broken) output where `useMyContext` is not compiled. Ref #35960 --- .../compiler/use-operator-in-hook.expect.md | 43 +++++++++++++++++++ .../fixtures/compiler/use-operator-in-hook.js | 14 ++++++ 2 files changed, 57 insertions(+) create mode 100644 compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-operator-in-hook.expect.md create mode 100644 compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-operator-in-hook.js diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-operator-in-hook.expect.md b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-operator-in-hook.expect.md new file mode 100644 index 000000000000..cdd5651cfade --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-operator-in-hook.expect.md @@ -0,0 +1,43 @@ + +## Input + +```javascript +// @compilationMode:"infer" @expectNothingCompiled +import {use} from 'react'; + +const MyContext = React.createContext(null); + +function useMyContext() { + const context = use(MyContext); + return [context]; +} + +export const FIXTURE_ENTRYPOINT = { + fn: useMyContext, + params: [], +}; + +``` + +## Code + +```javascript +// @compilationMode:"infer" @expectNothingCompiled +import { use } from "react"; + +const MyContext = React.createContext(null); + +function useMyContext() { + const context = use(MyContext); + return [context]; +} + +export const FIXTURE_ENTRYPOINT = { + fn: useMyContext, + params: [], +}; + +``` + +### Eval output +(kind: ok) [null] \ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-operator-in-hook.js b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-operator-in-hook.js new file mode 100644 index 000000000000..2874390928bd --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-operator-in-hook.js @@ -0,0 +1,14 @@ +// @compilationMode:"infer" @expectNothingCompiled +import {use} from 'react'; + +const MyContext = React.createContext(null); + +function useMyContext() { + const context = use(MyContext); + return [context]; +} + +export const FIXTURE_ENTRYPOINT = { + fn: useMyContext, + params: [], +}; From 2d02a52f29097736b8c4f0d771a5eecce85afd6e Mon Sep 17 00:00:00 2001 From: Carl Bergman <30546+carlbergman@users.noreply.github.com> Date: Thu, 5 Mar 2026 17:00:04 +0100 Subject: [PATCH 2/2] [compiler] Fix detection of use() in custom hooks for infer mode The `isHookName` check in Program.ts used the regex `/^use[A-Z0-9]/` which doesn't match `use()`. This caused custom hooks whose only invocation is `use()` to be skipped in infer mode. Fixes #35960 --- .../src/Entrypoint/Program.ts | 2 +- .../compiler/use-operator-in-hook.expect.md | 15 ++++++++++++--- .../fixtures/compiler/use-operator-in-hook.js | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts b/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts index 2880e9283c77..75b54a7dc7ec 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts +++ b/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Program.ts @@ -895,7 +895,7 @@ function hasMemoCacheFunctionImport( } function isHookName(s: string): boolean { - return /^use[A-Z0-9]/.test(s); + return /^use[A-Z0-9]/.test(s) || s === 'use'; } /* diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-operator-in-hook.expect.md b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-operator-in-hook.expect.md index cdd5651cfade..a22fc4e54100 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-operator-in-hook.expect.md +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-operator-in-hook.expect.md @@ -2,7 +2,7 @@ ## Input ```javascript -// @compilationMode:"infer" @expectNothingCompiled +// @compilationMode:"infer" import {use} from 'react'; const MyContext = React.createContext(null); @@ -22,14 +22,23 @@ export const FIXTURE_ENTRYPOINT = { ## Code ```javascript -// @compilationMode:"infer" @expectNothingCompiled +import { c as _c } from "react/compiler-runtime"; // @compilationMode:"infer" import { use } from "react"; const MyContext = React.createContext(null); function useMyContext() { + const $ = _c(2); const context = use(MyContext); - return [context]; + let t0; + if ($[0] !== context) { + t0 = [context]; + $[0] = context; + $[1] = t0; + } else { + t0 = $[1]; + } + return t0; } export const FIXTURE_ENTRYPOINT = { diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-operator-in-hook.js b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-operator-in-hook.js index 2874390928bd..dfa92b78bf08 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-operator-in-hook.js +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-operator-in-hook.js @@ -1,4 +1,4 @@ -// @compilationMode:"infer" @expectNothingCompiled +// @compilationMode:"infer" import {use} from 'react'; const MyContext = React.createContext(null);