@@ -70,24 +70,20 @@ fn new_ext_hash() -> ext_hash {
70
70
tag mod_index_entry {
71
71
mie_view_item( @ast : : view_item) ;
72
72
mie_item ( @ast:: item) ;
73
+ mie_native_item ( @ast:: native_item) ;
73
74
mie_tag_variant ( @ast:: item /* tag item */ , uint /* variant index */ ) ;
74
75
}
75
76
type mod_index = hashmap [ ident, list[ mod_index_entry] ] ;
76
- type indexed_mod = rec ( ast:: _mod m, mod_index index) ;
77
+ type indexed_mod = rec ( option:: t[ ast:: _mod ] m , mod_index index) ;
78
+ /* native modules can't contain tags, and we don't store their ASTs because we
79
+ only need to look at them to determine exports, which they can't control.*/
77
80
78
- tag nmod_index_entry {
79
- nmie_view_item( @ast : : view_item) ;
80
- nmie_item ( @ast:: native_item) ;
81
- }
82
- type nmod_index = hashmap [ ident, list[ nmod_index_entry] ] ;
83
- type indexed_nmod = rec ( ast:: native_mod m, nmod_index index) ;
84
81
85
82
type def_map = hashmap [ uint, def] ;
86
83
87
84
type env = rec ( def_map def_map,
88
85
hashmap[ ast:: def_num, import_state] imports ,
89
86
hashmap[ ast:: def_num, @indexed_mod] mod_map ,
90
- hashmap[ ast:: def_num, @indexed_nmod] nmod_map ,
91
87
hashmap[ def_id, vec[ ident] ] ext_map ,
92
88
ext_hash ext_cache ,
93
89
session sess) ;
@@ -106,7 +102,6 @@ fn resolve_crate(session sess, @ast::crate crate) -> def_map {
106
102
auto e = @rec ( def_map = new_uint_hash[ def] ( ) ,
107
103
imports = new_int_hash[ import_state] ( ) ,
108
104
mod_map = new_int_hash[ @indexed_mod] ( ) ,
109
- nmod_map = new_int_hash[ @indexed_nmod] ( ) ,
110
105
ext_map = new_def_hash[ vec[ ident] ] ( ) ,
111
106
ext_cache = new_ext_hash ( ) ,
112
107
sess = sess) ;
@@ -129,7 +124,7 @@ fn map_crate(&@env e, &ast::crate c) {
129
124
visit_item_post = bind pop_env_for_item ( cell, _)
130
125
with walk:: default_visitor ( ) ) ;
131
126
// Register the top-level mod
132
- e. mod_map . insert ( -1 , @rec ( m=c. node . module ,
127
+ e. mod_map . insert ( -1 , @rec ( m=some ( c. node . module ) ,
133
128
index=index_mod ( c. node . module ) ) ) ;
134
129
walk:: walk_crate ( v, c) ;
135
130
@@ -146,11 +141,13 @@ fn map_crate(&@env e, &ast::crate c) {
146
141
alt ( i. node ) {
147
142
case ( ast:: item_mod ( _, ?md, ?defid) ) {
148
143
auto index = index_mod ( md) ;
149
- e. mod_map . insert ( defid. _1 , @rec ( m=md, index=index) ) ;
144
+ e. mod_map . insert ( defid. _1 , @rec ( m=some ( md) ,
145
+ index=index) ) ;
150
146
}
151
147
case ( ast:: item_native_mod ( _, ?nmd, ?defid) ) {
152
148
auto index = index_nmod ( nmd) ;
153
- e. nmod_map . insert ( defid. _1 , @rec ( m=nmd, index=index) ) ;
149
+ e. mod_map . insert ( defid. _1 , @rec ( m=none[ ast:: _mod] ,
150
+ index=index) ) ;
154
151
}
155
152
case ( _) { }
156
153
}
@@ -438,7 +435,7 @@ fn lookup_in_scope(&env e, list[scope] sc, &span sp, &ident id, namespace ns)
438
435
alt ( s) {
439
436
case ( scope_crate ( ?c) ) {
440
437
auto defid = tup ( ast:: local_crate, -1 ) ;
441
- ret lookup_in_regular_mod ( e, defid, id, ns, inside) ;
438
+ ret lookup_in_local_mod ( e, defid, id, ns, inside) ;
442
439
}
443
440
case ( scope_item ( ?it) ) {
444
441
alt ( it. node ) {
@@ -454,10 +451,10 @@ fn lookup_in_scope(&env e, list[scope] sc, &span sp, &ident id, namespace ns)
454
451
}
455
452
}
456
453
case ( ast:: item_mod ( _, _, ?defid) ) {
457
- ret lookup_in_regular_mod ( e, defid, id, ns, inside) ;
454
+ ret lookup_in_local_mod ( e, defid, id, ns, inside) ;
458
455
}
459
456
case ( ast:: item_native_mod ( _, ?m, ?defid) ) {
460
- ret lookup_in_native_mod ( e, defid, id, ns) ;
457
+ ret lookup_in_local_native_mod ( e, defid, id, ns) ;
461
458
}
462
459
case ( ast:: item_ty ( _, _, ?ty_params, _, _) ) {
463
460
if ( ns == ns_type) {
@@ -524,6 +521,7 @@ fn lookup_in_scope(&env e, list[scope] sc, &span sp, &ident id, namespace ns)
524
521
}
525
522
}
526
523
}
524
+ fail;
527
525
}
528
526
529
527
fn lookup_in_ty_params ( & ident id, & vec[ ast:: ty_param ] ty_params )
@@ -699,10 +697,10 @@ fn lookup_in_mod(&env e, def m, &ident id, namespace ns, dir dr)
699
697
}
700
698
alt ( m) {
701
699
case ( ast:: def_mod ( ?defid) ) {
702
- ret lookup_in_regular_mod ( e, defid, id, ns, dr) ;
700
+ ret lookup_in_local_mod ( e, defid, id, ns, dr) ;
703
701
}
704
702
case ( ast:: def_native_mod ( ?defid) ) {
705
- ret lookup_in_native_mod ( e, defid, id, ns) ;
703
+ ret lookup_in_local_native_mod ( e, defid, id, ns) ;
706
704
}
707
705
}
708
706
}
@@ -734,14 +732,16 @@ fn lookup_import(&env e, def_id defid, namespace ns) -> option::t[def] {
734
732
case ( ns_module) { md } } ;
735
733
}
736
734
}
735
+ fail;
737
736
}
738
737
739
- fn lookup_in_regular_mod ( & env e, def_id defid, & ident id, namespace ns,
740
- dir dr) -> option:: t [ def ] {
738
+ fn lookup_in_local_mod ( & env e, def_id defid, & ident id, namespace ns,
739
+ dir dr) -> option:: t [ def ] {
741
740
auto info = e. mod_map . get ( defid. _1 ) ;
742
741
auto found = info. index . find ( id) ;
743
742
if ( option:: is_none ( found) ||
744
- ( dr == outside && !ast:: is_exported ( id, info. m ) ) ) {
743
+ ( dr == outside && !ast:: is_exported ( id, option:: get ( info. m ) ) ) ) {
744
+ // if we're in a native mod, then dr==inside, so info.m is some _mod
745
745
ret none[ def] ;
746
746
}
747
747
auto lst = option:: get ( found) ;
@@ -757,6 +757,7 @@ fn lookup_in_regular_mod(&env e, def_id defid, &ident id, namespace ns,
757
757
}
758
758
}
759
759
}
760
+ fail;
760
761
}
761
762
762
763
fn lookup_in_mie ( & env e, & mod_index_entry mie, namespace ns)
@@ -780,39 +781,8 @@ fn lookup_in_mie(&env e, &mod_index_entry mie, namespace ns)
780
781
}
781
782
}
782
783
}
783
- }
784
- }
785
-
786
- fn lookup_in_native_mod ( & env e, def_id defid, & ident id, namespace ns)
787
- -> option:: t [ def ] {
788
- auto info = e. nmod_map . get ( defid. _1 ) ;
789
- auto found = info. index . find ( id) ;
790
- if ( option:: is_none ( found) ) {
791
- ret none[ def] ;
792
- }
793
- auto lst = option:: get ( found) ;
794
- while ( true ) {
795
- alt ( lst) {
796
- case ( nil[ nmod_index_entry] ) {
797
- ret none[ def] ;
798
- }
799
- case ( cons[ nmod_index_entry] ( ?hd, ?tl) ) {
800
- auto found = lookup_in_nmie ( e, hd, ns) ;
801
- if ( !option:: is_none ( found) ) { ret found; }
802
- lst = * tl;
803
- }
804
- }
805
- }
806
- }
807
-
808
- fn lookup_in_nmie ( & env e, & nmod_index_entry nmie, namespace ns)
809
- -> option:: t [ def ] {
810
- alt ( nmie) {
811
- case ( nmie_view_item ( ?view_item) ) {
812
- ret found_view_item ( e, view_item, ns) ;
813
- }
814
- case ( nmie_item ( ?item) ) {
815
- alt ( item. node ) {
784
+ case ( mie_native_item ( ?native_item) ) {
785
+ alt ( native_item. node ) {
816
786
case ( ast:: native_item_ty ( _, ?id) ) {
817
787
if ( ns == ns_type) {
818
788
ret some ( ast:: def_native_ty ( id) ) ;
@@ -830,6 +800,12 @@ fn lookup_in_nmie(&env e, &nmod_index_entry nmie, namespace ns)
830
800
ret none[ def] ;
831
801
}
832
802
803
+ fn lookup_in_local_native_mod ( & env e, def_id defid, & ident id, namespace ns)
804
+ -> option:: t [ def ] {
805
+ ret lookup_in_local_mod ( e, defid, id, ns, inside) ;
806
+ }
807
+
808
+
833
809
// Module indexing
834
810
835
811
fn add_to_index[ T ] ( & hashmap[ ident, list[ T ] ] index, & ident id, & T ent) {
@@ -893,13 +869,13 @@ fn index_mod(&ast::_mod md) -> mod_index {
893
869
ret index;
894
870
}
895
871
896
- fn index_nmod ( & ast:: native_mod md) -> nmod_index {
897
- auto index = new_str_hash[ list[ nmod_index_entry ] ] ( ) ;
872
+ fn index_nmod ( & ast:: native_mod md) -> mod_index {
873
+ auto index = new_str_hash[ list[ mod_index_entry ] ] ( ) ;
898
874
899
875
for ( @ast:: view_item it in md. view_items) {
900
876
alt ( it. node ) {
901
877
case ( ast:: view_item_import ( ?def_ident, _, _) ) {
902
- add_to_index ( index, def_ident, nmie_view_item ( it) ) ;
878
+ add_to_index ( index, def_ident, mie_view_item ( it) ) ;
903
879
}
904
880
case ( ast:: view_item_export ( _) ) { }
905
881
}
@@ -908,10 +884,10 @@ fn index_nmod(&ast::native_mod md) -> nmod_index {
908
884
for ( @ast:: native_item it in md. items) {
909
885
alt ( it. node ) {
910
886
case ( ast:: native_item_ty ( ?id, _) ) {
911
- add_to_index ( index, id, nmie_item ( it) ) ;
887
+ add_to_index ( index, id, mie_native_item ( it) ) ;
912
888
}
913
889
case ( ast:: native_item_fn ( ?id, _, _, _, _, _) ) {
914
- add_to_index ( index, id, nmie_item ( it) ) ;
890
+ add_to_index ( index, id, mie_native_item ( it) ) ;
915
891
}
916
892
}
917
893
}
@@ -952,20 +928,11 @@ fn lookup_external(&env e, int cnum, vec[ident] ids, namespace ns)
952
928
// Collision detection
953
929
954
930
fn check_for_collisions ( & @env e , & ast:: crate c) {
955
- auto lim = lookup_in_mie;
956
931
auto msp = mie_span;
957
932
for each ( @tup( ast:: def_num, @indexed_mod) m in e. mod_map . items ( ) ) {
958
933
for each ( @tup( ident, list[ mod_index_entry] ) name in
959
934
m. _1 . index . items ( ) ) {
960
- check_mod_name ( * e, name. _0 , name. _1 , lim, msp) ;
961
- }
962
- }
963
- auto linm = lookup_in_nmie;
964
- auto nmsp = nmie_span;
965
- for each ( @tup( ast:: def_num, @indexed_nmod) m in e. nmod_map . items ( ) ) {
966
- for each ( @tup( ident, list[ nmod_index_entry] ) name in
967
- m. _1 . index . items ( ) ) {
968
- check_mod_name ( * e, name. _0 , name. _1 , linm, nmsp) ;
935
+ check_mod_name ( * e, name. _0 , name. _1 ) ;
969
936
}
970
937
}
971
938
/*
@@ -977,9 +944,7 @@ fn check_for_collisions(&@env e, &ast::crate c) {
977
944
}*/
978
945
}
979
946
980
- fn check_mod_name[ T ] ( & env e, & ident name, & list[ T ] entries,
981
- fn ( & env, & T , namespace) -> option:: t[ def] test,
982
- fn ( & T ) -> span get_span) {
947
+ fn check_mod_name ( & env e, & ident name, & list[ mod_index_entry] entries ) {
983
948
auto saw_mod = false ; auto saw_type = false ; auto saw_value = false ;
984
949
985
950
fn dup ( & env e, & span sp, & str word , & ident name) {
@@ -988,22 +953,22 @@ fn check_mod_name[T](&env e, &ident name, &list[T] entries,
988
953
989
954
while ( true ) {
990
955
alt ( entries) {
991
- case ( cons[ T ] ( ?entry, ?rest) ) {
992
- if ( !option:: is_none ( test ( e, entry, ns_value) ) ) {
993
- if ( saw_value) { dup ( e, get_span ( entry) , "" , name) ; }
956
+ case ( cons[ mod_index_entry ] ( ?entry, ?rest) ) {
957
+ if ( !option:: is_none ( lookup_in_mie ( e, entry, ns_value) ) ) {
958
+ if ( saw_value) { dup ( e, mie_span ( entry) , "" , name) ; }
994
959
else { saw_value = true ; }
995
960
}
996
- if ( !option:: is_none ( test ( e, entry, ns_type) ) ) {
997
- if ( saw_type) { dup ( e, get_span ( entry) , "type " , name) ; }
961
+ if ( !option:: is_none ( lookup_in_mie ( e, entry, ns_type) ) ) {
962
+ if ( saw_type) { dup ( e, mie_span ( entry) , "type " , name) ; }
998
963
else { saw_type = true ; }
999
964
}
1000
- if ( !option:: is_none ( test ( e, entry, ns_module) ) ) {
1001
- if ( saw_mod) { dup ( e, get_span ( entry) , "module " , name) ; }
965
+ if ( !option:: is_none ( lookup_in_mie ( e, entry, ns_module) ) ) {
966
+ if ( saw_mod) { dup ( e, mie_span ( entry) , "module " , name) ; }
1002
967
else { saw_mod = true ; }
1003
968
}
1004
969
entries = * rest;
1005
970
}
1006
- case ( nil[ T ] ) { break ; }
971
+ case ( nil[ mod_index_entry ] ) { break ; }
1007
972
}
1008
973
}
1009
974
}
@@ -1013,15 +978,10 @@ fn mie_span(&mod_index_entry mie) -> span {
1013
978
case ( mie_view_item ( ?item) ) { ret item. span ; }
1014
979
case ( mie_item ( ?item) ) { ret item. span ; }
1015
980
case ( mie_tag_variant ( ?item, _) ) { ret item. span ; }
981
+ case ( mie_native_item ( ?item) ) { ret item. span ; }
1016
982
}
1017
983
}
1018
984
1019
- fn nmie_span ( & nmod_index_entry nmie) -> span {
1020
- alt ( nmie) {
1021
- case ( nmie_view_item ( ?item) ) { ret item. span ; }
1022
- case ( nmie_item ( ?item) ) { ret item. span ; }
1023
- }
1024
- }
1025
985
1026
986
// Local Variables:
1027
987
// mode: rust
0 commit comments