@@ -34,11 +34,9 @@ import {
34
34
ContextConsumer ,
35
35
Profiler ,
36
36
SuspenseComponent ,
37
- FunctionComponentLazy ,
38
- ClassComponentLazy ,
39
- ForwardRefLazy ,
37
+ FunctionComponent ,
40
38
PureComponent ,
41
- PureComponentLazy ,
39
+ LazyComponent ,
42
40
} from 'shared/ReactWorkTags' ;
43
41
import getComponentName from 'shared/getComponentName' ;
44
42
@@ -101,7 +99,11 @@ export type Fiber = {|
101
99
// Unique identifier of this child.
102
100
key : null | string ,
103
101
104
- // The function/class/module associated with this fiber.
102
+ // The value of element.type which is used to preserve the identity during
103
+ // reconciliation of this child.
104
+ elementType : any ,
105
+
106
+ // The resolved function/class/ associated with this fiber.
105
107
type : any ,
106
108
107
109
// The local state associated with this fiber.
@@ -219,6 +221,7 @@ function FiberNode(
219
221
// Instance
220
222
this . tag = tag ;
221
223
this . key = key ;
224
+ this . elementType = null ;
222
225
this . type = null ;
223
226
this . stateNode = null ;
224
227
@@ -301,16 +304,14 @@ export function resolveLazyComponentTag(
301
304
Component : Function ,
302
305
) : WorkTag {
303
306
if ( typeof Component === 'function' ) {
304
- return shouldConstruct ( Component )
305
- ? ClassComponentLazy
306
- : FunctionComponentLazy ;
307
+ return shouldConstruct ( Component ) ? ClassComponent : FunctionComponent ;
307
308
} else if ( Component !== undefined && Component !== null ) {
308
309
const $$typeof = Component . $$typeof ;
309
310
if ( $$typeof === REACT_FORWARD_REF_TYPE ) {
310
- return ForwardRefLazy ;
311
+ return ForwardRef ;
311
312
}
312
313
if ( $$typeof === REACT_PURE_TYPE ) {
313
- return PureComponentLazy ;
314
+ return PureComponent ;
314
315
}
315
316
}
316
317
return IndeterminateComponent ;
@@ -335,6 +336,7 @@ export function createWorkInProgress(
335
336
current . key ,
336
337
current . mode ,
337
338
) ;
339
+ workInProgress . elementType = current . elementType ;
338
340
workInProgress . type = current . type ;
339
341
workInProgress . stateNode = current . stateNode ;
340
342
@@ -404,7 +406,7 @@ export function createHostRootFiber(isConcurrent: boolean): Fiber {
404
406
return createFiber ( HostRoot , null , null , mode ) ;
405
407
}
406
408
407
- export function createFiberFromElement (
409
+ function createFiberFromElementWithoutDebugInfo (
408
410
element : ReactElement ,
409
411
mode : TypeOfMode ,
410
412
expirationTime : ExpirationTime ,
@@ -419,9 +421,13 @@ export function createFiberFromElement(
419
421
const key = element . key ;
420
422
const pendingProps = element . props ;
421
423
422
- let fiberTag ;
424
+ let fiberTag = IndeterminateComponent ;
425
+ // The resolved type is set if we know what the final type will be. I.e. it's not lazy.
426
+ let resolvedType = type ;
423
427
if ( typeof type === 'function' ) {
424
- fiberTag = shouldConstruct ( type ) ? ClassComponent : IndeterminateComponent ;
428
+ if ( shouldConstruct ( type ) ) {
429
+ fiberTag = ClassComponent ;
430
+ }
425
431
} else if ( typeof type === 'string' ) {
426
432
fiberTag = HostComponent ;
427
433
} else {
@@ -434,18 +440,23 @@ export function createFiberFromElement(
434
440
key ,
435
441
) ;
436
442
case REACT_CONCURRENT_MODE_TYPE :
437
- fiberTag = Mode ;
438
- mode |= ConcurrentMode | StrictMode ;
439
- break ;
443
+ return createFiberFromMode (
444
+ pendingProps ,
445
+ mode | ConcurrentMode | StrictMode ,
446
+ expirationTime ,
447
+ key ,
448
+ ) ;
440
449
case REACT_STRICT_MODE_TYPE :
441
- fiberTag = Mode ;
442
- mode |= StrictMode ;
443
- break ;
450
+ return createFiberFromMode (
451
+ pendingProps ,
452
+ mode | StrictMode ,
453
+ expirationTime ,
454
+ key ,
455
+ ) ;
444
456
case REACT_PROFILER_TYPE :
445
457
return createFiberFromProfiler ( pendingProps , mode , expirationTime , key ) ;
446
458
case REACT_SUSPENSE_TYPE :
447
- fiberTag = SuspenseComponent ;
448
- break ;
459
+ return createFiberFromSuspense ( pendingProps , mode , expirationTime , key ) ;
449
460
default : {
450
461
if ( typeof type === 'object' && type !== null ) {
451
462
switch ( type . $$typeof ) {
@@ -463,7 +474,8 @@ export function createFiberFromElement(
463
474
fiberTag = PureComponent ;
464
475
break getTag;
465
476
case REACT_LAZY_TYPE :
466
- fiberTag = IndeterminateComponent ;
477
+ fiberTag = LazyComponent ;
478
+ resolvedType = null ;
467
479
break getTag;
468
480
}
469
481
}
@@ -498,14 +510,27 @@ export function createFiberFromElement(
498
510
}
499
511
500
512
fiber = createFiber ( fiberTag , pendingProps , key , mode ) ;
501
- fiber . type = type ;
513
+ fiber . elementType = type ;
514
+ fiber . type = resolvedType ;
502
515
fiber . expirationTime = expirationTime ;
503
516
517
+ return fiber ;
518
+ }
519
+
520
+ export function createFiberFromElement (
521
+ element : ReactElement ,
522
+ mode : TypeOfMode ,
523
+ expirationTime : ExpirationTime ,
524
+ ) : Fiber {
525
+ const fiber = createFiberFromElementWithoutDebugInfo (
526
+ element ,
527
+ mode ,
528
+ expirationTime ,
529
+ ) ;
504
530
if ( __DEV__ ) {
505
531
fiber . _debugSource = element . _source ;
506
532
fiber . _debugOwner = element . _owner ;
507
533
}
508
-
509
534
return fiber ;
510
535
}
511
536
@@ -520,7 +545,7 @@ export function createFiberFromFragment(
520
545
return fiber ;
521
546
}
522
547
523
- export function createFiberFromProfiler (
548
+ function createFiberFromProfiler (
524
549
pendingProps : any ,
525
550
mode : TypeOfMode ,
526
551
expirationTime : ExpirationTime ,
@@ -539,12 +564,51 @@ export function createFiberFromProfiler(
539
564
}
540
565
541
566
const fiber = createFiber ( Profiler , pendingProps , key , mode | ProfileMode ) ;
567
+ // TODO: The Profiler fiber shouldn't have a type. It has a tag.
568
+ fiber . elementType = REACT_PROFILER_TYPE ;
542
569
fiber . type = REACT_PROFILER_TYPE ;
543
570
fiber . expirationTime = expirationTime ;
544
571
545
572
return fiber ;
546
573
}
547
574
575
+ function createFiberFromMode (
576
+ pendingProps : any ,
577
+ mode : TypeOfMode ,
578
+ expirationTime : ExpirationTime ,
579
+ key : null | string ,
580
+ ) : Fiber {
581
+ const fiber = createFiber ( Mode , pendingProps , key , mode ) ;
582
+
583
+ // TODO: The Mode fiber shouldn't have a type. It has a tag.
584
+ const type =
585
+ ( mode & ConcurrentMode ) === NoContext
586
+ ? REACT_STRICT_MODE_TYPE
587
+ : REACT_CONCURRENT_MODE_TYPE ;
588
+ fiber . elementType = type ;
589
+ fiber . type = type ;
590
+
591
+ fiber . expirationTime = expirationTime ;
592
+ return fiber ;
593
+ }
594
+
595
+ export function createFiberFromSuspense (
596
+ pendingProps : any ,
597
+ mode : TypeOfMode ,
598
+ expirationTime : ExpirationTime ,
599
+ key : null | string ,
600
+ ) {
601
+ const fiber = createFiber ( SuspenseComponent , pendingProps , key , mode ) ;
602
+
603
+ // TODO: The SuspenseComponent fiber shouldn't have a type. It has a tag.
604
+ const type = REACT_SUSPENSE_TYPE ;
605
+ fiber . elementType = type ;
606
+ fiber . type = type ;
607
+
608
+ fiber . expirationTime = expirationTime ;
609
+ return fiber ;
610
+ }
611
+
548
612
export function createFiberFromText (
549
613
content : string ,
550
614
mode : TypeOfMode ,
@@ -557,6 +621,8 @@ export function createFiberFromText(
557
621
558
622
export function createFiberFromHostInstanceForDeletion ( ) : Fiber {
559
623
const fiber = createFiber ( HostComponent , null , null , NoContext ) ;
624
+ // TODO: These should not need a type.
625
+ fiber . elementType = 'DELETED' ;
560
626
fiber . type = 'DELETED' ;
561
627
return fiber ;
562
628
}
@@ -596,6 +662,7 @@ export function assignFiberPropertiesInDEV(
596
662
597
663
target . tag = source . tag ;
598
664
target . key = source . key ;
665
+ target . elementType = source . elementType ;
599
666
target . type = source . type ;
600
667
target . stateNode = source . stateNode ;
601
668
target . return = source . return ;
0 commit comments