diff --git a/compiler/packages/babel-plugin-react-forget/src/HIR/BuildHIR.ts b/compiler/packages/babel-plugin-react-forget/src/HIR/BuildHIR.ts index a3b3142393..e1d3b88619 100644 --- a/compiler/packages/babel-plugin-react-forget/src/HIR/BuildHIR.ts +++ b/compiler/packages/babel-plugin-react-forget/src/HIR/BuildHIR.ts @@ -3803,6 +3803,7 @@ function gatherCapturedDeps( */ let dependency: | NodePath + | NodePath | NodePath | NodePath; if (path.isJSXOpeningElement()) { @@ -3820,7 +3821,25 @@ function gatherCapturedDeps( "Invalid logic in gatherCapturedDeps" ); baseIdentifier = current; - dependency = current; + + /* + * Get the expression to depend on, which may involve PropertyLoads + * for member expressions + */ + let currentDep: + | NodePath + | NodePath + | NodePath = baseIdentifier; + + while (true) { + const nextDep: null | NodePath = currentDep.parentPath; + if (nextDep && nextDep.isJSXMemberExpression()) { + currentDep = nextDep; + } else { + break; + } + } + dependency = currentDep; } else if (path.isMemberExpression()) { // Calculate baseIdentifier let currentId: NodePath = path; @@ -3885,6 +3904,15 @@ function gatherCapturedDeps( } exprKey += "." + pathTokens.reverse().join("."); + } else if (dependency.isJSXMemberExpression()) { + let pathTokens = []; + let current: NodePath = + dependency; + while (current.isJSXMemberExpression()) { + const property = current.get("property"); + pathTokens.push(property.node.name); + current = current.get("object"); + } } if (!seenPaths.has(exprKey)) { @@ -3895,6 +3923,8 @@ function gatherCapturedDeps( place: lowerIdentifier(builder, dependency), loc: path.node.loc ?? GeneratedSource, }); + } else if (dependency.isJSXMemberExpression()) { + loweredDep = lowerJsxMemberExpression(builder, dependency); } else { loweredDep = lowerExpressionToTemporary(builder, dependency); } diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/bug-jsx-memberexpr-tag-in-lambda.expect.md b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/jsx-memberexpr-tag-in-lambda.expect.md similarity index 91% rename from compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/bug-jsx-memberexpr-tag-in-lambda.expect.md rename to compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/jsx-memberexpr-tag-in-lambda.expect.md index 5030bbb431..b8e2e1acc9 100644 --- a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/bug-jsx-memberexpr-tag-in-lambda.expect.md +++ b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/jsx-memberexpr-tag-in-lambda.expect.md @@ -25,6 +25,7 @@ import { unstable_useMemoCache as useMemoCache } from "react"; import * as SharedRuntime from "shared-runtime"; function useFoo() { const $ = useMemoCache(2); + const MyLocal = SharedRuntime; let t0; if ($[0] === Symbol.for("react.memo_cache_sentinel")) { t0 = () => ; @@ -49,4 +50,6 @@ export const FIXTURE_ENTRYPOINT = { }; ``` - \ No newline at end of file + +### Eval output +(kind: ok)
4
\ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/bug-jsx-memberexpr-tag-in-lambda.js b/compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/jsx-memberexpr-tag-in-lambda.js similarity index 100% rename from compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/bug-jsx-memberexpr-tag-in-lambda.js rename to compiler/packages/babel-plugin-react-forget/src/__tests__/fixtures/compiler/jsx-memberexpr-tag-in-lambda.js