Skip to content

Commit 18bc2f7

Browse files
committed
---
yaml --- r: 2621 b: refs/heads/master c: 28c4a55 h: refs/heads/master i: 2619: ff66d3d v: v3
1 parent 650084c commit 18bc2f7

File tree

4 files changed

+76
-27
lines changed

4 files changed

+76
-27
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: 843739ee988fc9060d3d55c2b6a8f222c2f728cb
2+
refs/heads/master: 28c4a5586e9a6cedebb3ce08a11ded48fcd1fdc5

trunk/src/comp/middle/resolve.rs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ fn resolve_crate(session sess, @ast::crate crate) -> def_map {
112112
sess = sess);
113113
map_crate(e, *crate);
114114
resolve_imports(*e);
115+
check_for_collisions(e, *crate);
115116
resolve_names(e, *crate);
116117
ret e.def_map;
117118
}
@@ -948,6 +949,80 @@ fn lookup_external(&env e, int cnum, vec[ident] ids, namespace ns)
948949
ret none[def];
949950
}
950951

952+
// Collision detection
953+
954+
fn check_for_collisions(&@env e, &ast::crate c) {
955+
auto lim = lookup_in_mie;
956+
auto msp = mie_span;
957+
for each (@tup(ast::def_num, @indexed_mod) m in e.mod_map.items()) {
958+
for each (@tup(ident, list[mod_index_entry]) name in
959+
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);
969+
}
970+
}
971+
/*
972+
auto v = rec(visit_item_pre = bind visit_item(e, _),
973+
with walk::default_visitor());
974+
walk::walk_crate(v, c);
975+
fn visit_item(@env e, &@ast::item i) {
976+
977+
}*/
978+
}
979+
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) {
983+
auto saw_mod = false; auto saw_type = false; auto saw_value = false;
984+
985+
fn dup(&env e, &span sp, &str word, &ident name) {
986+
e.sess.span_err(sp, "duplicate definition of " + word + name);
987+
}
988+
989+
while (true) {
990+
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); }
994+
else { saw_value = true; }
995+
}
996+
if (!option::is_none(test(e, entry, ns_type))) {
997+
if (saw_type) { dup(e, get_span(entry), "type ", name); }
998+
else { saw_type = true; }
999+
}
1000+
if (!option::is_none(test(e, entry, ns_module))) {
1001+
if (saw_mod) { dup(e, get_span(entry), "module ", name); }
1002+
else { saw_mod = true; }
1003+
}
1004+
entries = *rest;
1005+
}
1006+
case (nil[T]) { break; }
1007+
}
1008+
}
1009+
}
1010+
1011+
fn mie_span(&mod_index_entry mie) -> span {
1012+
alt (mie) {
1013+
case (mie_view_item(?item)) { ret item.span; }
1014+
case (mie_item(?item)) { ret item.span; }
1015+
case (mie_tag_variant(?item, _)) { ret item.span; }
1016+
}
1017+
}
1018+
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+
9511026
// Local Variables:
9521027
// mode: rust
9531028
// fill-column: 78;

trunk/src/comp/middle/tstate/pre_post_conditions.rs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ import front::ast::method;
4747
import front::ast::ann;
4848
import front::ast::ty;
4949
import front::ast::mutability;
50-
import front::ast::item;
5150
import front::ast::item_const;
5251
import front::ast::item_mod;
5352
import front::ast::item_ty;
@@ -56,19 +55,15 @@ import front::ast::item_native_mod;
5655
import front::ast::obj_field;
5756
import front::ast::stmt;
5857
import front::ast::stmt_;
59-
import front::ast::stmt_decl;
6058
import front::ast::ident;
6159
import front::ast::def_id;
62-
import front::ast::ann;
6360
import front::ast::expr;
6461
import front::ast::path;
6562
import front::ast::crate_directive;
6663
import front::ast::fn_decl;
67-
import front::ast::_obj;
6864
import front::ast::native_mod;
6965
import front::ast::variant;
7066
import front::ast::ty_param;
71-
import front::ast::ty;
7267
import front::ast::proto;
7368
import front::ast::pat;
7469
import front::ast::binop;
@@ -81,18 +76,12 @@ import front::ast::return;
8176
import front::ast::noreturn;
8277
import front::ast::_fn;
8378
import front::ast::_obj;
84-
import front::ast::_mod;
8579
import front::ast::crate;
8680
import front::ast::item_fn;
8781
import front::ast::item_obj;
8882
import front::ast::def_local;
8983
import front::ast::def_fn;
90-
import front::ast::ident;
91-
import front::ast::def_id;
92-
import front::ast::ann;
9384
import front::ast::item;
94-
import front::ast::item_fn;
95-
import front::ast::expr;
9685
import front::ast::elt;
9786
import front::ast::field;
9887
import front::ast::decl;
@@ -138,12 +127,10 @@ import front::ast::expr_assert;
138127
import front::ast::expr_cast;
139128
import front::ast::expr_for;
140129
import front::ast::expr_for_each;
141-
import front::ast::stmt;
142130
import front::ast::stmt_decl;
143131
import front::ast::stmt_expr;
144132
import front::ast::block;
145133
import front::ast::block_;
146-
import front::ast::method;
147134

148135
import middle::fold::span;
149136
import middle::fold::respan;

trunk/src/comp/middle/tstate/states.rs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,15 @@ import bitvectors::declare_var;
5858
import bitvectors::bit_num;
5959
import bitvectors::gen_poststate;
6060

61-
import front::ast::_mod;
6261
import front::ast;
6362
import front::ast::_fn;
6463
import front::ast::method;
65-
import front::ast::ann;
6664
import front::ast::ty;
6765
import front::ast::mutability;
6866
import front::ast::item;
6967
import front::ast::obj_field;
7068
import front::ast::stmt;
7169
import front::ast::stmt_;
72-
import front::ast::stmt_decl;
73-
import front::ast::ident;
7470
import front::ast::def_id;
7571
import front::ast::ann;
7672
import front::ast::expr;
@@ -81,7 +77,6 @@ import front::ast::_obj;
8177
import front::ast::native_mod;
8278
import front::ast::variant;
8379
import front::ast::ty_param;
84-
import front::ast::ty;
8580
import front::ast::proto;
8681
import front::ast::pat;
8782
import front::ast::binop;
@@ -92,7 +87,6 @@ import front::ast::init_op;
9287
import front::ast::controlflow;
9388
import front::ast::return;
9489
import front::ast::noreturn;
95-
import front::ast::_obj;
9690
import front::ast::_mod;
9791
import front::ast::crate;
9892
import front::ast::item_fn;
@@ -105,11 +99,6 @@ import front::ast::item_const;
10599
import front::ast::def_local;
106100
import front::ast::def_fn;
107101
import front::ast::ident;
108-
import front::ast::def_id;
109-
import front::ast::ann;
110-
import front::ast::item;
111-
import front::ast::item_fn;
112-
import front::ast::expr;
113102
import front::ast::elt;
114103
import front::ast::field;
115104
import front::ast::decl;
@@ -155,12 +144,10 @@ import front::ast::expr_assert;
155144
import front::ast::expr_cast;
156145
import front::ast::expr_for;
157146
import front::ast::expr_for_each;
158-
import front::ast::stmt;
159147
import front::ast::stmt_decl;
160148
import front::ast::stmt_expr;
161149
import front::ast::block;
162150
import front::ast::block_;
163-
import front::ast::method;
164151

165152
import middle::fold::span;
166153
import middle::fold::respan;

0 commit comments

Comments
 (0)