aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile1
-rw-r--r--src/comp/middle/resolve.rs39
-rw-r--r--src/test/run-pass/import7.rs19
3 files changed, 47 insertions, 12 deletions
diff --git a/src/Makefile b/src/Makefile
index bf757067..45d6ce80 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -448,6 +448,7 @@ TEST_XFAILS_RUSTC := $(filter-out \
import4.rs \
import5.rs \
import6.rs \
+ import7.rs \
item-name-overload.rs \
large-records.rs \
lazy-init.rs \
diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs
index 3ca11fed..760f86d1 100644
--- a/src/comp/middle/resolve.rs
+++ b/src/comp/middle/resolve.rs
@@ -40,11 +40,11 @@ fn lookup_name(&env e, import_map index,
ast.ident i) -> option.t[def] {
auto d_ = lookup_name_wrapped(e, i);
alt (d_) {
- case (none[def_wrap]) {
+ case (none[tup(@env, def_wrap)]) {
ret none[def];
}
- case (some[def_wrap](?d)) {
- alt (d) {
+ case (some[tup(@env, def_wrap)](?d)) {
+ alt (d._1) {
case (def_wrap_use(?it)) {
alt (it.node) {
case (ast.view_item_use(_, _, ?id)) {
@@ -115,14 +115,14 @@ fn find_final_def(&env e, &span sp, vec[ident] idents) -> def_wrap {
auto next_i = rest_idents.(0);
auto next_ = lookup_name_wrapped(tmp_e, next_i);
alt (next_) {
- case (none[def_wrap]) {
+ case (none[tup(@env, def_wrap)]) {
e.sess.span_err(sp, "unresolved name: " + next_i);
fail;
}
- case (some[def_wrap](?next)) {
+ case (some[tup(@env, def_wrap)](?next)) {
auto combined_e = update_env_for_item(e, i);
ret found_something(combined_e, pending, sp,
- rest_idents, next);
+ rest_idents, next._1);
}
}
}
@@ -141,12 +141,12 @@ fn find_final_def(&env e, &span sp, vec[ident] idents) -> def_wrap {
auto first = idents.(0);
auto d_ = lookup_name_wrapped(e, first);
alt (d_) {
- case (none[def_wrap]) {
+ case (none[tup(@env, def_wrap)]) {
e.sess.span_err(sp, "unresolved name: " + first);
fail;
}
- case (some[def_wrap](?d)) {
- ret found_something(e, pending, sp, idents, d);
+ case (some[tup(@env, def_wrap)](?d)) {
+ ret found_something(*d._0, pending, sp, idents, d._1);
}
}
}
@@ -154,7 +154,7 @@ fn find_final_def(&env e, &span sp, vec[ident] idents) -> def_wrap {
ret inner(e, pending, sp, idents);
}
-fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[def_wrap] {
+fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] {
// log "resolving name " + i;
@@ -308,8 +308,23 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[def_wrap] {
ret none[def_wrap];
}
- ret std.list.find[scope,def_wrap](e.scopes,
- bind in_scope(i, _));
+ alt (e.scopes) {
+ case (nil[scope]) {
+ ret none[tup(@env, def_wrap)];
+ }
+ case (cons[scope](?hd, ?tl)) {
+ auto x = in_scope(i, hd);
+ alt (x) {
+ case (some[def_wrap](?x)) {
+ ret some(tup(@e, x));
+ }
+ case (none[def_wrap]) {
+ auto outer_env = rec(scopes = *tl with e);
+ ret lookup_name_wrapped(outer_env, i);
+ }
+ }
+ }
+ }
}
fn fold_pat_tag(&env e, &span sp, import_map index, ident i,
diff --git a/src/test/run-pass/import7.rs b/src/test/run-pass/import7.rs
new file mode 100644
index 00000000..29915fb1
--- /dev/null
+++ b/src/test/run-pass/import7.rs
@@ -0,0 +1,19 @@
+import bar.baz;
+import foo.zed;
+mod foo {
+ mod zed {
+ fn baz() {
+ log "baz";
+ }
+ }
+}
+mod bar {
+ import zed.baz;
+ mod foo {
+ mod zed {
+ }
+ }
+}
+fn main(vec[str] args) {
+ baz();
+}