Skip to content

Commit

Permalink
Fix suspense replaying forward refs (#26535)
Browse files Browse the repository at this point in the history
Continuation of #26420

Fixes #26385 and
#26419

---------

Co-authored-by: eps1lon <silbermann.sebastian@gmail.com>
Co-authored-by: Andrew Clark <git@andrewclark.io>

DiffTrain build for commit 7329ea8.
  • Loading branch information
acdlite committed Apr 2, 2023
1 parent de3e5f9 commit 44c0913
Show file tree
Hide file tree
Showing 13 changed files with 340 additions and 247 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11354,26 +11354,20 @@ function replayFunctionComponent(
workInProgress,
nextProps,
Component,
secondArg,
renderLanes
) {
// This function is used to replay a component that previously suspended,
// after its data resolves. It's a simplified version of
// updateFunctionComponent that reuses the hooks from the previous attempt.
var context;

{
var unmaskedContext = getUnmaskedContext(workInProgress, Component, true);
context = getMaskedContext(workInProgress, unmaskedContext);
}

prepareToReadContext(workInProgress, renderLanes);

var nextChildren = replaySuspendedComponentWithHooks(
current,
workInProgress,
Component,
nextProps,
context
secondArg
);

if (current !== null && !didReceiveUpdate) {
Expand Down Expand Up @@ -21407,8 +21401,8 @@ function replaySuspendedUnitOfWork(unitOfWork) {
}
// eslint-disable-next-line no-fallthrough

case FunctionComponent:
case ForwardRef: {
case SimpleMemoComponent:
case FunctionComponent: {
// Resolve `defaultProps`. This logic is copied from `beginWork`.
// TODO: Consider moving this switch statement into that module. Also,
// could maybe use this as an opportunity to say `use` doesn't work with
Expand All @@ -21419,24 +21413,43 @@ function replaySuspendedUnitOfWork(unitOfWork) {
unitOfWork.elementType === Component
? unresolvedProps
: resolveDefaultProps(Component, unresolvedProps);
var context;

{
var unmaskedContext = getUnmaskedContext(unitOfWork, Component, true);
context = getMaskedContext(unitOfWork, unmaskedContext);
}

next = replayFunctionComponent(
current,
unitOfWork,
resolvedProps,
Component,
context,
workInProgressRootRenderLanes
);
break;
}

case SimpleMemoComponent: {
var _Component = unitOfWork.type;
var nextProps = unitOfWork.pendingProps;
case ForwardRef: {
// Resolve `defaultProps`. This logic is copied from `beginWork`.
// TODO: Consider moving this switch statement into that module. Also,
// could maybe use this as an opportunity to say `use` doesn't work with
// `defaultProps` :)
var _Component = unitOfWork.type.render;
var _unresolvedProps = unitOfWork.pendingProps;

var _resolvedProps =
unitOfWork.elementType === _Component
? _unresolvedProps
: resolveDefaultProps(_Component, _unresolvedProps);

next = replayFunctionComponent(
current,
unitOfWork,
nextProps,
_resolvedProps,
_Component,
unitOfWork.ref,
workInProgressRootRenderLanes
);
break;
Expand Down Expand Up @@ -23869,7 +23882,7 @@ function createFiberRoot(
return root;
}

var ReactVersion = "18.3.0-next-0ae348018-20230331";
var ReactVersion = "18.3.0-next-7329ea81c-20230402";

// Might add PROFILE later.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3249,18 +3249,15 @@ function replayFunctionComponent(
workInProgress,
nextProps,
Component,
secondArg,
renderLanes
) {
var context = isContextProvider(Component)
? previousContext
: contextStackCursor$1.current;
context = getMaskedContext(workInProgress, context);
prepareToReadContext(workInProgress, renderLanes);
nextProps = renderWithHooksAgain(
workInProgress,
Component,
nextProps,
context
secondArg
);
finishRenderingHooks();
if (null !== current && !didReceiveUpdate)
Expand Down Expand Up @@ -7017,28 +7014,40 @@ function replaySuspendedUnitOfWork(unitOfWork) {
switch (unitOfWork.tag) {
case 2:
unitOfWork.tag = 0;
case 15:
case 0:
case 11:
var Component = unitOfWork.type,
unresolvedProps = unitOfWork.pendingProps;
unresolvedProps =
unitOfWork.elementType === Component
? unresolvedProps
: resolveDefaultProps(Component, unresolvedProps);
var context = isContextProvider(Component)
? previousContext
: contextStackCursor$1.current;
context = getMaskedContext(unitOfWork, context);
current = replayFunctionComponent(
current,
unitOfWork,
unresolvedProps,
Component,
context,
workInProgressRootRenderLanes
);
break;
case 15:
case 11:
Component = unitOfWork.type.render;
unresolvedProps = unitOfWork.pendingProps;
unresolvedProps =
unitOfWork.elementType === Component
? unresolvedProps
: resolveDefaultProps(Component, unresolvedProps);
current = replayFunctionComponent(
current,
unitOfWork,
unitOfWork.pendingProps,
unitOfWork.type,
unresolvedProps,
Component,
unitOfWork.ref,
workInProgressRootRenderLanes
);
break;
Expand Down Expand Up @@ -8669,19 +8678,19 @@ function wrapFiber(fiber) {
fiberToWrapper.set(fiber, wrapper));
return wrapper;
}
var devToolsConfig$jscomp$inline_1026 = {
var devToolsConfig$jscomp$inline_1028 = {
findFiberByHostInstance: function () {
throw Error("TestRenderer does not support findFiberByHostInstance()");
},
bundleType: 0,
version: "18.3.0-next-0ae348018-20230331",
version: "18.3.0-next-7329ea81c-20230402",
rendererPackageName: "react-test-renderer"
};
var internals$jscomp$inline_1218 = {
bundleType: devToolsConfig$jscomp$inline_1026.bundleType,
version: devToolsConfig$jscomp$inline_1026.version,
rendererPackageName: devToolsConfig$jscomp$inline_1026.rendererPackageName,
rendererConfig: devToolsConfig$jscomp$inline_1026.rendererConfig,
var internals$jscomp$inline_1220 = {
bundleType: devToolsConfig$jscomp$inline_1028.bundleType,
version: devToolsConfig$jscomp$inline_1028.version,
rendererPackageName: devToolsConfig$jscomp$inline_1028.rendererPackageName,
rendererConfig: devToolsConfig$jscomp$inline_1028.rendererConfig,
overrideHookState: null,
overrideHookStateDeletePath: null,
overrideHookStateRenamePath: null,
Expand All @@ -8698,26 +8707,26 @@ var internals$jscomp$inline_1218 = {
return null === fiber ? null : fiber.stateNode;
},
findFiberByHostInstance:
devToolsConfig$jscomp$inline_1026.findFiberByHostInstance ||
devToolsConfig$jscomp$inline_1028.findFiberByHostInstance ||
emptyFindFiberByHostInstance,
findHostInstancesForRefresh: null,
scheduleRefresh: null,
scheduleRoot: null,
setRefreshHandler: null,
getCurrentFiber: null,
reconcilerVersion: "18.3.0-next-0ae348018-20230331"
reconcilerVersion: "18.3.0-next-7329ea81c-20230402"
};
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
var hook$jscomp$inline_1219 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
var hook$jscomp$inline_1221 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
if (
!hook$jscomp$inline_1219.isDisabled &&
hook$jscomp$inline_1219.supportsFiber
!hook$jscomp$inline_1221.isDisabled &&
hook$jscomp$inline_1221.supportsFiber
)
try {
(rendererID = hook$jscomp$inline_1219.inject(
internals$jscomp$inline_1218
(rendererID = hook$jscomp$inline_1221.inject(
internals$jscomp$inline_1220
)),
(injectedHook = hook$jscomp$inline_1219);
(injectedHook = hook$jscomp$inline_1221);
} catch (err) {}
}
exports._Scheduler = Scheduler;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3329,18 +3329,15 @@ function replayFunctionComponent(
workInProgress,
nextProps,
Component,
secondArg,
renderLanes
) {
var context = isContextProvider(Component)
? previousContext
: contextStackCursor$1.current;
context = getMaskedContext(workInProgress, context);
prepareToReadContext(workInProgress, renderLanes);
nextProps = renderWithHooksAgain(
workInProgress,
Component,
nextProps,
context
secondArg
);
finishRenderingHooks();
if (null !== current && !didReceiveUpdate)
Expand Down Expand Up @@ -7367,28 +7364,40 @@ function replaySuspendedUnitOfWork(unitOfWork) {
switch (unitOfWork.tag) {
case 2:
unitOfWork.tag = 0;
case 15:
case 0:
case 11:
var Component = unitOfWork.type,
unresolvedProps = unitOfWork.pendingProps;
unresolvedProps =
unitOfWork.elementType === Component
? unresolvedProps
: resolveDefaultProps(Component, unresolvedProps);
var context = isContextProvider(Component)
? previousContext
: contextStackCursor$1.current;
context = getMaskedContext(unitOfWork, context);
current = replayFunctionComponent(
current,
unitOfWork,
unresolvedProps,
Component,
context,
workInProgressRootRenderLanes
);
break;
case 15:
case 11:
Component = unitOfWork.type.render;
unresolvedProps = unitOfWork.pendingProps;
unresolvedProps =
unitOfWork.elementType === Component
? unresolvedProps
: resolveDefaultProps(Component, unresolvedProps);
current = replayFunctionComponent(
current,
unitOfWork,
unitOfWork.pendingProps,
unitOfWork.type,
unresolvedProps,
Component,
unitOfWork.ref,
workInProgressRootRenderLanes
);
break;
Expand Down Expand Up @@ -9094,19 +9103,19 @@ function wrapFiber(fiber) {
fiberToWrapper.set(fiber, wrapper));
return wrapper;
}
var devToolsConfig$jscomp$inline_1068 = {
var devToolsConfig$jscomp$inline_1070 = {
findFiberByHostInstance: function () {
throw Error("TestRenderer does not support findFiberByHostInstance()");
},
bundleType: 0,
version: "18.3.0-next-0ae348018-20230331",
version: "18.3.0-next-7329ea81c-20230402",
rendererPackageName: "react-test-renderer"
};
var internals$jscomp$inline_1259 = {
bundleType: devToolsConfig$jscomp$inline_1068.bundleType,
version: devToolsConfig$jscomp$inline_1068.version,
rendererPackageName: devToolsConfig$jscomp$inline_1068.rendererPackageName,
rendererConfig: devToolsConfig$jscomp$inline_1068.rendererConfig,
var internals$jscomp$inline_1261 = {
bundleType: devToolsConfig$jscomp$inline_1070.bundleType,
version: devToolsConfig$jscomp$inline_1070.version,
rendererPackageName: devToolsConfig$jscomp$inline_1070.rendererPackageName,
rendererConfig: devToolsConfig$jscomp$inline_1070.rendererConfig,
overrideHookState: null,
overrideHookStateDeletePath: null,
overrideHookStateRenamePath: null,
Expand All @@ -9123,26 +9132,26 @@ var internals$jscomp$inline_1259 = {
return null === fiber ? null : fiber.stateNode;
},
findFiberByHostInstance:
devToolsConfig$jscomp$inline_1068.findFiberByHostInstance ||
devToolsConfig$jscomp$inline_1070.findFiberByHostInstance ||
emptyFindFiberByHostInstance,
findHostInstancesForRefresh: null,
scheduleRefresh: null,
scheduleRoot: null,
setRefreshHandler: null,
getCurrentFiber: null,
reconcilerVersion: "18.3.0-next-0ae348018-20230331"
reconcilerVersion: "18.3.0-next-7329ea81c-20230402"
};
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
var hook$jscomp$inline_1260 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
var hook$jscomp$inline_1262 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
if (
!hook$jscomp$inline_1260.isDisabled &&
hook$jscomp$inline_1260.supportsFiber
!hook$jscomp$inline_1262.isDisabled &&
hook$jscomp$inline_1262.supportsFiber
)
try {
(rendererID = hook$jscomp$inline_1260.inject(
internals$jscomp$inline_1259
(rendererID = hook$jscomp$inline_1262.inject(
internals$jscomp$inline_1261
)),
(injectedHook = hook$jscomp$inline_1260);
(injectedHook = hook$jscomp$inline_1262);
} catch (err) {}
}
exports._Scheduler = Scheduler;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ if (
}
"use strict";

var ReactVersion = "18.3.0-next-0ae348018-20230331";
var ReactVersion = "18.3.0-next-7329ea81c-20230402";

// ATTENTION
// When adding new symbols to this file,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -639,4 +639,4 @@ exports.useSyncExternalStore = function (
);
};
exports.useTransition = useTransition;
exports.version = "18.3.0-next-0ae348018-20230331";
exports.version = "18.3.0-next-7329ea81c-20230402";
Original file line number Diff line number Diff line change
Expand Up @@ -642,7 +642,7 @@ exports.useSyncExternalStore = function (
);
};
exports.useTransition = useTransition;
exports.version = "18.3.0-next-0ae348018-20230331";
exports.version = "18.3.0-next-7329ea81c-20230402";

/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
if (
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0ae348018d5b3a3f1ccdd92de85d9cc581b2b98d
7329ea81c154d40800e30104be40f050e8c2af3e
Loading

0 comments on commit 44c0913

Please sign in to comment.