29
} = require('ReactPortal');
30
31
var ReactFiber = require('ReactFiber');
32
-var ReactReifiedYield = require('ReactReifiedYield');
32
var ReactTypeOfSideEffect = require('ReactTypeOfSideEffect');
33
var ReactTypeOfWork = require('ReactTypeOfWork');
34
52
createFiberFromPortal,
53
} = ReactFiber;
54
56
-const {
57
- createReifiedYield,
58
- createUpdatedReifiedYield,
59
-} = ReactReifiedYield;
60
-
55
const isArray = Array.isArray;
56
57
const {
310
yieldNode : ReactYield,
311
priority : PriorityLevel
312
) : Fiber {
319
- // TODO: Should this also compare continuation to determine whether to reuse?
313
if (current == null || current.tag !== YieldComponent) {
314
// Insert
322
- const reifiedYield = createReifiedYield(yieldNode);
315
const created = createFiberFromYield(yieldNode, priority);
324
- created.type = reifiedYield;
316
+ created.type = yieldNode.value;
317
created.return = returnFiber;
318
return created;
319
} else {
320
// Move based on index
321
const existing = useFiber(current, priority);
330
- existing.type = createUpdatedReifiedYield(
331
- current.type,
332
- yieldNode
333
- );
322
+ existing.type = yieldNode.value;
323
existing.return = returnFiber;
324
return existing;
325
}
400
}
401
402
case REACT_YIELD_TYPE: {
414
- const reifiedYield = createReifiedYield(newChild);
403
const created = createFiberFromYield(newChild, priority);
416
- created.type = reifiedYield;
404
+ created.type = newChild.value;
405
created.return = returnFiber;
406
return created;
407
}
462
}
463
464
case REACT_YIELD_TYPE: {
477
- if (newChild.key === key) {
465
+ // Yields doesn't have keys. If the previous node is implicitly keyed
466
+ // we can continue to replace it without aborting even if it is not a
467
+ // yield.
468
+ if (key === null) {
469
return updateYield(returnFiber, oldFiber, newChild, priority);
470
} else {
471
return null;
518
}
519
520
case REACT_YIELD_TYPE: {
530
- const matchedFiber = existingChildren.get(
531
- newChild.key === null ? newIdx : newChild.key
532
- ) || null;
521
+ // Yields doesn't have keys, so we neither have to check the old nor
522
+ // new node for the key. If both are yields, they match.
523
+ const matchedFiber = existingChildren.get(newIdx) || null;
524
return updateYield(returnFiber, matchedFiber, newChild, priority);
525
}
526
552
switch (child.$$typeof) {
553
case REACT_ELEMENT_TYPE:
554
case REACT_COROUTINE_TYPE:
564
- case REACT_YIELD_TYPE:
555
case REACT_PORTAL_TYPE:
556
const key = child.key;
557
if (typeof key !== 'string') {
1009
yieldNode : ReactYield,
1010
priority : PriorityLevel
1011
) : Fiber {
1022
- const key = yieldNode.key;
1012
+ // There's no need to check for keys on yields since they're stateless.
1013
let child = currentFirstChild;
1024
- while (child) {
1025
- // TODO: If key === null and child.key === null, then this only applies to
1026
- // the first item in the list.
1027
- if (child.key === key) {
1028
- if (child.tag === YieldComponent) {
1029
- deleteRemainingChildren(returnFiber, child.sibling);
1030
- const existing = useFiber(child, priority);
1031
- existing.type = createUpdatedReifiedYield(
1032
- child.type,
1033
- yieldNode
1034
- );
1035
- existing.return = returnFiber;
1036
- return existing;
1037
- } else {
1038
- deleteRemainingChildren(returnFiber, child);
1039
- break;
1040
- }
1014
+ if (child) {
1015
+ if (child.tag === YieldComponent) {
1016
+ deleteRemainingChildren(returnFiber, child.sibling);
1017
+ const existing = useFiber(child, priority);
1018
+ existing.type = yieldNode.value;
1019
+ existing.return = returnFiber;
1020
+ return existing;
1021
} else {
1042
- deleteChild(returnFiber, child);
1022
+ deleteRemainingChildren(returnFiber, child);
1023
}
1044
- child = child.sibling;
1024
}
1025
1047
- const reifiedYield = createReifiedYield(yieldNode);
1026
const created = createFiberFromYield(yieldNode, priority);
1049
- created.type = reifiedYield;
1027
+ created.type = yieldNode.value;
1028
created.return = returnFiber;
1029
return created;
1030
}