@@ -9,6 +9,7 @@ import { trackMember } from "./track_member.js";
99
1010export type StateObjAnalysis = {
1111 states : Map < string , StateAnalysis > ;
12+ setStateSites : SetStateSite [ ] ;
1213} ;
1314
1415export type StateAnalysis = {
@@ -19,7 +20,7 @@ export type StateAnalysis = {
1920 sites : StateSite [ ] ;
2021} ;
2122
22- export type StateSite = StateInitSite | StateExprSite | SetStateSite ;
23+ export type StateSite = StateInitSite | StateExprSite ;
2324
2425export type StateInitSite = {
2526 type : "state_init" ;
@@ -31,9 +32,14 @@ export type StateExprSite = {
3132 path : NodePath < Expression > ;
3233 owner : string | undefined ;
3334} ;
35+
3436export type SetStateSite = {
35- type : "setState" ;
3637 path : NodePath < CallExpression > ;
38+ fields : SetStateFieldSite [ ] ;
39+ }
40+
41+ export type SetStateFieldSite = {
42+ name : string ;
3743 valuePath : NodePath < Expression > ;
3844}
3945
@@ -120,6 +126,7 @@ export function analyzeState(
120126 throw new AnalysisError ( `Non-analyzable this.state` ) ;
121127 }
122128 }
129+ const setStateSites : SetStateSite [ ] = [ ] ;
123130 for ( const site of setStateAnalysis . sites ) {
124131 if ( site . type !== "expr" || site . hasWrite ) {
125132 throw new AnalysisError ( `Invalid use of this.setState` ) ;
@@ -135,22 +142,25 @@ export function analyzeState(
135142 const arg0 = args [ 0 ] ! ;
136143 if ( arg0 . isObjectExpression ( ) ) {
137144 const props = arg0 . get ( "properties" ) ;
138- if ( props . length !== 1 ) {
139- throw new AnalysisError ( `Multiple assignments in setState is not yet supported` ) ;
140- }
141- const prop0 = props [ 0 ] ! ;
142- if ( ! prop0 . isObjectProperty ( ) ) {
143- throw new AnalysisError ( `Non-analyzable setState` ) ;
144- }
145- const setStateName = memberName ( prop0 . node ) ;
146- if ( setStateName == null ) {
147- throw new AnalysisError ( `Non-analyzable setState name` ) ;
145+ const fields : SetStateFieldSite [ ] = [ ] ;
146+ for ( const prop of props ) {
147+ if ( ! prop . isObjectProperty ( ) ) {
148+ throw new AnalysisError ( `Non-analyzable setState` ) ;
149+ }
150+ const setStateName = memberName ( prop . node ) ;
151+ if ( setStateName == null ) {
152+ throw new AnalysisError ( `Non-analyzable setState name` ) ;
153+ }
154+ // Ensure the state exists
155+ getState ( setStateName ) ;
156+ fields . push ( {
157+ name : setStateName ,
158+ valuePath : prop . get ( "value" ) as NodePath < Expression > ,
159+ } ) ;
148160 }
149- const state = getState ( setStateName ) ;
150- state . sites . push ( {
151- type : "setState" ,
161+ setStateSites . push ( {
152162 path : gpPath ,
153- valuePath : prop0 . get ( "value" ) as NodePath < Expression > ,
163+ fields ,
154164 } ) ;
155165 } else {
156166 throw new AnalysisError ( `Non-analyzable setState` ) ;
@@ -185,5 +195,5 @@ export function analyzeState(
185195 }
186196 state . init = state . sites . find ( ( site ) : site is StateInitSite => site . type === "state_init" ) ;
187197 }
188- return { states } ;
198+ return { states, setStateSites } ;
189199}
0 commit comments