Skip to content

Commit 144328f

Browse files
authored
Enable no-use-before-define rule (#13606)
1 parent 8a8d973 commit 144328f

File tree

9 files changed

+109
-94
lines changed

9 files changed

+109
-94
lines changed

.eslintrc.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ module.exports = {
3737
'no-shadow': ERROR,
3838
'no-unused-expressions': ERROR,
3939
'no-unused-vars': [ERROR, {args: 'none'}],
40+
'no-use-before-define': [ERROR, {functions: false, variables: false}],
4041
'no-useless-concat': OFF,
4142
'quotes': [ERROR, 'single', {avoidEscape: true, allowTemplateLiterals: true }],
4243
'space-before-blocks': ERROR,

packages/react-dom/src/client/ReactDOM.js

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ if (__DEV__) {
126126

127127
ReactControlledComponent.setRestoreImplementation(restoreControlledState);
128128

129+
/* eslint-disable no-use-before-define */
129130
type DOMContainer =
130131
| (Element & {
131132
_reactRootContainer: ?Root,
@@ -150,6 +151,20 @@ type Batch = FiberRootBatch & {
150151
_didComplete: boolean,
151152
};
152153

154+
type Root = {
155+
render(children: ReactNodeList, callback: ?() => mixed): Work,
156+
unmount(callback: ?() => mixed): Work,
157+
legacy_renderSubtreeIntoContainer(
158+
parentComponent: ?React$Component<any, any>,
159+
children: ReactNodeList,
160+
callback: ?() => mixed,
161+
): Work,
162+
createBatch(): Batch,
163+
164+
_internalRoot: FiberRoot,
165+
};
166+
/* eslint-enable no-use-before-define */
167+
153168
function ReactBatch(root: ReactRoot) {
154169
const expirationTime = DOMRenderer.computeUniqueAsyncExpiration();
155170
this._expirationTime = expirationTime;
@@ -317,19 +332,6 @@ ReactWork.prototype._onCommit = function(): void {
317332
}
318333
};
319334

320-
type Root = {
321-
render(children: ReactNodeList, callback: ?() => mixed): Work,
322-
unmount(callback: ?() => mixed): Work,
323-
legacy_renderSubtreeIntoContainer(
324-
parentComponent: ?React$Component<any, any>,
325-
children: ReactNodeList,
326-
callback: ?() => mixed,
327-
): Work,
328-
createBatch(): Batch,
329-
330-
_internalRoot: FiberRoot,
331-
};
332-
333335
function ReactRoot(container: Container, isAsync: boolean, hydrate: boolean) {
334336
const root = DOMRenderer.createContainer(container, isAsync, hydrate);
335337
this._internalRoot = root;

packages/react-native-renderer/src/ReactFabricHostConfig.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import UIManager from 'UIManager';
5050
// This means that they never overlap.
5151
let nextReactTag = 2;
5252

53+
/* eslint-disable no-use-before-define */
5354
type Node = Object;
5455
export type Type = string;
5556
export type Props = Object;
@@ -71,6 +72,7 @@ export type UpdatePayload = Object;
7172

7273
export type TimeoutHandle = TimeoutID;
7374
export type NoTimeout = -1;
75+
/* eslint-enable no-use-before-define */
7476

7577
// TODO: Remove this conditional once all changes have propagated.
7678
if (registerEventHandler) {

packages/react-noop-renderer/src/createReactNoop.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import type {ReactNodeList} from 'shared/ReactTypes';
2121
import * as ReactPortal from 'shared/ReactPortal';
2222
import expect from 'expect';
2323

24+
/* eslint-disable no-use-before-define */
2425
type Container = {rootID: string, children: Array<Instance | TextInstance>};
2526
type Props = {prop: any, hidden?: boolean, children?: mixed};
2627
type Instance = {|
@@ -30,6 +31,7 @@ type Instance = {|
3031
prop: any,
3132
|};
3233
type TextInstance = {|text: string, id: number|};
34+
/* eslint-enable no-use-before-define */
3335

3436
const NO_CONTEXT = {};
3537
const UPDATE_SIGNAL = {};

packages/react-reconciler/src/ReactFiberRoot.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {NoWork} from './ReactFiberExpirationTime';
1818
import {enableSchedulerTracking} from 'shared/ReactFeatureFlags';
1919
import {unstable_getThreadID} from 'schedule/tracking';
2020

21+
/* eslint-disable no-use-before-define */
2122
// TODO: This should be lifted into the renderer.
2223
export type Batch = {
2324
_defer: boolean,
@@ -98,6 +99,7 @@ export type FiberRoot = {
9899
...BaseFiberRootProperties,
99100
...ProfilingOnlyFiberRootProperties,
100101
};
102+
/* eslint-enable no-use-before-define */
101103

102104
export function createFiberRoot(
103105
containerInfo: any,

packages/react-test-renderer/src/ReactShallowRenderer.js

Lines changed: 66 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,72 @@ if (__DEV__) {
1919
Object.freeze(emptyObject);
2020
}
2121

22+
class Updater {
23+
constructor(renderer) {
24+
this._renderer = renderer;
25+
this._callbacks = [];
26+
}
27+
28+
_enqueueCallback(callback, publicInstance) {
29+
if (typeof callback === 'function' && publicInstance) {
30+
this._callbacks.push({
31+
callback,
32+
publicInstance,
33+
});
34+
}
35+
}
36+
37+
_invokeCallbacks() {
38+
const callbacks = this._callbacks;
39+
this._callbacks = [];
40+
41+
callbacks.forEach(({callback, publicInstance}) => {
42+
callback.call(publicInstance);
43+
});
44+
}
45+
46+
isMounted(publicInstance) {
47+
return !!this._renderer._element;
48+
}
49+
50+
enqueueForceUpdate(publicInstance, callback, callerName) {
51+
this._enqueueCallback(callback, publicInstance);
52+
this._renderer._forcedUpdate = true;
53+
this._renderer.render(this._renderer._element, this._renderer._context);
54+
}
55+
56+
enqueueReplaceState(publicInstance, completeState, callback, callerName) {
57+
this._enqueueCallback(callback, publicInstance);
58+
this._renderer._newState = completeState;
59+
this._renderer.render(this._renderer._element, this._renderer._context);
60+
}
61+
62+
enqueueSetState(publicInstance, partialState, callback, callerName) {
63+
this._enqueueCallback(callback, publicInstance);
64+
const currentState = this._renderer._newState || publicInstance.state;
65+
66+
if (typeof partialState === 'function') {
67+
partialState = partialState.call(
68+
publicInstance,
69+
currentState,
70+
publicInstance.props,
71+
);
72+
}
73+
74+
// Null and undefined are treated as no-ops.
75+
if (partialState === null || partialState === undefined) {
76+
return;
77+
}
78+
79+
this._renderer._newState = {
80+
...currentState,
81+
...partialState,
82+
};
83+
84+
this._renderer.render(this._renderer._element, this._renderer._context);
85+
}
86+
}
87+
2288
class ReactShallowRenderer {
2389
static createRenderer = function() {
2490
return new ReactShallowRenderer();
@@ -263,72 +329,6 @@ class ReactShallowRenderer {
263329
}
264330
}
265331

266-
class Updater {
267-
constructor(renderer) {
268-
this._renderer = renderer;
269-
this._callbacks = [];
270-
}
271-
272-
_enqueueCallback(callback, publicInstance) {
273-
if (typeof callback === 'function' && publicInstance) {
274-
this._callbacks.push({
275-
callback,
276-
publicInstance,
277-
});
278-
}
279-
}
280-
281-
_invokeCallbacks() {
282-
const callbacks = this._callbacks;
283-
this._callbacks = [];
284-
285-
callbacks.forEach(({callback, publicInstance}) => {
286-
callback.call(publicInstance);
287-
});
288-
}
289-
290-
isMounted(publicInstance) {
291-
return !!this._renderer._element;
292-
}
293-
294-
enqueueForceUpdate(publicInstance, callback, callerName) {
295-
this._enqueueCallback(callback, publicInstance);
296-
this._renderer._forcedUpdate = true;
297-
this._renderer.render(this._renderer._element, this._renderer._context);
298-
}
299-
300-
enqueueReplaceState(publicInstance, completeState, callback, callerName) {
301-
this._enqueueCallback(callback, publicInstance);
302-
this._renderer._newState = completeState;
303-
this._renderer.render(this._renderer._element, this._renderer._context);
304-
}
305-
306-
enqueueSetState(publicInstance, partialState, callback, callerName) {
307-
this._enqueueCallback(callback, publicInstance);
308-
const currentState = this._renderer._newState || publicInstance.state;
309-
310-
if (typeof partialState === 'function') {
311-
partialState = partialState.call(
312-
publicInstance,
313-
currentState,
314-
publicInstance.props,
315-
);
316-
}
317-
318-
// Null and undefined are treated as no-ops.
319-
if (partialState === null || partialState === undefined) {
320-
return;
321-
}
322-
323-
this._renderer._newState = {
324-
...currentState,
325-
...partialState,
326-
};
327-
328-
this._renderer.render(this._renderer._element, this._renderer._context);
329-
}
330-
}
331-
332332
let currentlyValidatingElement = null;
333333

334334
function getDisplayName(element) {

packages/react-test-renderer/src/ReactTestHostConfig.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import warning from 'shared/warning';
1111
import * as TestRendererScheduling from './ReactTestRendererScheduling';
1212

13+
/* eslint-disable no-use-before-define */
1314
export type Type = string;
1415
export type Props = Object;
1516
export type Container = {|
@@ -35,6 +36,7 @@ export type UpdatePayload = Object;
3536
export type ChildSet = void; // Unused
3637
export type TimeoutHandle = TimeoutID;
3738
export type NoTimeout = -1;
39+
/* eslint-enable no-use-before-define */
3840

3941
export * from 'shared/HostConfigWithNoPersistence';
4042
export * from 'shared/HostConfigWithNoHydration';

packages/react-test-renderer/src/ReactTestRenderer.js

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import ReactVersion from 'shared/ReactVersion';
3737
import * as ReactTestHostConfig from './ReactTestHostConfig';
3838
import * as TestRendererScheduling from './ReactTestRendererScheduling';
3939

40+
/* eslint-disable no-use-before-define */
4041
type TestRendererOptions = {
4142
createNodeMock: (element: React$Element<any>) => any,
4243
unstable_isAsync: boolean,
@@ -57,6 +58,7 @@ type FindOptions = $Shape<{
5758
}>;
5859

5960
export type Predicate = (node: ReactTestInstance) => ?boolean;
61+
/* eslint-enable no-use-before-define */
6062

6163
const defaultTestOptions = {
6264
createNodeMock: function() {
@@ -209,19 +211,6 @@ function toTree(node: ?Fiber) {
209211
}
210212
}
211213

212-
const fiberToWrapper = new WeakMap();
213-
function wrapFiber(fiber: Fiber): ReactTestInstance {
214-
let wrapper = fiberToWrapper.get(fiber);
215-
if (wrapper === undefined && fiber.alternate !== null) {
216-
wrapper = fiberToWrapper.get(fiber.alternate);
217-
}
218-
if (wrapper === undefined) {
219-
wrapper = new ReactTestInstance(fiber);
220-
fiberToWrapper.set(fiber, wrapper);
221-
}
222-
return wrapper;
223-
}
224-
225214
const validWrapperTypes = new Set([
226215
FunctionalComponent,
227216
FunctionalComponentLazy,
@@ -543,6 +532,19 @@ const ReactTestRendererFiber = {
543532
unstable_setNowImplementation: TestRendererScheduling.setNowImplementation,
544533
};
545534

535+
const fiberToWrapper = new WeakMap();
536+
function wrapFiber(fiber: Fiber): ReactTestInstance {
537+
let wrapper = fiberToWrapper.get(fiber);
538+
if (wrapper === undefined && fiber.alternate !== null) {
539+
wrapper = fiberToWrapper.get(fiber.alternate);
540+
}
541+
if (wrapper === undefined) {
542+
wrapper = new ReactTestInstance(fiber);
543+
fiberToWrapper.set(fiber, wrapper);
544+
}
545+
return wrapper;
546+
}
547+
546548
// Enable ReactTestRenderer to be used to test DevTools integration.
547549
TestRenderer.injectIntoDevTools({
548550
findFiberByHostInstance: (() => {

packages/shared/ReactTypes.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,24 @@
77
* @flow
88
*/
99

10+
/* eslint-disable no-use-before-define */
1011
export type ReactNode =
1112
| React$Element<any>
1213
| ReactPortal
1314
| ReactText
1415
| ReactFragment
1516
| ReactProvider<any>
1617
| ReactConsumer<any>;
18+
/* eslint-enable no-use-before-define */
19+
20+
export type ReactEmpty = null | void | boolean;
1721

1822
export type ReactFragment = ReactEmpty | Iterable<React$Node>;
1923

2024
export type ReactNodeList = ReactEmpty | React$Node;
2125

2226
export type ReactText = string | number;
2327

24-
export type ReactEmpty = null | void | boolean;
25-
2628
export type ReactProvider<T> = {
2729
$$typeof: Symbol | number,
2830
type: ReactProviderType<T>,

0 commit comments

Comments
 (0)