@@ -64,14 +64,14 @@ tag mod_index_entry {
64
64
mie_item ( @ast:: item) ;
65
65
mie_tag_variant ( @ast:: item /* tag item */ , uint /* variant index */ ) ;
66
66
}
67
- type mod_index = hashmap [ ident, mod_index_entry] ;
67
+ type mod_index = hashmap [ ident, list [ mod_index_entry] ] ;
68
68
type indexed_mod = rec ( ast:: _mod m, mod_index index) ;
69
69
70
- tag native_mod_index_entry {
70
+ tag nmod_index_entry {
71
71
nmie_view_item( @ast : : view_item) ;
72
72
nmie_item ( @ast:: native_item) ;
73
73
}
74
- type nmod_index = hashmap [ ident, native_mod_index_entry ] ;
74
+ type nmod_index = hashmap [ ident, list [ nmod_index_entry ] ] ;
75
75
type indexed_nmod = rec ( ast:: native_mod m, nmod_index index) ;
76
76
77
77
type def_map = hashmap [ uint, def] ;
@@ -340,9 +340,9 @@ fn resolve_import(&env e, &@ast::view_item it, &list[scope] sc) {
340
340
}
341
341
}
342
342
343
- fn register ( & env e, def_id defid, & span sp, ident id,
344
- option:: t[ def] val , option:: t[ def] typ ) {
345
- if ( val == none [ def ] && typ == none [ def ] ) {
343
+ fn register ( & env e, def_id defid, & span sp, & ident id,
344
+ & option:: t[ def] val , & option:: t[ def] typ ) {
345
+ if ( option :: is_none ( val) && option :: is_none ( typ) ) {
346
346
unresolved ( e, sp, id, "import" ) ;
347
347
}
348
348
e. imports . insert ( defid. _1 , resolved ( val, typ) ) ;
@@ -366,7 +366,7 @@ fn ns_name(namespace ns) -> str {
366
366
}
367
367
}
368
368
369
- fn unresolved ( & env e, & span sp, ident id, str kind ) {
369
+ fn unresolved ( & env e, & span sp, & ident id, & str kind ) {
370
370
e. sess . span_err ( sp, "unresolved " + kind + ": " + id) ;
371
371
}
372
372
@@ -392,7 +392,7 @@ fn lookup_path_strict(&env e, &list[scope] sc, &span sp, vec[ident] idents,
392
392
ret dcur;
393
393
}
394
394
395
- fn lookup_in_scope_strict ( & env e, list[ scope] sc , & span sp, ident id,
395
+ fn lookup_in_scope_strict ( & env e, list[ scope] sc , & span sp, & ident id,
396
396
namespace ns) -> def {
397
397
alt ( lookup_in_scope ( e, sc, sp, id, ns) ) {
398
398
case ( none[ def] ) {
@@ -433,9 +433,9 @@ fn def_is_obj_field(&def d) -> bool {
433
433
} ;
434
434
}
435
435
436
- fn lookup_in_scope ( & env e, list[ scope] sc , & span sp, ident id, namespace ns)
436
+ fn lookup_in_scope ( & env e, list[ scope] sc , & span sp, & ident id, namespace ns)
437
437
-> option:: t [ def ] {
438
- fn in_scope ( & env e, ident id, & scope s, namespace ns)
438
+ fn in_scope ( & env e, & ident id, & scope s, namespace ns)
439
439
-> option:: t [ def ] {
440
440
alt ( s) {
441
441
case ( scope_crate ( ?c) ) {
@@ -513,8 +513,8 @@ fn lookup_in_scope(&env e, list[scope] sc, &span sp, ident id, namespace ns)
513
513
auto df = option:: get ( fnd) ;
514
514
if ( ( left_fn && def_is_local ( df) ) ||
515
515
( left_fn_level2 && def_is_obj_field ( df) ) ) {
516
- e. sess . span_err ( sp , "attempted dynamic " +
517
- " environment-capture") ;
516
+ e. sess . span_err
517
+ ( sp , "attempted dynamic environment-capture") ;
518
518
}
519
519
ret fnd;
520
520
}
@@ -528,7 +528,7 @@ fn lookup_in_scope(&env e, list[scope] sc, &span sp, ident id, namespace ns)
528
528
}
529
529
}
530
530
531
- fn lookup_in_ty_params ( ident id, & vec[ ast:: ty_param ] ty_params )
531
+ fn lookup_in_ty_params ( & ident id, & vec[ ast:: ty_param ] ty_params )
532
532
-> option:: t [ def ] {
533
533
auto i = 0 u;
534
534
for ( ast:: ty_param tp in ty_params) {
@@ -540,7 +540,7 @@ fn lookup_in_ty_params(ident id, &vec[ast::ty_param] ty_params)
540
540
ret none[ def] ;
541
541
}
542
542
543
- fn lookup_in_pat ( ident id, & ast:: pat pat) -> option:: t [ def ] {
543
+ fn lookup_in_pat ( & ident id, & ast:: pat pat) -> option:: t [ def ] {
544
544
alt ( pat. node ) {
545
545
case ( ast:: pat_bind ( ?name, ?defid, _) ) {
546
546
if ( _str:: eq ( name, id) ) { ret some ( ast:: def_binding ( defid) ) ; }
@@ -558,7 +558,7 @@ fn lookup_in_pat(ident id, &ast::pat pat) -> option::t[def] {
558
558
}
559
559
560
560
561
- fn lookup_in_fn ( ident id, & ast:: fn_decl decl, & vec[ ast:: ty_param ] ty_params ,
561
+ fn lookup_in_fn ( & ident id, & ast:: fn_decl decl, & vec[ ast:: ty_param ] ty_params ,
562
562
namespace ns) -> option:: t [ def ] {
563
563
if ( ns == ns_value) {
564
564
for ( ast:: arg a in decl. inputs) {
@@ -572,7 +572,7 @@ fn lookup_in_fn(ident id, &ast::fn_decl decl, &vec[ast::ty_param] ty_params,
572
572
}
573
573
}
574
574
575
- fn lookup_in_obj ( ident id, & ast:: _obj ob, & vec[ ast:: ty_param ] ty_params ,
575
+ fn lookup_in_obj ( & ident id, & ast:: _obj ob, & vec[ ast:: ty_param ] ty_params ,
576
576
namespace ns) -> option:: t [ def ] {
577
577
if ( ns == ns_value) {
578
578
for ( ast:: obj_field f in ob. fields) {
@@ -586,7 +586,7 @@ fn lookup_in_obj(ident id, &ast::_obj ob, &vec[ast::ty_param] ty_params,
586
586
}
587
587
}
588
588
589
- fn lookup_in_block ( ident id, & ast:: block_ b, namespace ns)
589
+ fn lookup_in_block ( & ident id, & ast:: block_ b, namespace ns)
590
590
-> option:: t [ def ] {
591
591
for ( @ast:: stmt st in b. stmts) {
592
592
alt ( st. node ) {
@@ -659,7 +659,7 @@ fn found_def_item(@ast::item i, namespace ns) -> option::t[def] {
659
659
ret none[ def] ;
660
660
}
661
661
662
- fn lookup_in_mod_strict ( & env e, def m, & span sp, ident id,
662
+ fn lookup_in_mod_strict ( & env e, def m, & span sp, & ident id,
663
663
namespace ns, dir dr) -> def {
664
664
alt ( lookup_in_mod ( e, m, id, ns, dr) ) {
665
665
case ( none[ def] ) {
@@ -672,7 +672,7 @@ fn lookup_in_mod_strict(&env e, def m, &span sp, ident id,
672
672
}
673
673
}
674
674
675
- fn lookup_in_mod ( & env e, def m, ident id, namespace ns, dir dr)
675
+ fn lookup_in_mod ( & env e, def m, & ident id, namespace ns, dir dr)
676
676
-> option:: t [ def ] {
677
677
auto defid = ast:: def_id_of_def ( m) ;
678
678
if ( defid. _0 != ast:: local_crate) { // Not in this crate
@@ -728,15 +728,32 @@ fn lookup_import(&env e, def_id defid, namespace ns) -> option::t[def] {
728
728
}
729
729
}
730
730
731
- fn lookup_in_regular_mod ( & env e, def_id defid, ident id, namespace ns, dir dr)
731
+ fn lookup_in_regular_mod ( & env e, def_id defid, & ident id, namespace ns, dir dr)
732
732
-> option:: t [ def ] {
733
733
auto info = e. mod_map . get ( defid. _1 ) ;
734
734
auto found = info. index . find ( id) ;
735
- if ( found == none [ mod_index_entry ] ||
735
+ if ( option :: is_none ( found) ||
736
736
( dr == outside && !ast:: is_exported ( id, info. m ) ) ) {
737
737
ret none[ def] ;
738
738
}
739
- alt ( option:: get ( found) ) {
739
+ auto lst = option:: get ( found) ;
740
+ while ( true ) {
741
+ alt ( lst) {
742
+ case ( nil[ mod_index_entry] ) {
743
+ ret none[ def] ;
744
+ }
745
+ case ( cons[ mod_index_entry] ( ?hd, ?tl) ) {
746
+ auto found = lookup_in_mie ( e, hd, ns) ;
747
+ if ( !option:: is_none ( found) ) { ret found; }
748
+ lst = * tl;
749
+ }
750
+ }
751
+ }
752
+ }
753
+
754
+ fn lookup_in_mie ( & env e, & mod_index_entry mie, namespace ns)
755
+ -> option:: t [ def ] {
756
+ alt ( mie) {
740
757
case ( mie_view_item ( ?view_item) ) {
741
758
ret found_view_item ( e, view_item, ns) ;
742
759
}
@@ -754,18 +771,35 @@ fn lookup_in_regular_mod(&env e, def_id defid, ident id, namespace ns, dir dr)
754
771
}
755
772
}
756
773
}
757
- }
774
+ }
758
775
}
759
776
}
760
777
761
- fn lookup_in_native_mod ( & env e, def_id defid, ident id, namespace ns)
778
+ fn lookup_in_native_mod ( & env e, def_id defid, & ident id, namespace ns)
762
779
-> option:: t [ def ] {
763
780
auto info = e. nmod_map . get ( defid. _1 ) ;
764
781
auto found = info. index . find ( id) ;
765
- if ( found == none [ native_mod_index_entry ] ) {
782
+ if ( option :: is_none ( found) ) {
766
783
ret none[ def] ;
767
784
}
768
- alt ( option:: get ( found) ) {
785
+ auto lst = option:: get ( found) ;
786
+ while ( true ) {
787
+ alt ( lst) {
788
+ case ( nil[ nmod_index_entry] ) {
789
+ ret none[ def] ;
790
+ }
791
+ case ( cons[ nmod_index_entry] ( ?hd, ?tl) ) {
792
+ auto found = lookup_in_nmie ( e, hd, ns) ;
793
+ if ( !option:: is_none ( found) ) { ret found; }
794
+ lst = * tl;
795
+ }
796
+ }
797
+ }
798
+ }
799
+
800
+ fn lookup_in_nmie ( & env e, & nmod_index_entry nmie, namespace ns)
801
+ -> option:: t [ def ] {
802
+ alt ( nmie) {
769
803
case ( nmie_view_item ( ?view_item) ) {
770
804
ret found_view_item ( e, view_item, ns) ;
771
805
}
@@ -790,16 +824,27 @@ fn lookup_in_native_mod(&env e, def_id defid, ident id, namespace ns)
790
824
791
825
// Module indexing
792
826
827
+ fn add_to_index[ T ] ( & hashmap[ ident, list[ T ] ] index, & ident id, & T ent) {
828
+ alt ( index. find ( id) ) {
829
+ case ( none[ list[ T ] ] ) {
830
+ index. insert ( id, cons ( ent, @nil[ T ] ) ) ;
831
+ }
832
+ case ( some[ list[ T ] ] ( ?prev) ) {
833
+ index. insert ( id, cons ( ent, @prev) ) ;
834
+ }
835
+ }
836
+ }
837
+
793
838
fn index_mod ( & ast:: _mod md) -> mod_index {
794
- auto index = new_str_hash[ mod_index_entry] ( ) ;
839
+ auto index = new_str_hash[ list [ mod_index_entry] ] ( ) ;
795
840
796
841
for ( @ast:: view_item it in md. view_items) {
797
842
alt ( it. node ) {
798
843
case ( ast:: view_item_use ( ?id, _, _, _) ) {
799
- index . insert ( id, mie_view_item ( it) ) ;
844
+ add_to_index ( index , id, mie_view_item ( it) ) ;
800
845
}
801
846
case ( ast:: view_item_import ( ?def_ident, _, _) ) {
802
- index . insert ( def_ident, mie_view_item ( it) ) ;
847
+ add_to_index ( index , def_ident, mie_view_item ( it) ) ;
803
848
}
804
849
case ( ast:: view_item_export ( _) ) { }
805
850
}
@@ -808,31 +853,31 @@ fn index_mod(&ast::_mod md) -> mod_index {
808
853
for ( @ast:: item it in md. items) {
809
854
alt ( it. node ) {
810
855
case ( ast:: item_const ( ?id, _, _, _, _) ) {
811
- index . insert ( id, mie_item ( it) ) ;
856
+ add_to_index ( index , id, mie_item ( it) ) ;
812
857
}
813
858
case ( ast:: item_fn ( ?id, _, _, _, _) ) {
814
- index . insert ( id, mie_item ( it) ) ;
859
+ add_to_index ( index , id, mie_item ( it) ) ;
815
860
}
816
861
case ( ast:: item_mod ( ?id, _, _) ) {
817
- index . insert ( id, mie_item ( it) ) ;
862
+ add_to_index ( index , id, mie_item ( it) ) ;
818
863
}
819
864
case ( ast:: item_native_mod ( ?id, _, _) ) {
820
- index . insert ( id, mie_item ( it) ) ;
865
+ add_to_index ( index , id, mie_item ( it) ) ;
821
866
}
822
867
case ( ast:: item_ty ( ?id, _, _, _, _) ) {
823
- index . insert ( id, mie_item ( it) ) ;
868
+ add_to_index ( index , id, mie_item ( it) ) ;
824
869
}
825
870
case ( ast:: item_tag ( ?id, ?variants, _, _, _) ) {
826
- index . insert ( id, mie_item ( it) ) ;
871
+ add_to_index ( index , id, mie_item ( it) ) ;
827
872
let uint variant_idx = 0 u;
828
873
for ( ast:: variant v in variants) {
829
- index . insert ( v. node . name ,
830
- mie_tag_variant ( it, variant_idx) ) ;
874
+ add_to_index ( index , v. node . name ,
875
+ mie_tag_variant ( it, variant_idx) ) ;
831
876
variant_idx += 1 u;
832
877
}
833
878
}
834
879
case ( ast:: item_obj ( ?id, _, _, _, _) ) {
835
- index . insert ( id, mie_item ( it) ) ;
880
+ add_to_index ( index , id, mie_item ( it) ) ;
836
881
}
837
882
}
838
883
}
@@ -841,12 +886,12 @@ fn index_mod(&ast::_mod md) -> mod_index {
841
886
}
842
887
843
888
fn index_nmod ( & ast:: native_mod md) -> nmod_index {
844
- auto index = new_str_hash[ native_mod_index_entry ] ( ) ;
889
+ auto index = new_str_hash[ list [ nmod_index_entry ] ] ( ) ;
845
890
846
891
for ( @ast:: view_item it in md. view_items) {
847
892
alt ( it. node ) {
848
893
case ( ast:: view_item_import ( ?def_ident, _, _) ) {
849
- index . insert ( def_ident, nmie_view_item ( it) ) ;
894
+ add_to_index ( index , def_ident, nmie_view_item ( it) ) ;
850
895
}
851
896
case ( ast:: view_item_export ( _) ) { }
852
897
}
@@ -855,10 +900,10 @@ fn index_nmod(&ast::native_mod md) -> nmod_index {
855
900
for ( @ast:: native_item it in md. items) {
856
901
alt ( it. node ) {
857
902
case ( ast:: native_item_ty ( ?id, _) ) {
858
- index . insert ( id, nmie_item ( it) ) ;
903
+ add_to_index ( index , id, nmie_item ( it) ) ;
859
904
}
860
905
case ( ast:: native_item_fn ( ?id, _, _, _, _, _) ) {
861
- index . insert ( id, nmie_item ( it) ) ;
906
+ add_to_index ( index , id, nmie_item ( it) ) ;
862
907
}
863
908
}
864
909
}
0 commit comments