about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-05-18 22:23:19 +0200
committerMarijn Haverbeke <marijnh@gmail.com>2011-05-18 22:24:20 +0200
commit28c4a5586e9a6cedebb3ce08a11ded48fcd1fdc5 (patch)
tree4f11188732574d7980217d6936b5c7aba8be499d /src
parent843739ee988fc9060d3d55c2b6a8f222c2f728cb (diff)
downloadrust-28c4a5586e9a6cedebb3ce08a11ded48fcd1fdc5.tar.gz
rust-28c4a5586e9a6cedebb3ce08a11ded48fcd1fdc5.zip
Start checking name collisions in modules
(And remove a boatload of duplicate imports from the typestate files.)

Name collision checking in local scopes will follow soon.
Diffstat (limited to 'src')
-rw-r--r--src/comp/middle/resolve.rs75
-rw-r--r--src/comp/middle/tstate/pre_post_conditions.rs13
-rw-r--r--src/comp/middle/tstate/states.rs13
3 files changed, 75 insertions, 26 deletions
diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs
index 2dc56f922dc..51df85bc3e9 100644
--- a/src/comp/middle/resolve.rs
+++ b/src/comp/middle/resolve.rs
@@ -112,6 +112,7 @@ fn resolve_crate(session sess, @ast::crate crate) -> def_map {
                   sess = sess);
     map_crate(e, *crate);
     resolve_imports(*e);
+    check_for_collisions(e, *crate);
     resolve_names(e, *crate);
     ret e.def_map;
 }
@@ -948,6 +949,80 @@ fn lookup_external(&env e, int cnum, vec[ident] ids, namespace ns)
     ret none[def];
 }
 
+// Collision detection
+
+fn check_for_collisions(&@env e, &ast::crate c) {
+    auto lim = lookup_in_mie;
+    auto msp = mie_span;
+    for each (@tup(ast::def_num, @indexed_mod) m in e.mod_map.items()) {
+        for each (@tup(ident, list[mod_index_entry]) name in
+                  m._1.index.items()) {
+            check_mod_name(*e, name._0, name._1, lim, msp);
+        }
+    }
+    auto linm = lookup_in_nmie;
+    auto nmsp = nmie_span;
+    for each (@tup(ast::def_num, @indexed_nmod) m in e.nmod_map.items()) {
+        for each (@tup(ident, list[nmod_index_entry]) name in
+                  m._1.index.items()) {
+            check_mod_name(*e, name._0, name._1, linm, nmsp);
+        }
+    }
+    /*
+    auto v = rec(visit_item_pre = bind visit_item(e, _),
+                 with walk::default_visitor());
+    walk::walk_crate(v, c);
+    fn visit_item(@env e, &@ast::item i) {
+        
+    }*/
+}
+
+fn check_mod_name[T](&env e, &ident name, &list[T] entries,
+                     fn(&env, &T, namespace) -> option::t[def] test,
+                     fn(&T) -> span get_span) {
+    auto saw_mod = false; auto saw_type = false; auto saw_value = false;
+
+    fn dup(&env e, &span sp, &str word, &ident name) {
+        e.sess.span_err(sp, "duplicate definition of " + word + name);
+    }
+
+    while (true) {
+        alt (entries) {
+            case (cons[T](?entry, ?rest)) {
+                if (!option::is_none(test(e, entry, ns_value))) {
+                    if (saw_value) { dup(e, get_span(entry), "", name); }
+                    else { saw_value = true; }
+                }
+                if (!option::is_none(test(e, entry, ns_type))) {
+                    if (saw_type) { dup(e, get_span(entry), "type ", name); }
+                    else { saw_type = true; }
+                }
+                if (!option::is_none(test(e, entry, ns_module))) {
+                    if (saw_mod) { dup(e, get_span(entry), "module ", name); }
+                    else { saw_mod = true; }
+                }
+                entries = *rest;
+            }
+            case (nil[T]) { break; }
+        }
+    }
+}
+
+fn mie_span(&mod_index_entry mie) -> span {
+    alt (mie) {
+        case (mie_view_item(?item)) { ret item.span; }
+        case (mie_item(?item)) { ret item.span; }
+        case (mie_tag_variant(?item, _)) { ret item.span; }
+    }
+}
+
+fn nmie_span(&nmod_index_entry nmie) -> span {
+    alt (nmie) {
+        case (nmie_view_item(?item)) { ret item.span; }
+        case (nmie_item(?item)) { ret item.span; }
+    }
+}
+
 // Local Variables:
 // mode: rust
 // fill-column: 78;
