@@ -76,17 +76,11 @@ tag mod_index_entry {
76
76
type mod_index = hashmap [ ident, list[ mod_index_entry] ] ;
77
77
78
78
type indexed_mod = rec ( option:: t[ ast:: _mod ] m ,
79
- mod_index index, vec[ @i_m ] glob_imports ) ;
79
+ mod_index index, vec[ def ] glob_imports ) ;
80
80
/* native modules can't contain tags, and we don't store their ASTs because we
81
81
only need to look at them to determine exports, which they can't control.*/
82
82
// It should be safe to use index to memoize lookups of globbed names.
83
83
84
- //FIXME: this only exists because we can't yet write recursive types unless
85
- //the recursion passes through a tag.
86
- tag i_m {
87
- i_m( indexed_mod) ;
88
- }
89
-
90
84
type crate_map = hashmap [ uint, ast:: crate_num] ;
91
85
92
86
type def_map = hashmap [ uint, def] ;
@@ -144,7 +138,7 @@ fn map_crate(&@env e, &ast::crate c) {
144
138
// Register the top-level mod
145
139
e. mod_map . insert ( -1 , @rec ( m=some ( c. node . module ) ,
146
140
index=index_mod ( c. node . module ) ,
147
- glob_imports=vec:: empty[ @i_m ] ( ) ) ) ;
141
+ glob_imports=vec:: empty[ def ] ( ) ) ) ;
148
142
walk:: walk_crate ( index_names, c) ;
149
143
150
144
fn index_vi ( @env e , @mutable list[ scope] sc , & @ast:: view_item i) {
@@ -161,13 +155,13 @@ fn map_crate(&@env e, &ast::crate c) {
161
155
case ( ast:: item_mod ( _, ?md, ?defid) ) {
162
156
e. mod_map . insert ( defid. _1 ,
163
157
@rec ( m=some ( md) , index=index_mod ( md) ,
164
- glob_imports=vec:: empty[ @i_m ] ( ) ) ) ;
158
+ glob_imports=vec:: empty[ def ] ( ) ) ) ;
165
159
}
166
160
case ( ast:: item_native_mod ( _, ?nmd, ?defid) ) {
167
161
e. mod_map . insert ( defid. _1 ,
168
162
@rec ( m=none[ ast:: _mod] ,
169
163
index=index_nmod ( nmd) ,
170
- glob_imports=vec:: empty[ @i_m ] ( ) ) ) ;
164
+ glob_imports=vec:: empty[ def ] ( ) ) ) ;
171
165
}
172
166
case ( _) { }
173
167
}
@@ -370,10 +364,8 @@ fn pop_env_for_arm(@mutable list[scope] sc, &ast::arm p) {
370
364
* sc = std:: list:: cdr ( * sc) ;
371
365
}
372
366
373
-
374
- //HERE
375
367
fn follow_import ( & env e, & list[ scope] sc , vec[ ident] path , & span sp)
376
- -> @ i_m {
368
+ -> def {
377
369
auto path_len = vec:: len ( path) ;
378
370
auto dcur = lookup_in_scope_strict ( e, sc, sp, path. ( 0 ) , ns_module) ;
379
371
auto i = 1 u;
@@ -385,13 +377,8 @@ fn follow_import(&env e, &list[scope] sc, vec[ident] path, &span sp)
385
377
}
386
378
387
379
alt ( dcur) {
388
- case ( ast:: def_mod ( ?def_id) ) {
389
- //TODO: is this sane?
390
- ret @i_m( * e. mod_map . get ( def_id. _1 ) ) ;
391
- }
392
- case ( ast:: def_native_mod ( ?def_id) ) {
393
- ret @i_m( * e. mod_map . get ( def_id. _1 ) ) ;
394
- }
380
+ case ( ast:: def_mod ( ?def_id) ) { ret dcur; }
381
+ case ( ast:: def_native_mod ( ?def_id) ) { ret dcur; }
395
382
case ( _) {
396
383
e. sess . span_err ( sp, str:: connect ( path, "::" )
397
384
+ " does not name a module." ) ;
@@ -430,9 +417,12 @@ fn resolve_import(&env e, &@ast::view_item it, &list[scope] sc) {
430
417
while ( true ) {
431
418
if ( i == n_idents - 1 u) {
432
419
register ( e, defid, it. span , end_id,
433
- lookup_in_mod ( e, dcur, end_id, ns_value, outside) ,
434
- lookup_in_mod ( e, dcur, end_id, ns_type, outside) ,
435
- lookup_in_mod ( e, dcur, end_id, ns_module, outside) ) ;
420
+ lookup_in_mod ( e, dcur, it. span , end_id, ns_value,
421
+ outside) ,
422
+ lookup_in_mod ( e, dcur, it. span , end_id, ns_type,
423
+ outside) ,
424
+ lookup_in_mod ( e, dcur, it. span , end_id, ns_module,
425
+ outside) ) ;
436
426
break ;
437
427
} else {
438
428
dcur = lookup_in_mod_strict ( e, dcur, it. span , ids. ( i) ,
@@ -526,12 +516,12 @@ fn def_is_obj_field(&def d) -> bool {
526
516
527
517
fn lookup_in_scope ( & env e, list[ scope] sc , & span sp, & ident id, namespace ns)
528
518
-> option:: t [ def ] {
529
- fn in_scope ( & env e, & ident id, & scope s, namespace ns)
519
+ fn in_scope ( & env e, & span sp , & ident id, & scope s, namespace ns)
530
520
-> option:: t [ def ] {
531
521
alt ( s) {
532
522
case ( scope_crate ( ?c) ) {
533
523
auto defid = tup ( ast:: local_crate, -1 ) ;
534
- ret lookup_in_local_mod ( e, defid, id, ns, inside) ;
524
+ ret lookup_in_local_mod ( e, defid, sp , id, ns, inside) ;
535
525
}
536
526
case ( scope_item ( ?it) ) {
537
527
alt ( it. node ) {
@@ -547,10 +537,10 @@ fn lookup_in_scope(&env e, list[scope] sc, &span sp, &ident id, namespace ns)
547
537
}
548
538
}
549
539
case ( ast:: item_mod ( _, _, ?defid) ) {
550
- ret lookup_in_local_mod ( e, defid, id, ns, inside) ;
540
+ ret lookup_in_local_mod ( e, defid, sp , id, ns, inside) ;
551
541
}
552
542
case ( ast:: item_native_mod ( _, ?m, ?defid) ) {
553
- ret lookup_in_local_native_mod ( e, defid, id, ns) ;
543
+ ret lookup_in_local_native_mod ( e, defid, sp , id, ns) ;
554
544
}
555
545
case ( ast:: item_ty ( _, _, ?ty_params, _, _) ) {
556
546
if ( ns == ns_type) {
@@ -599,7 +589,7 @@ fn lookup_in_scope(&env e, list[scope] sc, &span sp, &ident id, namespace ns)
599
589
ret none[ def] ;
600
590
}
601
591
case ( cons[ scope] ( ?hd, ?tl) ) {
602
- auto fnd = in_scope ( e, id, hd, ns) ;
592
+ auto fnd = in_scope ( e, sp , id, hd, ns) ;
603
593
if ( !option:: is_none ( fnd) ) {
604
594
auto df = option:: get ( fnd) ;
605
595
if ( ( left_fn && def_is_local ( df) ) ||
@@ -618,6 +608,7 @@ fn lookup_in_scope(&env e, list[scope] sc, &span sp, &ident id, namespace ns)
618
608
}
619
609
}
620
610
e. sess . bug ( "reached unreachable code in lookup_in_scope" ) ; // sigh
611
+ fail;
621
612
}
622
613
623
614
fn lookup_in_ty_params ( & ident id, & vec[ ast:: ty_param ] ty_params )
@@ -764,7 +755,7 @@ fn found_def_item(&@ast::item i, namespace ns) -> option::t[def] {
764
755
765
756
fn lookup_in_mod_strict ( & env e, def m, & span sp, & ident id,
766
757
namespace ns, dir dr) -> def {
767
- alt ( lookup_in_mod ( e, m, id, ns, dr) ) {
758
+ alt ( lookup_in_mod ( e, m, sp , id, ns, dr) ) {
768
759
case ( none[ def] ) {
769
760
unresolved ( e, sp, id, ns_name ( ns) ) ;
770
761
fail;
@@ -775,10 +766,10 @@ fn lookup_in_mod_strict(&env e, def m, &span sp, &ident id,
775
766
}
776
767
}
777
768
778
- fn lookup_in_mod ( & env e, def m, & ident id, namespace ns, dir dr)
769
+ fn lookup_in_mod ( & env e, def m, & span sp , & ident id, namespace ns, dir dr)
779
770
-> option:: t [ def ] {
780
771
auto defid = ast:: def_id_of_def ( m) ;
781
- if ( defid. _0 != ast:: local_crate) { // Not in this crate
772
+ if ( defid. _0 != ast:: local_crate) { // examining a mod. in an ext. crate
782
773
auto cached = e. ext_cache . find ( tup ( defid, id, ns) ) ;
783
774
if ( !option:: is_none ( cached) ) { ret cached; }
784
775
auto path = [ id] ;
@@ -793,10 +784,10 @@ fn lookup_in_mod(&env e, def m, &ident id, namespace ns, dir dr)
793
784
}
794
785
alt ( m) {
795
786
case ( ast:: def_mod ( ?defid) ) {
796
- ret lookup_in_local_mod ( e, defid, id, ns, dr) ;
787
+ ret lookup_in_local_mod ( e, defid, sp , id, ns, dr) ;
797
788
}
798
789
case ( ast:: def_native_mod ( ?defid) ) {
799
- ret lookup_in_local_native_mod ( e, defid, id, ns) ;
790
+ ret lookup_in_local_native_mod ( e, defid, sp , id, ns) ;
800
791
}
801
792
}
802
793
}
@@ -811,7 +802,7 @@ fn found_view_item(&env e, @ast::view_item vi, namespace ns)
811
802
ret lookup_import ( e, defid, ns) ;
812
803
}
813
804
case ( ast:: view_item_import_glob ( _, ?defid) ) {
814
- ret none[ def] ; //TODO: think about this. Is it correct?
805
+ ret none[ def] ; //will be handled in the fallback glob pass
815
806
}
816
807
}
817
808
}
@@ -834,29 +825,53 @@ fn lookup_import(&env e, def_id defid, namespace ns) -> option::t[def] {
834
825
fail;
835
826
}
836
827
837
- fn lookup_in_local_mod ( & env e, def_id defid, & ident id , namespace ns ,
838
- dir dr) -> option:: t [ def ] {
828
+ fn lookup_in_local_mod ( & env e, def_id defid, & span sp , & ident id ,
829
+ namespace ns , dir dr) -> option:: t [ def ] {
839
830
auto info = e. mod_map . get ( defid. _1 ) ;
840
- auto found = info. index . find ( id) ;
841
- if ( option:: is_none ( found) ||
842
- ( dr == outside && !ast:: is_exported ( id, option:: get ( info. m ) ) ) ) {
831
+ if ( dr == outside && !ast:: is_exported ( id, option:: get ( info. m ) ) ) {
843
832
// if we're in a native mod, then dr==inside, so info.m is some _mod
844
- ret none[ def] ;
833
+ ret none[ def] ; // name is not visible
845
834
}
846
- auto lst = option:: get ( found) ;
847
- while ( true ) {
848
- alt ( lst) {
849
- case ( nil[ mod_index_entry] ) {
850
- ret none[ def] ;
851
- }
852
- case ( cons[ mod_index_entry] ( ?hd, ?tl) ) {
853
- auto found = lookup_in_mie ( e, hd, ns) ;
854
- if ( !option:: is_none ( found) ) { ret found; }
855
- lst = * tl;
835
+ alt ( info. index . find ( id) ) {
836
+ case ( none[ list[ mod_index_entry] ] ) { }
837
+ case ( some[ list[ mod_index_entry] ] ( ?lst) ) {
838
+ while ( true ) {
839
+ alt ( lst) {
840
+ case ( nil[ mod_index_entry] ) { break ; }
841
+ case ( cons[ mod_index_entry] ( ?hd, ?tl) ) {
842
+ auto found = lookup_in_mie ( e, hd, ns) ;
843
+ if ( !option:: is_none ( found) ) { ret found; }
844
+ lst = * tl;
845
+ }
846
+ }
856
847
}
857
848
}
858
849
}
859
- e. sess . bug ( "reached unreachable code in lookup_in_regular_mod" ) ; // sigh
850
+ // not local or explicitly imported; try globs:
851
+ ret lookup_glob_in_mod ( e, info, sp, id, ns, dr) ;
852
+ }
853
+
854
+ fn lookup_glob_in_mod ( & env e, @indexed_mod info , & span sp, & ident id,
855
+ namespace ns, dir dr) -> option:: t [ def ] {
856
+ fn l_i_m ( & env e, & def d, & span sp, & ident id, namespace ns, dir dr)
857
+ -> option:: t [ def ] {
858
+ ret lookup_in_mod ( e, d, sp, id, ns, dr) ;
859
+ }
860
+ auto matches = vec:: filter_map
861
+ ( bind l_i_m ( e, _, sp, id, ns, dr) , info. glob_imports ) ;
862
+ if ( vec:: len ( matches) == 0 u) {
863
+ ret none[ def] ;
864
+ } else if ( vec:: len ( matches) == 1 u) {
865
+ ret some[ def] ( matches. ( 0 ) ) ;
866
+ } else {
867
+ for ( def d in matches) {
868
+ e. sess . span_note ( sp, "'" + id + "' is defined at " +
869
+ util:: common:: istr ( ast:: def_id_of_def ( d) . _1 ) ) ;
870
+ }
871
+ e. sess . span_err ( sp, "'" + id + "' is glob-imported from" +
872
+ " multiple different modules." ) ;
873
+ fail;
874
+ }
860
875
}
861
876
862
877
fn lookup_in_mie ( & env e, & mod_index_entry mie, namespace ns)
@@ -899,9 +914,9 @@ fn lookup_in_mie(&env e, &mod_index_entry mie, namespace ns)
899
914
ret none[ def] ;
900
915
}
901
916
902
- fn lookup_in_local_native_mod ( & env e, def_id defid, & ident id, namespace ns )
903
- -> option:: t [ def ] {
904
- ret lookup_in_local_mod ( e, defid, id, ns, inside) ;
917
+ fn lookup_in_local_native_mod ( & env e, def_id defid, & span sp , & ident id,
918
+ namespace ns ) -> option:: t [ def ] {
919
+ ret lookup_in_local_mod ( e, defid, sp , id, ns, inside) ;
905
920
}
906
921
907
922
0 commit comments