diff options
| author | Graydon Hoare <[email protected]> | 2011-01-27 15:45:04 -0800 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2011-01-27 15:45:04 -0800 |
| commit | 8640f1991793e1c1ec0c45891bbcc5d3a7b05ebf (patch) | |
| tree | d1d9e712a4ee296df5e1a2f2596660c3a47f60ee /src/comp | |
| parent | Fix bug in box-unbox.rs test. (diff) | |
| parent | Simplify and fix the resolution of expr_path. With this we now get to codegen (diff) | |
| download | rust-8640f1991793e1c1ec0c45891bbcc5d3a7b05ebf.tar.xz rust-8640f1991793e1c1ec0c45891bbcc5d3a7b05ebf.zip | |
Merge branch 'master' of github.com:graydon/rust
Diffstat (limited to 'src/comp')
| -rw-r--r-- | src/comp/middle/resolve.rs | 29 |
1 files changed, 10 insertions, 19 deletions
diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs index 21959b61..380ec150 100644 --- a/src/comp/middle/resolve.rs +++ b/src/comp/middle/resolve.rs @@ -35,7 +35,7 @@ tag def_wrap { def_wrap_import(@ast.view_item); def_wrap_mod(@ast.item); def_wrap_other(def); - def_wrap_expr_field(uint); + def_wrap_expr_field(uint, def); def_wrap_resolving; } @@ -72,6 +72,9 @@ fn unwrap_def(def_wrap d) -> def { case (def_wrap_other(?d)) { ret d; } + case (def_wrap_expr_field(_, ?d)) { + ret d; + } } } @@ -140,9 +143,9 @@ fn find_final_def(&env e, import_map index, case (def_wrap_use(?c)) { e.sess.span_err(sp, "Crate access is not implemented"); } - case (_) { + case (def_wrap_other(?d)) { let uint l = _vec.len[ident](idents); - ret def_wrap_expr_field(l); + ret def_wrap_expr_field(l, d); } } fail; @@ -419,26 +422,13 @@ fn fold_pat_tag(&env e, &span sp, ast.path p, vec[@ast.pat] args, fn fold_expr_path(&env e, &span sp, &ast.path p, &option.t[def] d, ann a) -> @ast.expr { auto n_idents = _vec.len[ast.ident](p.node.idents); - check (n_idents != 0u); - auto id0 = p.node.idents.(0); - - auto d_ = lookup_name(e, id0); - - alt (d_) { - case (some[def](_)) { - // log "resolved name " + n.node.ident; - } - case (none[def]) { - e.sess.span_err(sp, "unresolved name: " + id0); - } - } auto index = new_def_hash[def_wrap](); auto d = find_final_def(e, index, sp, p.node.idents, none[ast.def_id]); let uint path_len = 0u; alt (d) { - case (def_wrap_expr_field(?remaining)) { + case (def_wrap_expr_field(?remaining, _)) { path_len = n_idents - remaining + 1u; } case (def_wrap_other(_)) { @@ -453,7 +443,8 @@ fn fold_expr_path(&env e, &span sp, &ast.path p, &option.t[def] d, } auto path_elems = _vec.slice[ident](p.node.idents, 0u, path_len); - auto p_ = rec(node=rec(idents = vec(id0) with p.node) with p); + auto p_ = rec(node=rec(idents = path_elems with p.node) with p); + auto d_ = some(unwrap_def(d)); auto ex = @fold.respan[ast.expr_](sp, ast.expr_path(p_, d_, a)); auto i = path_len; while (i < n_idents) { @@ -473,7 +464,7 @@ fn fold_view_item_import(&env e, &span sp, auto last_id = is.(len - 1u); auto d = find_final_def(e, index, sp, is, some(id)); alt (d) { - case (def_wrap_expr_field(?remain)) { + case (def_wrap_expr_field(?remain, _)) { auto ident = is.(len - remain); e.sess.span_err(sp, ident + " is not a module or crate"); } |