6
6
* LICENSE file in the root directory of this source tree. An additional grant
7
7
* of patent rights can be found in the PATENTS file in the same directory.
8
8
*
9
+ * @flow
9
10
* @providesModule ReactComponentTreeHook
10
11
*/
11
12
@@ -16,6 +17,9 @@ var ReactCurrentOwner = require('ReactCurrentOwner');
16
17
var invariant = require ( 'invariant' ) ;
17
18
var warning = require ( 'warning' ) ;
18
19
20
+ import type { ReactElement , Source } from 'ReactElementType' ;
21
+ import type { DebugID } from 'ReactInstanceType' ;
22
+
19
23
function isNative ( fn ) {
20
24
// Based on isNative() from Lodash
21
25
var funcToString = Function . prototype . toString ;
@@ -39,8 +43,19 @@ function isNative(fn) {
39
43
}
40
44
}
41
45
42
- var itemMap ;
43
- var itemByKey ;
46
+ type Item = {
47
+ element : ReactElement ,
48
+ parentID : DebugID ,
49
+ text : ?string ,
50
+ childIDs : Array < DebugID > ,
51
+ isMounted : bool ,
52
+ updateCount : number ,
53
+ } ;
54
+
55
+ declare function get ( id : DebugID ) : ?Item ;
56
+ declare function remove ( id : DebugID ) : void ;
57
+ declare function set ( id : DebugID , item : Item ) : void ;
58
+ declare function keys ( ) : Array < DebugID > ;
44
59
45
60
var canUseMap = (
46
61
typeof Array . from === 'function' &&
@@ -49,57 +64,52 @@ var canUseMap = (
49
64
) ;
50
65
51
66
if ( canUseMap ) {
52
- itemMap = new Map ( ) ;
53
- } else {
54
- itemByKey = { } ;
55
- }
56
-
57
- var unmountedIDs = [ ] ;
58
- var rootIDs = [ ] ;
59
-
60
- // Use non-numeric keys to prevent V8 performance issues:
61
- // https://github.com/facebook/react/pull/7232
62
- function getKeyFromID ( id ) {
63
- return '.' + id ;
64
- }
65
- function getIDFromKey ( key ) {
66
- return parseInt ( key . substr ( 1 ) , 10 ) ;
67
- }
67
+ var itemMap = new Map ( ) ;
68
68
69
- function get ( id ) {
70
- if ( canUseMap ) {
69
+ var get = function ( id ) {
71
70
return itemMap . get ( id ) ;
72
- }
73
- var key = getKeyFromID ( id ) ;
74
- return itemByKey [ key ] ;
75
- }
76
-
77
- function remove ( id ) {
78
- if ( canUseMap ) {
71
+ } ;
72
+ var remove = function ( id ) {
79
73
itemMap . delete ( id ) ;
80
- return ;
81
- }
82
- var key = getKeyFromID ( id ) ;
83
- delete itemByKey [ key ] ;
84
- }
85
-
86
- function create ( id , element , parentID ) {
87
- var item = {
88
- element,
89
- parentID,
90
- text : null ,
91
- childIDs : [ ] ,
92
- isMounted : false ,
93
- updateCount : 0 ,
94
74
} ;
95
- if ( canUseMap ) {
75
+ var set = function ( id , item ) {
96
76
itemMap . set ( id , item ) ;
97
- return ;
77
+ } ;
78
+ var keys = function ( ) {
79
+ return Array . from ( itemMap . keys ( ) ) ;
80
+ } ;
81
+ } else {
82
+ var itemByKey = { } ;
83
+
84
+ // Use non-numeric keys to prevent V8 performance issues:
85
+ // https://github.com/facebook/react/pull/7232
86
+ function getKeyFromID ( id : DebugID ) : string {
87
+ return '.' + id ;
88
+ }
89
+ function getIDFromKey ( key : string ) : DebugID {
90
+ return parseInt ( key . substr ( 1 ) , 10 ) ;
98
91
}
99
- var key = getKeyFromID ( id ) ;
100
- itemByKey [ key ] = item ;
92
+
93
+ var get = function ( id ) {
94
+ var key = getKeyFromID ( id ) ;
95
+ return itemByKey [ key ] ;
96
+ } ;
97
+ var remove = function ( id ) {
98
+ var key = getKeyFromID ( id ) ;
99
+ delete itemByKey [ key ] ;
100
+ } ;
101
+ var set = function ( id , item ) {
102
+ var key = getKeyFromID ( id ) ;
103
+ itemByKey [ key ] = item ;
104
+ } ;
105
+ var keys = function ( ) {
106
+ return Object . keys ( itemByKey ) . map ( getIDFromKey ) ;
107
+ } ;
101
108
}
102
109
110
+ var unmountedIDs : Array < DebugID > = [ ] ;
111
+ var rootIDs : Array < DebugID > = [ ] ;
112
+
103
113
function purgeDeep ( id ) {
104
114
var item = get ( id ) ;
105
115
if ( item ) {
@@ -110,7 +120,7 @@ function purgeDeep(id) {
110
120
}
111
121
112
122
function describeComponentFrame ( name , source , ownerName ) {
113
- return '\n in ' + name + (
123
+ return '\n in ' + ( name || 'Unknown' ) + (
114
124
source ?
115
125
' (at ' + source . fileName . replace ( / ^ .* [ \\ \/ ] / , '' ) + ':' +
116
126
source . lineNumber + ')' :
@@ -120,7 +130,7 @@ function describeComponentFrame(name, source, ownerName) {
120
130
) ;
121
131
}
122
132
123
- function getDisplayName ( element ) {
133
+ function getDisplayName ( element : ? ReactElement ) : string {
124
134
if ( element == null ) {
125
135
return '#empty' ;
126
136
} else if ( typeof element === 'string' || typeof element === 'number' ) {
@@ -132,7 +142,7 @@ function getDisplayName(element) {
132
142
}
133
143
}
134
144
135
- function describeID ( id ) {
145
+ function describeID ( id : DebugID ) : string {
136
146
var name = ReactComponentTreeHook . getDisplayName ( id ) ;
137
147
var element = ReactComponentTreeHook . getElement ( id ) ;
138
148
var ownerID = ReactComponentTreeHook . getOwnerID ( id ) ;
@@ -150,8 +160,9 @@ function describeID(id) {
150
160
}
151
161
152
162
var ReactComponentTreeHook = {
153
- onSetChildren ( id , nextChildIDs ) {
163
+ onSetChildren ( id : DebugID , nextChildIDs : Array < DebugID > ) : void {
154
164
var item = get ( id ) ;
165
+ invariant ( item , 'Item must have been set' ) ;
155
166
item . childIDs = nextChildIDs ;
156
167
157
168
for ( var i = 0 ; i < nextChildIDs . length ; i ++ ) {
@@ -178,7 +189,7 @@ var ReactComponentTreeHook = {
178
189
nextChild . parentID = id ;
179
190
// TODO: This shouldn't be necessary but mounting a new root during in
180
191
// componentWillMount currently causes not-yet-mounted components to
181
- // be purged from our tree data so their parent ID is missing.
192
+ // be purged from our tree data so their parent DebugID is missing.
182
193
}
183
194
invariant (
184
195
nextChild . parentID === id ,
@@ -191,11 +202,19 @@ var ReactComponentTreeHook = {
191
202
}
192
203
} ,
193
204
194
- onBeforeMountComponent ( id , element , parentID ) {
195
- create ( id , element , parentID ) ;
205
+ onBeforeMountComponent ( id : DebugID , element : ReactElement , parentID : DebugID ) : void {
206
+ var item = {
207
+ element,
208
+ parentID,
209
+ text : null ,
210
+ childIDs : [ ] ,
211
+ isMounted : false ,
212
+ updateCount : 0 ,
213
+ } ;
214
+ set ( id , item ) ;
196
215
} ,
197
216
198
- onBeforeUpdateComponent ( id , element ) {
217
+ onBeforeUpdateComponent ( id : DebugID , element : ReactElement ) : void {
199
218
var item = get ( id ) ;
200
219
if ( ! item || ! item . isMounted ) {
201
220
// We may end up here as a result of setState() in componentWillUnmount().
@@ -205,15 +224,16 @@ var ReactComponentTreeHook = {
205
224
item . element = element ;
206
225
} ,
207
226
208
- onMountComponent ( id ) {
227
+ onMountComponent ( id : DebugID ) : void {
209
228
var item = get ( id ) ;
229
+ invariant ( item , 'Item must have been set' ) ;
210
230
item . isMounted = true ;
211
231
if ( item . parentID === 0 ) {
212
232
rootIDs . push ( id ) ;
213
233
}
214
234
} ,
215
235
216
- onUpdateComponent ( id ) {
236
+ onUpdateComponent ( id : DebugID ) : void {
217
237
var item = get ( id ) ;
218
238
if ( ! item || ! item . isMounted ) {
219
239
// We may end up here as a result of setState() in componentWillUnmount().
@@ -223,7 +243,7 @@ var ReactComponentTreeHook = {
223
243
item . updateCount ++ ;
224
244
} ,
225
245
226
- onUnmountComponent ( id ) {
246
+ onUnmountComponent ( id : DebugID ) : void {
227
247
var item = get ( id ) ;
228
248
if ( item ) {
229
249
// We need to check if it exists.
@@ -242,7 +262,7 @@ var ReactComponentTreeHook = {
242
262
unmountedIDs . push ( id ) ;
243
263
} ,
244
264
245
- purgeUnmountedComponents ( ) {
265
+ purgeUnmountedComponents ( ) : void {
246
266
if ( ReactComponentTreeHook . _preventPurging ) {
247
267
// Should only be used for testing.
248
268
return ;
@@ -255,21 +275,18 @@ var ReactComponentTreeHook = {
255
275
unmountedIDs . length = 0 ;
256
276
} ,
257
277
258
- isMounted ( id ) {
278
+ isMounted ( id : DebugID ) : bool {
259
279
var item = get ( id ) ;
260
280
return item ? item . isMounted : false ;
261
281
} ,
262
282
263
- getCurrentStackAddendum ( topElement ) {
283
+ getCurrentStackAddendum ( topElement : ? ReactElement ) : string {
264
284
var info = '' ;
265
285
if ( topElement ) {
266
- var type = topElement . type ;
267
- var name = typeof type === 'function' ?
268
- type . displayName || type . name :
269
- type ;
286
+ var name = getDisplayName ( topElement ) ;
270
287
var owner = topElement . _owner ;
271
288
info += describeComponentFrame (
272
- name || 'Unknown' ,
289
+ name ,
273
290
topElement . _source ,
274
291
owner && owner . getName ( )
275
292
) ;
@@ -282,7 +299,7 @@ var ReactComponentTreeHook = {
282
299
return info ;
283
300
} ,
284
301
285
- getStackAddendumByID ( id ) {
302
+ getStackAddendumByID ( id : ? DebugID ) : string {
286
303
var info = '' ;
287
304
while ( id ) {
288
305
info += describeID ( id ) ;
@@ -291,45 +308,45 @@ var ReactComponentTreeHook = {
291
308
return info ;
292
309
} ,
293
310
294
- getChildIDs ( id ) {
311
+ getChildIDs ( id : DebugID ) : Array < DebugID > {
295
312
var item = get ( id ) ;
296
313
return item ? item . childIDs : [ ] ;
297
314
} ,
298
315
299
- getDisplayName ( id ) {
316
+ getDisplayName ( id : DebugID ) : ? string {
300
317
var element = ReactComponentTreeHook . getElement ( id ) ;
301
318
if ( ! element ) {
302
319
return null ;
303
320
}
304
321
return getDisplayName ( element ) ;
305
322
} ,
306
323
307
- getElement ( id ) {
324
+ getElement ( id : DebugID ) : ? ReactElement {
308
325
var item = get ( id ) ;
309
326
return item ? item . element : null ;
310
327
} ,
311
328
312
- getOwnerID ( id ) {
329
+ getOwnerID ( id : DebugID ) : ? DebugID {
313
330
var element = ReactComponentTreeHook . getElement ( id ) ;
314
331
if ( ! element || ! element . _owner ) {
315
332
return null ;
316
333
}
317
334
return element . _owner . _debugID ;
318
335
} ,
319
336
320
- getParentID ( id ) {
337
+ getParentID ( id : DebugID ) : ? DebugID {
321
338
var item = get ( id ) ;
322
339
return item ? item . parentID : null ;
323
340
} ,
324
341
325
- getSource ( id ) {
342
+ getSource ( id : DebugID ) : ? Source {
326
343
var item = get ( id ) ;
327
344
var element = item ? item . element : null ;
328
345
var source = element != null ? element . _source : null ;
329
346
return source ;
330
347
} ,
331
348
332
- getText ( id ) {
349
+ getText ( id : DebugID ) : ? string {
333
350
var element = ReactComponentTreeHook . getElement ( id ) ;
334
351
if ( typeof element === 'string' ) {
335
352
return element ;
@@ -340,20 +357,17 @@ var ReactComponentTreeHook = {
340
357
}
341
358
} ,
342
359
343
- getUpdateCount ( id ) {
360
+ getUpdateCount ( id : DebugID ) : number {
344
361
var item = get ( id ) ;
345
362
return item ? item . updateCount : 0 ;
346
363
} ,
347
364
348
- getRootIDs ( ) {
365
+ getRootIDs ( ) : Array < DebugID > {
349
366
return rootIDs ;
350
367
} ,
351
368
352
- getRegisteredIDs ( ) {
353
- if ( canUseMap ) {
354
- return Array . from ( itemMap . keys ( ) ) ;
355
- }
356
- return Object . keys ( itemByKey ) . map ( getIDFromKey ) ;
369
+ getRegisteredIDs ( ) : Array < DebugID > {
370
+ return keys ( ) ;
357
371
} ,
358
372
} ;
359
373
0 commit comments