@@ -1099,7 +1099,7 @@ mod writeback {
1099
1099
}
1100
1100
}
1101
1101
}
1102
- fn resolve_type_vars_for_node ( wbcx : & @ wb_ctxt , sp : & span ,
1102
+ fn resolve_type_vars_for_node ( wbcx : & wb_ctxt , sp : & span ,
1103
1103
id : ast:: node_id ) {
1104
1104
let fcx = wbcx. fcx ;
1105
1105
let tpot = ty:: node_id_to_ty_param_substs_opt_and_ty ( fcx. ccx . tcx , id) ;
@@ -1126,24 +1126,33 @@ mod writeback {
1126
1126
}
1127
1127
1128
1128
type wb_ctxt =
1129
- // A flag to ignore contained items and lambdas
1130
1129
// As soon as we hit an error we have to stop resolving
1131
1130
// the entire function
1132
- { fcx: @fn_ctxt, mutable ignore: bool, mutable success: bool} ;
1131
+ { fcx: @fn_ctxt, mutable success: bool} ;
1132
+ type wb_vt = visit:: vt [ wb_ctxt ] ;
1133
1133
1134
- fn visit_stmt_pre ( wbcx : @wb_ctxt , s : & @ast:: stmt ) {
1134
+ fn visit_stmt ( s : & @ast:: stmt , wbcx : & wb_ctxt , v : & wb_vt ) {
1135
+ if !wbcx. success { ret; }
1135
1136
resolve_type_vars_for_node ( wbcx, s. span , ty:: stmt_node_id ( s) ) ;
1137
+ visit:: visit_stmt ( s, wbcx, v) ;
1136
1138
}
1137
- fn visit_expr_pre ( wbcx : @wb_ctxt , e : & @ast:: expr ) {
1139
+ fn visit_expr ( e : & @ast:: expr , wbcx : & wb_ctxt , v : & wb_vt ) {
1140
+ if !wbcx. success { ret; }
1138
1141
resolve_type_vars_for_node ( wbcx, e. span , e. id ) ;
1142
+ visit:: visit_expr ( e, wbcx, v) ;
1139
1143
}
1140
- fn visit_block_pre ( wbcx : @wb_ctxt , b : & ast:: blk ) {
1144
+ fn visit_block ( b : & ast:: blk , wbcx : & wb_ctxt , v : & wb_vt ) {
1145
+ if !wbcx. success { ret; }
1141
1146
resolve_type_vars_for_node ( wbcx, b. span , b. node . id ) ;
1147
+ visit:: visit_block ( b, wbcx, v) ;
1142
1148
}
1143
- fn visit_pat_pre ( wbcx : @wb_ctxt , p : & @ast:: pat ) {
1149
+ fn visit_pat ( p : & @ast:: pat , wbcx : & wb_ctxt , v : & wb_vt ) {
1150
+ if !wbcx. success { ret; }
1144
1151
resolve_type_vars_for_node ( wbcx, p. span , p. id ) ;
1152
+ visit:: visit_pat ( p, wbcx, v) ;
1145
1153
}
1146
- fn visit_local_pre ( wbcx : @wb_ctxt , l : & @ast:: local ) {
1154
+ fn visit_local ( l : & @ast:: local , wbcx : & wb_ctxt , v : & wb_vt ) {
1155
+ if !wbcx. success { ret; }
1147
1156
let var_id = lookup_local ( wbcx. fcx , l. span , l. node . id ) ;
1148
1157
let fix_rslt =
1149
1158
ty:: unify:: resolve_type_var ( wbcx. fcx . ccx . tcx ,
@@ -1157,38 +1166,29 @@ mod writeback {
1157
1166
wbcx. success = false ;
1158
1167
}
1159
1168
}
1169
+ visit:: visit_local ( l, wbcx, v) ;
1160
1170
}
1161
- fn visit_item_pre ( wbcx : @ wb_ctxt , item : & @ast:: item ) {
1162
- wbcx . ignore = true ;
1171
+ fn visit_item ( item : & @ast:: item , wbcx : & wb_ctxt , v : & wb_vt ) {
1172
+ // Ignore items
1163
1173
}
1164
- fn visit_item_post ( wbcx : @wb_ctxt , item : & @ast:: item ) {
1165
- wbcx. ignore = false ;
1174
+ fn visit_fn ( f : & ast:: _fn , tps : & ast:: ty_param [ ] ,
1175
+ sp : & span , i : & ast:: fn_ident , d : ast:: node_id ,
1176
+ wbcx : & wb_ctxt , v : & wb_vt ) {
1177
+ // Ignore fns
1166
1178
}
1167
- fn visit_fn_pre ( wbcx : @wb_ctxt , f : & ast:: _fn , tps : & ast:: ty_param [ ] ,
1168
- sp : & span , i : & ast:: fn_ident , d : ast:: node_id ) {
1169
- wbcx. ignore = true ;
1170
- }
1171
- fn visit_fn_post ( wbcx : @wb_ctxt , f : & ast:: _fn , tps : & ast:: ty_param [ ] ,
1172
- sp : & span , i : & ast:: fn_ident , d : ast:: node_id ) {
1173
- wbcx. ignore = false ;
1174
- }
1175
- fn keep_going ( wbcx : @wb_ctxt ) -> bool { !wbcx. ignore && wbcx. success }
1176
1179
1177
1180
fn resolve_type_vars_in_block ( fcx : & @fn_ctxt , blk : & ast:: blk ) -> bool {
1178
- let wbcx = @{ fcx: fcx, mutable ignore: false , mutable success: true } ;
1179
- let visit =
1180
- { keep_going: bind keep_going ( wbcx) ,
1181
- visit_item_pre: bind visit_item_pre ( wbcx, _) ,
1182
- visit_item_post: bind visit_item_post ( wbcx, _) ,
1183
- visit_fn_pre: bind visit_fn_pre ( wbcx, _, _, _, _, _) ,
1184
- visit_fn_post: bind visit_fn_post ( wbcx, _, _, _, _, _) ,
1185
- visit_stmt_pre: bind visit_stmt_pre ( wbcx, _) ,
1186
- visit_expr_pre: bind visit_expr_pre ( wbcx, _) ,
1187
- visit_block_pre: bind visit_block_pre ( wbcx, _) ,
1188
- visit_pat_pre: bind visit_pat_pre ( wbcx, _) ,
1189
- visit_local_pre: bind visit_local_pre ( wbcx, _)
1190
- with walk:: default_visitor ( ) } ;
1191
- walk:: walk_block ( visit, blk) ;
1181
+ let wbcx = { fcx: fcx, mutable success: true } ;
1182
+ let visit = visit:: mk_vt
1183
+ ( @{ visit_item: visit_item,
1184
+ visit_fn: visit_fn,
1185
+ visit_stmt: visit_stmt,
1186
+ visit_expr: visit_expr,
1187
+ visit_block: visit_block,
1188
+ visit_pat: visit_pat,
1189
+ visit_local: visit_local
1190
+ with * visit:: default_visitor ( ) } ) ;
1191
+ visit:: visit_block ( blk, wbcx, visit) ;
1192
1192
ret wbcx. success ;
1193
1193
}
1194
1194
}
0 commit comments