11// @flow  
22
33import  {  type  Node ,  type  Element  }  from  'react' 
4- import  type  {  Visitor ,  YieldFrame ,  Frame ,  AbstractElement  }  from  './types' 
4+ import  type  { 
5+  Visitor , 
6+  YieldFrame , 
7+  Frame , 
8+  AbstractElement , 
9+  RendererState 
10+ }  from  './types' 
511import  {  visit ,  update ,  SHOULD_YIELD  }  from  './visitor' 
612import  {  getChildrenArray  }  from  './element' 
713
@@ -10,6 +16,8 @@ import {
1016 setCurrentContextMap , 
1117 setCurrentErrorFrame , 
1218 getCurrentErrorFrame , 
19+  setCurrentRendererState , 
20+  initRendererState , 
1321 Dispatcher 
1422}  from  './internals' 
1523
@@ -18,7 +26,11 @@ import {
1826 the queue. Hence we recursively look at suspended components in 
1927 this queue, wait for their promises to resolve, and continue 
2028 calling visit() on their children. */ 
21- const  flushFrames  =  ( queue : Frame [ ] ,  visitor : Visitor ) : Promise < void >  =>  { 
29+ const  flushFrames  =  ( 
30+  queue : Frame [ ] , 
31+  visitor : Visitor , 
32+  state : RendererState 
33+ ) : Promise < void >  =>  { 
2234 const  frame  =  queue . shift ( ) 
2335 if  ( ! frame )  { 
2436 return  Promise . resolve ( ) 
@@ -32,8 +44,9 @@ const flushFrames = (queue: Frame[], visitor: Visitor): Promise<void> => {
3244
3345 return  Promise . resolve ( frame . thenable ) . then ( 
3446 ( )  =>  { 
47+  setCurrentRendererState ( state ) 
3548 update ( frame ,  queue ,  visitor ) 
36-  return  flushFrames ( queue ,  visitor ) 
49+  return  flushFrames ( queue ,  visitor ,   state ) 
3750 } , 
3851 ( error : Error )  =>  { 
3952 if  ( ! frame . errorFrame )  throw  error 
@@ -49,7 +62,10 @@ const renderPrepass = (element: Node, visitor?: Visitor): Promise<void> => {
4962 if  ( ! visitor )  visitor  =  defaultVisitor 
5063
5164 const  queue : Frame [ ]  =  [ ] 
52- 
65+  // Renderer state is kept globally but restored and 
66+  // passed around manually since it isn't dependent on the 
67+  // render tree 
68+  const  state  =  initRendererState ( ) 
5369 // Context state is kept globally and is modified in-place. 
5470 // Before we start walking the element tree we need to reset 
5571 // its current state 
@@ -63,7 +79,7 @@ const renderPrepass = (element: Node, visitor?: Visitor): Promise<void> => {
6379 return  Promise . reject ( error ) 
6480 } 
6581
66-  return  flushFrames ( queue ,  visitor ) 
82+  return  flushFrames ( queue ,  visitor ,   state ) 
6783} 
6884
6985export  default  renderPrepass 
0 commit comments