Skip to content

Commit f14fc7a

Browse files
paulstansifergraydon
authored andcommitted
---
yaml --- r: 2649 b: refs/heads/master c: 533d305 h: refs/heads/master i: 2647: 6bda5e6 v: v3
1 parent 9f21bbc commit f14fc7a

File tree

2 files changed

+46
-86
lines changed

2 files changed

+46
-86
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 38b37fcbdb4d62982e6d326abc0323d75aeceb43
2+
refs/heads/master: 533d3055f3da1e3d50b16f5fb8bde63ad5eaf3c2

trunk/src/comp/middle/resolve.rs

Lines changed: 45 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -70,24 +70,20 @@ fn new_ext_hash() -> ext_hash {
7070
tag mod_index_entry {
7171
mie_view_item(@ast::view_item);
7272
mie_item(@ast::item);
73+
mie_native_item(@ast::native_item);
7374
mie_tag_variant(@ast::item /* tag item */, uint /* variant index */);
7475
}
7576
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.*/
7780

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);
8481

8582
type def_map = hashmap[uint,def];
8683

8784
type env = rec(def_map def_map,
8885
hashmap[ast::def_num,import_state] imports,
8986
hashmap[ast::def_num,@indexed_mod] mod_map,
90-
hashmap[ast::def_num,@indexed_nmod] nmod_map,
9187
hashmap[def_id,vec[ident]] ext_map,
9288
ext_hash ext_cache,
9389
session sess);
@@ -106,7 +102,6 @@ fn resolve_crate(session sess, @ast::crate crate) -> def_map {
106102
auto e = @rec(def_map = new_uint_hash[def](),
107103
imports = new_int_hash[import_state](),
108104
mod_map = new_int_hash[@indexed_mod](),
109-
nmod_map = new_int_hash[@indexed_nmod](),
110105
ext_map = new_def_hash[vec[ident]](),
111106
ext_cache = new_ext_hash(),
112107
sess = sess);
@@ -129,7 +124,7 @@ fn map_crate(&@env e, &ast::crate c) {
129124
visit_item_post = bind pop_env_for_item(cell, _)
130125
with walk::default_visitor());
131126
// 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),
133128
index=index_mod(c.node.module)));
134129
walk::walk_crate(v, c);
135130

@@ -146,11 +141,13 @@ fn map_crate(&@env e, &ast::crate c) {
146141
alt (i.node) {
147142
case (ast::item_mod(_, ?md, ?defid)) {
148143
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));
150146
}
151147
case (ast::item_native_mod(_, ?nmd, ?defid)) {
152148
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));
154151
}
155152
case (_) {}
156153
}
@@ -438,7 +435,7 @@ fn lookup_in_scope(&env e, list[scope] sc, &span sp, &ident id, namespace ns)
438435
alt (s) {
439436
case (scope_crate(?c)) {
440437
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);
442439
}
443440
case (scope_item(?it)) {
444441
alt (it.node) {
@@ -454,10 +451,10 @@ fn lookup_in_scope(&env e, list[scope] sc, &span sp, &ident id, namespace ns)
454451
}
455452
}
456453
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);
458455
}
459456
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);
461458
}
462459
case (ast::item_ty(_, _, ?ty_params, _, _)) {
463460
if (ns == ns_type) {
@@ -524,6 +521,7 @@ fn lookup_in_scope(&env e, list[scope] sc, &span sp, &ident id, namespace ns)
524521
}
525522
}
526523
}
524+
fail;
527525
}
528526

529527
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)
699697
}
700698
alt (m) {
701699
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);
703701
}
704702
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);
706704
}
707705
}
708706
}
@@ -734,14 +732,16 @@ fn lookup_import(&env e, def_id defid, namespace ns) -> option::t[def] {
734732
case (ns_module) { md } };
735733
}
736734
}
735+
fail;
737736
}
738737

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] {
741740
auto info = e.mod_map.get(defid._1);
742741
auto found = info.index.find(id);
743742
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
745745
ret none[def];
746746
}
747747
auto lst = option::get(found);
@@ -757,6 +757,7 @@ fn lookup_in_regular_mod(&env e, def_id defid, &ident id, namespace ns,
757757
}
758758
}
759759
}
760+
fail;
760761
}
761762

762763
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)
780781
}
781782
}
782783
}
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) {
816786
case (ast::native_item_ty(_, ?id)) {
817787
if (ns == ns_type) {
818788
ret some(ast::def_native_ty(id));
@@ -830,6 +800,12 @@ fn lookup_in_nmie(&env e, &nmod_index_entry nmie, namespace ns)
830800
ret none[def];
831801
}
832802

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+
833809
// Module indexing
834810

835811
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 {
893869
ret index;
894870
}
895871

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]]();
898874

899875
for (@ast::view_item it in md.view_items) {
900876
alt (it.node) {
901877
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));
903879
}
904880
case(ast::view_item_export(_)) {}
905881
}
@@ -908,10 +884,10 @@ fn index_nmod(&ast::native_mod md) -> nmod_index {
908884
for (@ast::native_item it in md.items) {
909885
alt (it.node) {
910886
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));
912888
}
913889
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));
915891
}
916892
}
917893
}
@@ -952,20 +928,11 @@ fn lookup_external(&env e, int cnum, vec[ident] ids, namespace ns)
952928
// Collision detection
953929

954930
fn check_for_collisions(&@env e, &ast::crate c) {
955-
auto lim = lookup_in_mie;
956931
auto msp = mie_span;
957932
for each (@tup(ast::def_num, @indexed_mod) m in e.mod_map.items()) {
958933
for each (@tup(ident, list[mod_index_entry]) name in
959934
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);
969936
}
970937
}
971938
/*
@@ -977,9 +944,7 @@ fn check_for_collisions(&@env e, &ast::crate c) {
977944
}*/
978945
}
979946

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) {
983948
auto saw_mod = false; auto saw_type = false; auto saw_value = false;
984949

985950
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,
988953

989954
while (true) {
990955
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); }
994959
else { saw_value = true; }
995960
}
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); }
998963
else { saw_type = true; }
999964
}
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); }
1002967
else { saw_mod = true; }
1003968
}
1004969
entries = *rest;
1005970
}
1006-
case (nil[T]) { break; }
971+
case (nil[mod_index_entry]) { break; }
1007972
}
1008973
}
1009974
}
@@ -1013,15 +978,10 @@ fn mie_span(&mod_index_entry mie) -> span {
1013978
case (mie_view_item(?item)) { ret item.span; }
1014979
case (mie_item(?item)) { ret item.span; }
1015980
case (mie_tag_variant(?item, _)) { ret item.span; }
981+
case (mie_native_item(?item)) { ret item.span; }
1016982
}
1017983
}
1018984

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-
}
1025985

1026986
// Local Variables:
1027987
// mode: rust

0 commit comments

Comments
 (0)