@@ -255,6 +255,7 @@ fn resolve_names(e: &@env, c: &@ast::crate) {
255
255
visit_item: visit_item_with_scope,
256
256
visit_block: visit_block_with_scope,
257
257
visit_arm: bind walk_arm ( e, _, _, _) ,
258
+ visit_pat: bind walk_pat ( e, _, _, _) ,
258
259
visit_expr: bind walk_expr ( e, _, _, _) ,
259
260
visit_ty: bind walk_ty ( e, _, _, _) ,
260
261
visit_constr: bind walk_constr ( e, _, _, _, _, _) ,
@@ -289,33 +290,23 @@ fn resolve_names(e: &@env, c: &@ast::crate) {
289
290
maybe_insert ( e, id, lookup_path_strict ( * e, sc, sp, p. node , ns_value) ) ;
290
291
}
291
292
fn walk_arm ( e : @env , a : & ast:: arm , sc : & scopes , v : & vt[ scopes ] ) {
292
- for p: @ast:: pat in a. pats { walk_pat ( * e, sc, p) ; }
293
293
visit_arm_with_scope ( a, sc, v) ;
294
294
}
295
- fn walk_pat ( e : & env , sc : & scopes , pat : & @ast:: pat ) {
295
+ fn walk_pat ( e : & @env , pat : & @ast:: pat , sc : & scopes , v : & vt[ scopes ] ) {
296
+ visit:: visit_pat ( pat, sc, v) ;
296
297
alt pat. node {
297
- ast:: pat_tag ( p, children) {
298
- let fnd = lookup_path_strict ( e, sc, p. span , p. node , ns_value) ;
299
- if option:: is_some ( fnd) {
300
- alt option:: get ( fnd) {
301
- ast:: def_variant ( did, vid) {
302
- e. def_map . insert ( pat. id , option:: get ( fnd) ) ;
303
- for child: @ast:: pat in children {
304
- walk_pat ( e, sc, child) ;
305
- }
306
- }
307
- _ {
308
- e. sess . span_err ( p. span ,
309
- "not a tag variant: " +
310
- ast:: path_name ( p) ) ;
311
- }
312
- }
298
+ ast:: pat_tag ( p, _) {
299
+ let fnd = lookup_path_strict ( * e, sc, p. span , p. node , ns_value) ;
300
+ alt option:: get ( fnd) {
301
+ ast:: def_variant ( did, vid) {
302
+ e. def_map . insert ( pat. id , option:: get ( fnd) ) ;
303
+ }
304
+ _ {
305
+ e. sess . span_err
306
+ ( p. span , "not a tag variant: " + ast:: path_name ( p) ) ;
307
+ }
313
308
}
314
309
}
315
- ast:: pat_rec ( fields, _) {
316
- for f: ast:: field_pat in fields { walk_pat ( e, sc, f. pat ) ; }
317
- }
318
- ast:: pat_box ( inner) { walk_pat ( e, sc, inner) ; }
319
310
_ { }
320
311
}
321
312
}
@@ -653,14 +644,18 @@ fn lookup_in_scope(e: &env, sc: scopes, sp: &span, name: &ident,
653
644
}
654
645
scope_loop ( local) {
655
646
if ns == ns_value {
656
- if str:: eq ( local. node . ident , name) {
657
- ret some ( ast:: def_local ( local_def ( local. node . id ) ) ) ;
647
+ alt lookup_in_pat ( name, * local. node . pat ) {
648
+ some ( did) { ret some ( ast:: def_local ( did) ) ; }
649
+ _ { }
658
650
}
659
651
}
660
652
}
661
653
scope_block ( b) { ret lookup_in_block ( name, b. node , ns) ; }
662
654
scope_arm ( a) {
663
- if ns == ns_value { ret lookup_in_pat ( name, * a. pats . ( 0 ) ) ; }
655
+ if ns == ns_value {
656
+ ret option:: map ( ast:: def_binding,
657
+ lookup_in_pat ( name, * a. pats . ( 0 ) ) ) ;
658
+ }
664
659
}
665
660
}
666
661
ret none[ def] ;
@@ -716,11 +711,11 @@ fn lookup_in_ty_params(name: &ident, ty_params: &ast::ty_param[]) ->
716
711
ret none[ def] ;
717
712
}
718
713
719
- fn lookup_in_pat ( name : & ident , pat : & ast:: pat ) -> option:: t [ def ] {
714
+ fn lookup_in_pat ( name : & ident , pat : & ast:: pat ) -> option:: t [ def_id ] {
720
715
alt pat. node {
721
716
ast:: pat_bind ( p_name) {
722
717
if str:: eq ( p_name, name) {
723
- ret some ( ast :: def_binding ( local_def ( pat. id ) ) ) ;
718
+ ret some ( local_def ( pat. id ) ) ;
724
719
}
725
720
}
726
721
ast:: pat_wild. { }
@@ -739,7 +734,7 @@ fn lookup_in_pat(name: &ident, pat: &ast::pat) -> option::t[def] {
739
734
}
740
735
ast:: pat_box ( inner) { ret lookup_in_pat ( name, * inner) ; }
741
736
}
742
- ret none[ def ] ;
737
+ ret none;
743
738
}
744
739
745
740
fn lookup_in_fn ( name : & ident , decl : & ast:: fn_decl ,
@@ -777,14 +772,17 @@ fn lookup_in_obj(name: &ident, ob: &ast::_obj, ty_params: &ast::ty_param[],
777
772
778
773
fn lookup_in_block ( name : & ident , b : & ast:: blk_ , ns : namespace ) ->
779
774
option:: t [ def ] {
780
- for st: @ast:: stmt in b. stmts {
775
+ for st: @ast:: stmt in b. stmts {
781
776
alt st. node {
782
777
ast:: stmt_decl ( d, _) {
783
778
alt d. node {
784
779
ast:: decl_local ( locs) {
785
- for loc: @ast:: local in locs {
786
- if ns == ns_value && str:: eq ( name, loc. node . ident ) {
787
- ret some ( ast:: def_local ( local_def ( loc. node . id ) ) ) ;
780
+ for loc: @ast:: local in locs {
781
+ if ns == ns_value {
782
+ alt lookup_in_pat ( name, * loc. node . pat ) {
783
+ some ( did) { ret some ( ast:: def_local ( did) ) ; }
784
+ _ { }
785
+ }
788
786
}
789
787
}
790
788
}
@@ -1154,22 +1152,20 @@ fn lookup_external(e: &env, cnum: int, ids: &ident[], ns: namespace) ->
1154
1152
fn check_for_collisions ( e : & @env , c : & ast:: crate ) {
1155
1153
// Module indices make checking those relatively simple -- just check each
1156
1154
// name for multiple entities in the same namespace.
1157
-
1158
- for each m: @{ key : ast:: node_id, val : @indexed_mod} in e. mod_map . items ( )
1159
- {
1160
- for each name: @{ key : ident, val : list[ mod_index_entry] } in
1161
- m. val . index . items ( ) {
1155
+ for each m: @{ key : ast:: node_id, val : @indexed_mod}
1156
+ in e. mod_map . items ( ) {
1157
+ for each name: @{ key : ident, val : list[ mod_index_entry] }
1158
+ in m. val . index . items ( ) {
1162
1159
check_mod_name ( * e, name. key , name. val ) ;
1163
1160
}
1164
1161
}
1165
1162
// Other scopes have to be checked the hard way.
1166
-
1167
- let v =
1168
- @{ visit_item: bind check_item ( e, _, _, _) ,
1169
- visit_block: bind check_block ( e, _, _, _) ,
1170
- visit_arm: bind check_arm ( e, _, _, _) ,
1171
- visit_expr: bind check_expr ( e, _, _, _) ,
1172
- visit_ty: bind check_ty ( e, _, _, _) with * visit:: default_visitor ( ) } ;
1163
+ let v = @{ visit_item: bind check_item ( e, _, _, _) ,
1164
+ visit_block: bind check_block ( e, _, _, _) ,
1165
+ visit_arm: bind check_arm ( e, _, _, _) ,
1166
+ visit_expr: bind check_expr ( e, _, _, _) ,
1167
+ visit_ty: bind check_ty ( e, _, _, _)
1168
+ with * visit:: default_visitor ( ) } ;
1173
1169
visit:: visit_crate ( c, ( ) , visit:: mk_vt ( v) ) ;
1174
1170
}
1175
1171
@@ -1244,29 +1240,30 @@ fn check_item(e: &@env, i: &@ast::item, x: &(), v: &vt[()]) {
1244
1240
}
1245
1241
}
1246
1242
1243
+ fn check_pat ( ch : checker , p : & @ast:: pat ) {
1244
+ alt p. node {
1245
+ ast:: pat_bind ( name) { add_name ( ch, p. span , name) ; }
1246
+ ast:: pat_tag ( _, children) {
1247
+ for child: @ast:: pat in children { check_pat ( ch, child) ; }
1248
+ }
1249
+ ast:: pat_rec ( fields, _) {
1250
+ for f: ast:: field_pat in fields { check_pat ( ch, f. pat ) ; }
1251
+ }
1252
+ ast:: pat_box ( inner) { check_pat ( ch, inner) ; }
1253
+ _ { }
1254
+ }
1255
+ }
1256
+
1247
1257
fn check_arm ( e : & @env , a : & ast:: arm , x : & ( ) , v : & vt[ ( ) ] ) {
1248
1258
visit:: visit_arm ( a, x, v) ;
1249
- fn walk_pat ( ch : checker , p : & @ast:: pat ) {
1250
- alt p. node {
1251
- ast:: pat_bind ( name) { add_name ( ch, p. span , name) ; }
1252
- ast:: pat_tag ( _, children) {
1253
- for child: @ast:: pat in children { walk_pat ( ch, child) ; }
1254
- }
1255
- ast:: pat_rec ( fields, _) {
1256
- for f: ast:: field_pat in fields { walk_pat ( ch, f. pat ) ; }
1257
- }
1258
- ast:: pat_box ( inner) { walk_pat ( ch, inner) ; }
1259
- _ { }
1260
- }
1261
- }
1262
1259
let ch0 = checker ( * e, "binding" ) ;
1263
- walk_pat ( ch0, a. pats . ( 0 ) ) ;
1260
+ check_pat ( ch0, a. pats . ( 0 ) ) ;
1264
1261
let seen0 = ch0. seen ;
1265
1262
let i = ivec:: len ( a. pats ) ;
1266
1263
while i > 1 u {
1267
1264
i -= 1 u;
1268
1265
let ch = checker ( * e, "binding" ) ;
1269
- walk_pat ( ch, a. pats . ( i) ) ;
1266
+ check_pat ( ch, a. pats . ( i) ) ;
1270
1267
1271
1268
// Ensure the bindings introduced in this pattern are the same as in
1272
1269
// the first pattern.
@@ -1297,8 +1294,8 @@ fn check_block(e: &@env, b: &ast::blk, x: &(), v: &vt[()]) {
1297
1294
ast:: stmt_decl ( d, _) {
1298
1295
alt d. node {
1299
1296
ast:: decl_local ( locs) {
1300
- for loc: @ast:: local in locs {
1301
- add_name ( values, d . span , loc. node . ident ) ;
1297
+ for loc: @ast:: local in locs {
1298
+ check_pat ( values, loc. node . pat ) ;
1302
1299
}
1303
1300
}
1304
1301
ast:: decl_item ( it) {
0 commit comments