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%