@samitouri / QOS-React-2 / commits / 9c3de25e1c

Flow: types first in reconciler (#25362)

This contains one code change, renaming the local function `ChildReconciler` to `createChildReconciler` as it's called as a function, not a constructor and to free up the name for the return value.

Jan Kassens committed Oct 1, 2022 at 18:47 UTC 9c3de25e1ce52066c0518b3ca0803b69e684edd6
13 files changed +118 -59
packages/react-reconciler/src/ReactChildFiber.new.js
+12 -3
@@ -264,11 +264,18 @@ function resolveLazy(lazyType) {
264 return init(payload);
265 }
266
267 +type ChildReconciler = (
268 + returnFiber: Fiber,
269 + currentFirstChild: Fiber | null,
270 + newChild: any,
271 + lanes: Lanes,
272 +) => Fiber | null;
273 +
274 // This wrapper function exists because I expect to clone the code in each path
275 // to be able to optimize each path individually by branching early. This needs
276 // a compiler or we can do it manually. Helpers that don't need this branching
277 // live outside of this function.
271 -function ChildReconciler(shouldTrackSideEffects) {
278 +function createChildReconciler(shouldTrackSideEffects): ChildReconciler {
279 function deleteChild(returnFiber: Fiber, childToDelete: Fiber): void {
280 if (!shouldTrackSideEffects) {
281 // Noop.
@@ -1352,8 +1359,10 @@ function ChildReconciler(shouldTrackSideEffects) {
1359 return reconcileChildFibers;
1360 }
1361
1355 -export const reconcileChildFibers = ChildReconciler(true);
1356 -export const mountChildFibers = ChildReconciler(false);
1362 +export const reconcileChildFibers: ChildReconciler = createChildReconciler(
1363 + true,
1364 +);
1365 +export const mountChildFibers: ChildReconciler = createChildReconciler(false);
1366
1367 export function cloneChildFibers(
1368 current: Fiber | null,
packages/react-reconciler/src/ReactChildFiber.old.js
+12 -3
@@ -264,11 +264,18 @@ function resolveLazy(lazyType) {
264 return init(payload);
265 }
266
267 +type ChildReconciler = (
268 + returnFiber: Fiber,
269 + currentFirstChild: Fiber | null,
270 + newChild: any,
271 + lanes: Lanes,
272 +) => Fiber | null;
273 +
274 // This wrapper function exists because I expect to clone the code in each path
275 // to be able to optimize each path individually by branching early. This needs
276 // a compiler or we can do it manually. Helpers that don't need this branching
277 // live outside of this function.
271 -function ChildReconciler(shouldTrackSideEffects) {
278 +function createChildReconciler(shouldTrackSideEffects): ChildReconciler {
279 function deleteChild(returnFiber: Fiber, childToDelete: Fiber): void {
280 if (!shouldTrackSideEffects) {
281 // Noop.
@@ -1352,8 +1359,10 @@ function ChildReconciler(shouldTrackSideEffects) {
1359 return reconcileChildFibers;
1360 }
1361
1355 -export const reconcileChildFibers = ChildReconciler(true);
1356 -export const mountChildFibers = ChildReconciler(false);
1362 +export const reconcileChildFibers: ChildReconciler = createChildReconciler(
1363 + true,
1364 +);
1365 +export const mountChildFibers: ChildReconciler = createChildReconciler(false);
1366
1367 export function cloneChildFibers(
1368 current: Fiber | null,
packages/react-reconciler/src/ReactFiberClassComponent.new.js
+1 -1
@@ -83,7 +83,7 @@ const fakeInternalInstance = {};
83
84 // React.Component uses a shared frozen object by default.
85 // We'll use it to determine whether we need to initialize legacy refs.
86 -export const emptyRefsObject = new React.Component().refs;
86 +export const emptyRefsObject: $FlowFixMe = new React.Component().refs;
87
88 let didWarnAboutStateAssignmentForComponent;
89 let didWarnAboutUninitializedState;
packages/react-reconciler/src/ReactFiberClassComponent.old.js
+1 -1
@@ -83,7 +83,7 @@ const fakeInternalInstance = {};
83
84 // React.Component uses a shared frozen object by default.
85 // We'll use it to determine whether we need to initialize legacy refs.
86 -export const emptyRefsObject = new React.Component().refs;
86 +export const emptyRefsObject: $FlowFixMe = new React.Component().refs;
87
88 let didWarnAboutStateAssignmentForComponent;
89 let didWarnAboutUninitializedState;
packages/react-reconciler/src/ReactFiberContext.new.js
+2 -1
@@ -24,7 +24,8 @@ if (__DEV__) {
24 warnedAboutMissingGetChildContext = {};
25 }
26
27 -export const emptyContextObject = {};
27 +// $FlowFixMe[incompatible-exact]
28 +export const emptyContextObject: {} = {};
29 if (__DEV__) {
30 Object.freeze(emptyContextObject);
31 }
packages/react-reconciler/src/ReactFiberContext.old.js
+2 -1
@@ -24,7 +24,8 @@ if (__DEV__) {
24 warnedAboutMissingGetChildContext = {};
25 }
26
27 -export const emptyContextObject = {};
27 +// $FlowFixMe[incompatible-exact]
28 +export const emptyContextObject: {} = {};
29 if (__DEV__) {
30 Object.freeze(emptyContextObject);
31 }
packages/react-reconciler/src/ReactFiberHotReloading.js
+3 -3
@@ -63,13 +63,13 @@ export type FindHostInstancesForRefresh = (
63 export const setRefreshHandler: (
64 handler: RefreshHandler | null,
65 ) => void = enableNewReconciler ? setRefreshHandler_new : setRefreshHandler_old;
66 -export const resolveFunctionForHotReloading = enableNewReconciler
66 +export const resolveFunctionForHotReloading: typeof resolveFunctionForHotReloading_new = enableNewReconciler
67 ? resolveFunctionForHotReloading_new
68 : resolveFunctionForHotReloading_old;
69 -export const resolveClassForHotReloading = enableNewReconciler
69 +export const resolveClassForHotReloading: typeof resolveClassForHotReloading_new = enableNewReconciler
70 ? resolveClassForHotReloading_new
71 : resolveClassForHotReloading_old;
72 -export const resolveForwardRefForHotReloading = enableNewReconciler
72 +export const resolveForwardRefForHotReloading: typeof resolveForwardRefForHotReloading_new = enableNewReconciler
73 ? resolveForwardRefForHotReloading_new
74 : resolveForwardRefForHotReloading_old;
75 export const isCompatibleFamilyForHotReloading: (
packages/react-reconciler/src/ReactFiberReconciler.js
+42 -36
@@ -90,107 +90,113 @@ import {
90 getCurrentUpdatePriority as getCurrentUpdatePriority_new,
91 } from './ReactFiberReconciler.new';
92
93 -export const createContainer = enableNewReconciler
93 +export const createContainer: typeof createContainer_new = enableNewReconciler
94 ? createContainer_new
95 : createContainer_old;
96 -export const createHydrationContainer = enableNewReconciler
96 +export const createHydrationContainer: typeof createHydrationContainer_new = enableNewReconciler
97 ? createHydrationContainer_new
98 : createHydrationContainer_old;
99 -export const updateContainer = enableNewReconciler
99 +export const updateContainer: typeof updateContainer_new = enableNewReconciler
100 ? updateContainer_new
101 : updateContainer_old;
102 -export const batchedUpdates = enableNewReconciler
102 +export const batchedUpdates: typeof batchedUpdates_new = enableNewReconciler
103 ? batchedUpdates_new
104 : batchedUpdates_old;
105 -export const deferredUpdates = enableNewReconciler
105 +export const deferredUpdates: typeof deferredUpdates_new = enableNewReconciler
106 ? deferredUpdates_new
107 : deferredUpdates_old;
108 -export const discreteUpdates = enableNewReconciler
108 +export const discreteUpdates: typeof discreteUpdates_new = enableNewReconciler
109 ? discreteUpdates_new
110 : discreteUpdates_old;
111 -export const flushControlled = enableNewReconciler
111 +export const flushControlled: typeof flushControlled_new = enableNewReconciler
112 ? flushControlled_new
113 : flushControlled_old;
114 -export const flushSync = enableNewReconciler ? flushSync_new : flushSync_old;
115 -export const isAlreadyRendering = enableNewReconciler
114 +export const flushSync: typeof flushSync_new = enableNewReconciler
115 + ? flushSync_new
116 + : flushSync_old;
117 +export const isAlreadyRendering: typeof isAlreadyRendering_new = enableNewReconciler
118 ? isAlreadyRendering_new
119 : isAlreadyRendering_old;
118 -export const flushPassiveEffects = enableNewReconciler
120 +export const flushPassiveEffects: typeof flushPassiveEffects_new = enableNewReconciler
121 ? flushPassiveEffects_new
122 : flushPassiveEffects_old;
121 -export const getPublicRootInstance = enableNewReconciler
123 +export const getPublicRootInstance: typeof getPublicRootInstance_new = enableNewReconciler
124 ? getPublicRootInstance_new
125 : getPublicRootInstance_old;
124 -export const attemptSynchronousHydration = enableNewReconciler
126 +export const attemptSynchronousHydration: typeof attemptSynchronousHydration_new = enableNewReconciler
127 ? attemptSynchronousHydration_new
128 : attemptSynchronousHydration_old;
127 -export const attemptDiscreteHydration = enableNewReconciler
129 +export const attemptDiscreteHydration: typeof attemptDiscreteHydration_new = enableNewReconciler
130 ? attemptDiscreteHydration_new
131 : attemptDiscreteHydration_old;
130 -export const attemptContinuousHydration = enableNewReconciler
132 +export const attemptContinuousHydration: typeof attemptContinuousHydration_new = enableNewReconciler
133 ? attemptContinuousHydration_new
134 : attemptContinuousHydration_old;
133 -export const attemptHydrationAtCurrentPriority = enableNewReconciler
135 +export const attemptHydrationAtCurrentPriority: typeof attemptHydrationAtCurrentPriority_new = enableNewReconciler
136 ? attemptHydrationAtCurrentPriority_new
137 : attemptHydrationAtCurrentPriority_old;
136 -export const getCurrentUpdatePriority = enableNewReconciler
138 +export const getCurrentUpdatePriority: typeof getCurrentUpdatePriority_new = enableNewReconciler
139 ? getCurrentUpdatePriority_new
138 - : getCurrentUpdatePriority_old;
139 -export const findHostInstance = enableNewReconciler
140 + : /* $FlowFixMe[incompatible-type] opaque types EventPriority from new and old
141 + * are incompatible. */
142 + getCurrentUpdatePriority_old;
143 +export const findHostInstance: typeof findHostInstance_new = enableNewReconciler
144 ? findHostInstance_new
145 : findHostInstance_old;
142 -export const findHostInstanceWithWarning = enableNewReconciler
146 +export const findHostInstanceWithWarning: typeof findHostInstanceWithWarning_new = enableNewReconciler
147 ? findHostInstanceWithWarning_new
148 : findHostInstanceWithWarning_old;
145 -export const findHostInstanceWithNoPortals = enableNewReconciler
149 +export const findHostInstanceWithNoPortals: typeof findHostInstanceWithNoPortals_new = enableNewReconciler
150 ? findHostInstanceWithNoPortals_new
151 : findHostInstanceWithNoPortals_old;
148 -export const shouldError = enableNewReconciler
152 +export const shouldError: typeof shouldError_new = enableNewReconciler
153 ? shouldError_new
154 : shouldError_old;
151 -export const shouldSuspend = enableNewReconciler
155 +export const shouldSuspend: typeof shouldSuspend_new = enableNewReconciler
156 ? shouldSuspend_new
157 : shouldSuspend_old;
154 -export const injectIntoDevTools = enableNewReconciler
158 +export const injectIntoDevTools: typeof injectIntoDevTools_new = enableNewReconciler
159 ? injectIntoDevTools_new
160 : injectIntoDevTools_old;
157 -export const createPortal = enableNewReconciler
161 +export const createPortal: typeof createPortal_new = enableNewReconciler
162 ? createPortal_new
163 : createPortal_old;
160 -export const createComponentSelector = enableNewReconciler
164 +export const createComponentSelector: typeof createComponentSelector_new = enableNewReconciler
165 ? createComponentSelector_new
166 : createComponentSelector_old;
167
164 -export const createHasPseudoClassSelector = enableNewReconciler
168 +export const createHasPseudoClassSelector: typeof createHasPseudoClassSelector_new = enableNewReconciler
169 ? createHasPseudoClassSelector_new
170 : createHasPseudoClassSelector_old;
167 -export const createRoleSelector = enableNewReconciler
171 +export const createRoleSelector: typeof createRoleSelector_new = enableNewReconciler
172 ? createRoleSelector_new
173 : createRoleSelector_old;
170 -export const createTextSelector = enableNewReconciler
174 +export const createTextSelector: typeof createTextSelector_new = enableNewReconciler
175 ? createTextSelector_new
176 : createTextSelector_old;
173 -export const createTestNameSelector = enableNewReconciler
177 +export const createTestNameSelector: typeof createTestNameSelector_new = enableNewReconciler
178 ? createTestNameSelector_new
179 : createTestNameSelector_old;
176 -export const getFindAllNodesFailureDescription = enableNewReconciler
180 +export const getFindAllNodesFailureDescription: typeof getFindAllNodesFailureDescription_new = enableNewReconciler
181 ? getFindAllNodesFailureDescription_new
182 : getFindAllNodesFailureDescription_old;
179 -export const findAllNodes = enableNewReconciler
183 +export const findAllNodes: typeof findAllNodes_new = enableNewReconciler
184 ? findAllNodes_new
185 : findAllNodes_old;
182 -export const findBoundingRects = enableNewReconciler
186 +export const findBoundingRects: typeof findBoundingRects_new = enableNewReconciler
187 ? findBoundingRects_new
188 : findBoundingRects_old;
185 -export const focusWithin = enableNewReconciler
189 +export const focusWithin: typeof focusWithin_new = enableNewReconciler
190 ? focusWithin_new
191 : focusWithin_old;
188 -export const observeVisibleRects = enableNewReconciler
192 +export const observeVisibleRects: typeof observeVisibleRects_new = enableNewReconciler
193 ? observeVisibleRects_new
194 : observeVisibleRects_old;
191 -export const registerMutableSourceForHydration = enableNewReconciler
195 +export const registerMutableSourceForHydration: typeof registerMutableSourceForHydration_new = enableNewReconciler
196 ? registerMutableSourceForHydration_new
197 : registerMutableSourceForHydration_old;
194 -export const runWithPriority = enableNewReconciler
198 +/* $FlowFixMe[incompatible-type] opaque types EventPriority from new and old
199 + * are incompatible. */
200 +export const runWithPriority: typeof runWithPriority_new = enableNewReconciler
201 ? runWithPriority_new
202 : runWithPriority_old;
packages/react-reconciler/src/ReactFiberUnwindWork.new.js
+1 -1
@@ -63,7 +63,7 @@ function unwindWork(
63 current: Fiber | null,
64 workInProgress: Fiber,
65 renderLanes: Lanes,
66 -) {
66 +): Fiber | null {
67 // Note: This intentionally doesn't check if we're hydrating because comparing
68 // to the current tree provider fiber is just as fast and less error-prone.
69 // Ideally we would have a special version of the work loop only
packages/react-reconciler/src/ReactFiberUnwindWork.old.js
+1 -1
@@ -63,7 +63,7 @@ function unwindWork(
63 current: Fiber | null,
64 workInProgress: Fiber,
65 renderLanes: Lanes,
66 -) {
66 +): Fiber | null {
67 // Note: This intentionally doesn't check if we're hydrating because comparing
68 // to the current tree provider fiber is just as fast and less error-prone.
69 // Ideally we would have a special version of the work loop only
packages/react-reconciler/src/ReactFiberWorkLoop.new.js
+4 -4
@@ -580,7 +580,7 @@ export function getWorkInProgressRootRenderLanes(): Lanes {
580 return workInProgressRootRenderLanes;
581 }
582
583 -export function requestEventTime() {
583 +export function requestEventTime(): number {
584 if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
585 // We're inside React, so it's fine to read the actual time.
586 return now();
@@ -595,7 +595,7 @@ export function requestEventTime() {
595 return currentEventTime;
596 }
597
598 -export function getCurrentTime() {
598 +export function getCurrentTime(): number {
599 return now();
600 }
601
@@ -1567,7 +1567,7 @@ declare function flushSync<R>(fn: () => R): R;
1567 // eslint-disable-next-line no-redeclare
1568 declare function flushSync(): void;
1569 // eslint-disable-next-line no-redeclare
1570 -export function flushSync(fn): void {
1570 +export function flushSync<R>(fn: (() => R) | void): R | void {
1571 // In legacy mode, we flush pending passive effects at the beginning of the
1572 // next event, not at the end of the previous one.
1573 if (
@@ -1615,7 +1615,7 @@ export function isAlreadyRendering(): boolean {
1615 );
1616 }
1617
1618 -export function isInvalidExecutionContextForEventFunction() {
1618 +export function isInvalidExecutionContextForEventFunction(): boolean {
1619 // Used to throw if certain APIs are called from the wrong context.
1620 return (executionContext & RenderContext) !== NoContext;
1621 }
packages/react-reconciler/src/ReactFiberWorkLoop.old.js
+4 -4
@@ -580,7 +580,7 @@ export function getWorkInProgressRootRenderLanes(): Lanes {
580 return workInProgressRootRenderLanes;
581 }
582
583 -export function requestEventTime() {
583 +export function requestEventTime(): number {
584 if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
585 // We're inside React, so it's fine to read the actual time.
586 return now();
@@ -595,7 +595,7 @@ export function requestEventTime() {
595 return currentEventTime;
596 }
597
598 -export function getCurrentTime() {
598 +export function getCurrentTime(): number {
599 return now();
600 }
601
@@ -1567,7 +1567,7 @@ declare function flushSync<R>(fn: () => R): R;
1567 // eslint-disable-next-line no-redeclare
1568 declare function flushSync(): void;
1569 // eslint-disable-next-line no-redeclare
1570 -export function flushSync(fn): void {
1570 +export function flushSync<R>(fn: (() => R) | void): R | void {
1571 // In legacy mode, we flush pending passive effects at the beginning of the
1572 // next event, not at the end of the previous one.
1573 if (
@@ -1615,7 +1615,7 @@ export function isAlreadyRendering(): boolean {
1615 );
1616 }
1617
1618 -export function isInvalidExecutionContextForEventFunction() {
1618 +export function isInvalidExecutionContextForEventFunction(): boolean {
1619 // Used to throw if certain APIs are called from the wrong context.
1620 return (executionContext & RenderContext) !== NoContext;
1621 }
scripts/flow/config/flowconfig
+33
@@ -48,10 +48,43 @@ munge_underscores=false
48 types_first=false
49
50 well_formed_exports=true
51 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/dom-event-testing-library
52 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/eslint-plugin-react-hooks
53 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/jest-mock-scheduler
54 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/jest-react
55 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react
56 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-art
57 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-cache
58 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-client
59 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-debug-tools
60 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-devtools
61 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-devtools-core
62 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-devtools-extensions
63 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-devtools-inline
64 well_formed_exports.includes=<PROJECT_ROOT>/packages/react-devtools-shared
65 well_formed_exports.includes=<PROJECT_ROOT>/packages/react-devtools-shell
66 well_formed_exports.includes=<PROJECT_ROOT>/packages/react-devtools-timeline
67 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-dom
68 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-dom-bindings
69 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-fetch
70 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-fs
71 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-interactions
72 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-is
73 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-native-renderer
74 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-noop-renderer
75 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-pg
76 +well_formed_exports.includes=<PROJECT_ROOT>/packages/react-reconciler
77 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-refresh
78 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-server
79 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-server-dom-relay
80 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-server-dom-webpack
81 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-server-native-relay
82 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-suspense-test-utils
83 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/react-test-renderer
84 well_formed_exports.includes=<PROJECT_ROOT>/packages/scheduler
85 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/shared
86 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/use-subscription
87 +; well_formed_exports.includes=<PROJECT_ROOT>/packages/use-sync-external-store
88
89 # Substituted by createFlowConfig.js:
90 %REACT_RENDERER_FLOW_OPTIONS%