diff options
| author | Brian Anderson <[email protected]> | 2011-05-01 16:55:57 -0400 |
|---|---|---|
| committer | Brian Anderson <[email protected]> | 2011-05-01 16:57:36 -0400 |
| commit | 1dd63ff42d41df9392210127a9eb5a0744d9d5b9 (patch) | |
| tree | 596434bea9f814412fca0ab41870b4137001bf0a /src/comp | |
| parent | Add a regression test for use of unexported fully-qualified paths (diff) | |
| download | rust-1dd63ff42d41df9392210127a9eb5a0744d9d5b9.tar.xz rust-1dd63ff42d41df9392210127a9eb5a0744d9d5b9.zip | |
Remove the search direction from resolve's fold environment
It's not actually involved in the fold so it can just be passed between the
functions that need it.
Diffstat (limited to 'src/comp')
| -rw-r--r-- | src/comp/middle/resolve.rs | 67 |
1 files changed, 31 insertions, 36 deletions
diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs index 39b8e901..d75a6db0 100644 --- a/src/comp/middle/resolve.rs +++ b/src/comp/middle/resolve.rs @@ -27,23 +27,22 @@ tag scope { scope_arm(ast.arm); } -// This indicates whether we're searching up the scope chain -// or whether we've found a path component and started following -// it back down, which has an effect on export visibility -tag search_direction { - up; - down; -} - type env = rec(list[scope] scopes, - session.session sess, - search_direction direction); + session.session sess); tag namespace { ns_value; ns_type; } +// This indicates whether we're searching up the scope chain or whether we've +// found a path component and started following it back down, which has an +// effect on export visibility +tag direction { + up; + down; +} + type import_map = std.map.hashmap[ast.def_id,def_wrap]; // A simple wrapper over defs that stores a bit more information about modules @@ -157,11 +156,10 @@ fn find_final_def(&env e, import_map index, auto len = _vec.len[ident](idents); auto rest_idents = _vec.slice[ident](idents, 1u, len); auto empty_e = rec(scopes = nil[scope], - sess = e.sess, - direction = down); + sess = e.sess); auto tmp_e = update_env_for_item(empty_e, i); auto next_i = rest_idents.(0); - auto next_ = lookup_name_wrapped(tmp_e, next_i, ns); + auto next_ = lookup_name_wrapped(tmp_e, next_i, ns, down); alt (next_) { case (none[tup(@env, def_wrap)]) { e.sess.span_err(sp, "unresolved name: " + next_i); @@ -183,11 +181,10 @@ fn find_final_def(&env e, import_map index, auto len = _vec.len[ident](idents); auto rest_idents = _vec.slice[ident](idents, 1u, len); auto empty_e = rec(scopes = nil[scope], - sess = e.sess, - direction = down); + sess = e.sess); auto tmp_e = update_env_for_external_mod(empty_e, mod_id, idents); auto next_i = rest_idents.(0); - auto next_ = lookup_name_wrapped(tmp_e, next_i, ns); + auto next_ = lookup_name_wrapped(tmp_e, next_i, ns, down); alt (next_) { case (none[tup(@env, def_wrap)]) { e.sess.span_err(sp, "unresolved name: " + next_i); @@ -282,7 +279,7 @@ fn find_final_def(&env e, import_map index, index.insert(option.get[ast.def_id](import_id), def_wrap_resolving); } auto first = idents.(0); - auto d_ = lookup_name_wrapped(e, first, ns); + auto d_ = lookup_name_wrapped(e, first, ns, up); alt (d_) { case (none[tup(@env, def_wrap)]) { e.sess.span_err(sp, "unresolved name: " + first); @@ -298,8 +295,8 @@ fn find_final_def(&env e, import_map index, } } -fn lookup_name_wrapped(&env e, ast.ident i, namespace ns) - -> option.t[tup(@env, def_wrap)] { +fn lookup_name_wrapped(&env e, ast.ident i, namespace ns, direction dir) + -> option.t[tup(@env, def_wrap)] { // log "resolving name " + i; @@ -359,12 +356,12 @@ fn lookup_name_wrapped(&env e, ast.ident i, namespace ns) fail; } - fn check_mod(&env e, ast.ident i, ast._mod m, namespace ns) - -> option.t[def_wrap] { + fn check_mod(ast.ident i, ast._mod m, namespace ns, + direction dir) -> option.t[def_wrap] { - fn visible(&env e, ast.ident i, ast._mod m) -> bool { + fn visible(ast.ident i, ast._mod m, direction dir) -> bool { - alt (e.direction) { + alt (dir) { case (up) { ret true; } @@ -400,14 +397,14 @@ fn lookup_name_wrapped(&env e, ast.ident i, namespace ns) ret some(found_def_view(view_item)); } case (ast.mie_item(?item)) { - if (visible(e, i, m)) { + if (visible(i, m, dir)) { ret some(found_def_item(item, ns)); } } case (ast.mie_tag_variant(?item, ?variant_idx)) { alt (item.node) { case (ast.item_tag(_, ?variants, _, ?tid, _)) { - if (visible(e, i, m)) { + if (visible(i, m, dir)) { auto vid = variants.(variant_idx).node.id; auto t = ast.def_variant(tid, vid); ret some[def_wrap](def_wrap_other(t)); @@ -501,12 +498,12 @@ fn lookup_name_wrapped(&env e, ast.ident i, namespace ns) } } - fn in_scope(&env e, ast.ident identifier, &scope s, - namespace ns) -> option.t[def_wrap] { + fn in_scope(&session.session sess, ast.ident identifier, &scope s, + namespace ns, direction dir) -> option.t[def_wrap] { alt (s) { case (scope_crate(?c)) { - ret check_mod(e, identifier, c.node.module, ns); + ret check_mod(identifier, c.node.module, ns, dir); } case (scope_item(?it)) { @@ -542,7 +539,7 @@ fn lookup_name_wrapped(&env e, ast.ident i, namespace ns) } } case (ast.item_mod(_, ?m, _)) { - ret check_mod(e, identifier, m, ns); + ret check_mod(identifier, m, ns, dir); } case (ast.item_native_mod(_, ?m, _)) { ret check_native_mod(identifier, m); @@ -570,7 +567,7 @@ fn lookup_name_wrapped(&env e, ast.ident i, namespace ns) } case (scope_external_mod(?mod_id, ?path)) { - ret lookup_external_def(e.sess, mod_id._0, path); + ret lookup_external_def(sess, mod_id._0, path); } case (scope_loop(?d)) { @@ -606,14 +603,14 @@ fn lookup_name_wrapped(&env e, ast.ident i, namespace ns) ret none[tup(@env, def_wrap)]; } case (cons[scope](?hd, ?tl)) { - auto x = in_scope(e, i, hd, ns); + auto x = in_scope(e.sess, i, hd, ns, dir); 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, ns); + ret lookup_name_wrapped(outer_env, i, ns, up); } } } @@ -785,8 +782,7 @@ fn resolve_imports(session.session sess, @ast.crate crate) -> @ast.crate { with *fld ); auto e = rec(scopes = nil[scope], - sess = sess, - direction = up); + sess = sess); ret fold.fold_crate[env](e, fld, crate); } @@ -810,8 +806,7 @@ fn resolve_crate(session.session sess, @ast.crate crate) -> @ast.crate { with *fld ); auto e = rec(scopes = nil[scope], - sess = sess, - direction = up); + sess = sess); ret fold.fold_crate[env](e, fld, new_crate); } |