diff --git a/src/comp/middle/tstate/pre_post_conditions.rs b/src/comp/middle/tstate/pre_post_conditions.rs
index 9ba40b345b2..adcfc496319 100644
--- a/src/comp/middle/tstate/pre_post_conditions.rs
+++ b/src/comp/middle/tstate/pre_post_conditions.rs
@@ -47,7 +47,6 @@ import front::ast::method;
 import front::ast::ann;
 import front::ast::ty;
 import front::ast::mutability;
-import front::ast::item;
 import front::ast::item_const;
 import front::ast::item_mod;
 import front::ast::item_ty;
@@ -56,19 +55,15 @@ import front::ast::item_native_mod;
 import front::ast::obj_field;
 import front::ast::stmt;
 import front::ast::stmt_;
-import front::ast::stmt_decl;
 import front::ast::ident;
 import front::ast::def_id;
-import front::ast::ann;
 import front::ast::expr;
 import front::ast::path;
 import front::ast::crate_directive;
 import front::ast::fn_decl;
-import front::ast::_obj;
 import front::ast::native_mod;
 import front::ast::variant;
 import front::ast::ty_param;
-import front::ast::ty;
 import front::ast::proto;
 import front::ast::pat;
 import front::ast::binop;
@@ -81,18 +76,12 @@ import front::ast::return;
 import front::ast::noreturn;
 import front::ast::_fn;
 import front::ast::_obj;
-import front::ast::_mod;
 import front::ast::crate;
 import front::ast::item_fn;
 import front::ast::item_obj;
 import front::ast::def_local;
 import front::ast::def_fn;
-import front::ast::ident;
-import front::ast::def_id;
-import front::ast::ann;
 import front::ast::item;
-import front::ast::item_fn;
-import front::ast::expr;
 import front::ast::elt;
 import front::ast::field;
 import front::ast::decl;
@@ -138,12 +127,10 @@ import front::ast::expr_assert;
 import front::ast::expr_cast;
 import front::ast::expr_for;
 import front::ast::expr_for_each;
-import front::ast::stmt;
 import front::ast::stmt_decl;
 import front::ast::stmt_expr;
 import front::ast::block;
 import front::ast::block_;
-import front::ast::method;
 
 import middle::fold::span;
 import middle::fold::respan;
diff --git a/src/comp/middle/tstate/states.rs b/src/comp/middle/tstate/states.rs
index 434ec2fe3dc..9352541ae78 100644
--- a/src/comp/middle/tstate/states.rs
+++ b/src/comp/middle/tstate/states.rs
@@ -58,19 +58,15 @@ import bitvectors::declare_var;
 import bitvectors::bit_num;
 import bitvectors::gen_poststate;
 
-import front::ast::_mod;
 import front::ast;
 import front::ast::_fn;
 import front::ast::method;
-import front::ast::ann;
 import front::ast::ty;
 import front::ast::mutability;
 import front::ast::item;
 import front::ast::obj_field;
 import front::ast::stmt;
 import front::ast::stmt_;
-import front::ast::stmt_decl;
-import front::ast::ident;
 import front::ast::def_id;
 import front::ast::ann;
 import front::ast::expr;
@@ -81,7 +77,6 @@ import front::ast::_obj;
 import front::ast::native_mod;
 import front::ast::variant;
 import front::ast::ty_param;
-import front::ast::ty;
 import front::ast::proto;
 import front::ast::pat;
 import front::ast::binop;
@@ -92,7 +87,6 @@ import front::ast::init_op;
 import front::ast::controlflow;
 import front::ast::return;
 import front::ast::noreturn;
-import front::ast::_obj;
 import front::ast::_mod;
 import front::ast::crate;
 import front::ast::item_fn;
@@ -105,11 +99,6 @@ import front::ast::item_const;
 import front::ast::def_local;
 import front::ast::def_fn;
 import front::ast::ident;
-import front::ast::def_id;
-import front::ast::ann;
-import front::ast::item;
-import front::ast::item_fn;
-import front::ast::expr;
 import front::ast::elt;
 import front::ast::field;
 import front::ast::decl;
@@ -155,12 +144,10 @@ import front::ast::expr_assert;
 import front::ast::expr_cast;
 import front::ast::expr_for;
 import front::ast::expr_for_each;
-import front::ast::stmt;
 import front::ast::stmt_decl;
 import front::ast::stmt_expr;
 import front::ast::block;
 import front::ast::block_;
-import front::ast::method;
 
 import middle::fold::span;
 import middle::fold::respan;