@@ -34,11 +34,9 @@ import {
3434 ContextConsumer ,
3535 Profiler ,
3636 SuspenseComponent ,
37- FunctionComponentLazy ,
38- ClassComponentLazy ,
39- ForwardRefLazy ,
37+ FunctionComponent ,
4038 PureComponent ,
41- PureComponentLazy ,
39+ LazyComponent ,
4240} from 'shared/ReactWorkTags' ;
4341import getComponentName from 'shared/getComponentName' ;
4442
@@ -101,7 +99,11 @@ export type Fiber = {|
10199 // Unique identifier of this child.
102100 key : null | string ,
103101
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.
105107 type : any ,
106108
107109 // The local state associated with this fiber.
@@ -219,6 +221,7 @@ function FiberNode(
219221 // Instance
220222 this . tag = tag ;
221223 this . key = key ;
224+ this . elementType = null ;
222225 this . type = null ;
223226 this . stateNode = null ;
224227
@@ -301,16 +304,14 @@ export function resolveLazyComponentTag(
301304 Component : Function ,
302305) : WorkTag {
303306 if ( typeof Component === 'function' ) {
304- return shouldConstruct ( Component )
305- ? ClassComponentLazy
306- : FunctionComponentLazy ;
307+ return shouldConstruct ( Component ) ? ClassComponent : FunctionComponent ;
307308 } else if ( Component !== undefined && Component !== null ) {
308309 const $$typeof = Component . $$typeof ;
309310 if ( $$typeof === REACT_FORWARD_REF_TYPE ) {
310- return ForwardRefLazy ;
311+ return ForwardRef ;
311312 }
312313 if ( $$typeof === REACT_PURE_TYPE ) {
313- return PureComponentLazy ;
314+ return PureComponent ;
314315 }
315316 }
316317 return IndeterminateComponent ;
@@ -335,6 +336,7 @@ export function createWorkInProgress(
335336 current . key ,
336337 current . mode ,
337338 ) ;
339+ workInProgress . elementType = current . elementType ;
338340 workInProgress . type = current . type ;
339341 workInProgress . stateNode = current . stateNode ;
340342
@@ -404,7 +406,7 @@ export function createHostRootFiber(isConcurrent: boolean): Fiber {
404406 return createFiber ( HostRoot , null , null , mode ) ;
405407}
406408
407- export function createFiberFromElement (
409+ function createFiberFromElementWithoutDebugInfo (
408410 element : ReactElement ,
409411 mode : TypeOfMode ,
410412 expirationTime : ExpirationTime ,
@@ -419,9 +421,13 @@ export function createFiberFromElement(
419421 const key = element . key ;
420422 const pendingProps = element . props ;
421423
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 ;
423427 if ( typeof type === 'function' ) {
424- fiberTag = shouldConstruct ( type ) ? ClassComponent : IndeterminateComponent ;
428+ if ( shouldConstruct ( type ) ) {
429+ fiberTag = ClassComponent ;
430+ }
425431 } else if ( typeof type === 'string' ) {
426432 fiberTag = HostComponent ;
427433 } else {
@@ -434,18 +440,23 @@ export function createFiberFromElement(
434440 key ,
435441 ) ;
436442 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+ ) ;
440449 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+ ) ;
444456 case REACT_PROFILER_TYPE :
445457 return createFiberFromProfiler ( pendingProps , mode , expirationTime , key ) ;
446458 case REACT_SUSPENSE_TYPE :
447- fiberTag = SuspenseComponent ;
448- break ;
459+ return createFiberFromSuspense ( pendingProps , mode , expirationTime , key ) ;
449460 default : {
450461 if ( typeof type === 'object' && type !== null ) {
451462 switch ( type . $$typeof ) {
@@ -463,7 +474,8 @@ export function createFiberFromElement(
463474 fiberTag = PureComponent ;
464475 break getTag;
465476 case REACT_LAZY_TYPE :
466- fiberTag = IndeterminateComponent ;
477+ fiberTag = LazyComponent ;
478+ resolvedType = null ;
467479 break getTag;
468480 }
469481 }
@@ -498,14 +510,27 @@ export function createFiberFromElement(
498510 }
499511
500512 fiber = createFiber ( fiberTag , pendingProps , key , mode ) ;
501- fiber . type = type ;
513+ fiber . elementType = type ;
514+ fiber . type = resolvedType ;
502515 fiber . expirationTime = expirationTime ;
503516
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+ ) ;
504530 if ( __DEV__ ) {
505531 fiber . _debugSource = element . _source ;
506532 fiber . _debugOwner = element . _owner ;
507533 }
508-
509534 return fiber ;
510535}
511536
@@ -520,7 +545,7 @@ export function createFiberFromFragment(
520545 return fiber ;
521546}
522547
523- export function createFiberFromProfiler (
548+ function createFiberFromProfiler (
524549 pendingProps : any ,
525550 mode : TypeOfMode ,
526551 expirationTime : ExpirationTime ,
@@ -539,12 +564,51 @@ export function createFiberFromProfiler(
539564 }
540565
541566 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 ;
542569 fiber . type = REACT_PROFILER_TYPE ;
543570 fiber . expirationTime = expirationTime ;
544571
545572 return fiber ;
546573}
547574
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+
548612export function createFiberFromText (
549613 content : string ,
550614 mode : TypeOfMode ,
@@ -557,6 +621,8 @@ export function createFiberFromText(
557621
558622export function createFiberFromHostInstanceForDeletion ( ) : Fiber {
559623 const fiber = createFiber ( HostComponent , null , null , NoContext ) ;
624+ // TODO: These should not need a type.
625+ fiber . elementType = 'DELETED' ;
560626 fiber . type = 'DELETED' ;
561627 return fiber ;
562628}
@@ -596,6 +662,7 @@ export function assignFiberPropertiesInDEV(
596662
597663 target . tag = source . tag ;
598664 target . key = source . key ;
665+ target . elementType = source . elementType ;
599666 target . type = source . type ;
600667 target . stateNode = source . stateNode ;
601668 target . return = source . return ;
0 commit comments