diff options
| author | Graydon Hoare <[email protected]> | 2010-10-19 14:54:10 -0700 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-10-19 14:54:10 -0700 |
| commit | b8cca0971fc2dcd5f4bf4ac2ce82c1c635da0279 (patch) | |
| tree | 9744ef42235ff93c1534461210c80b0f9ecb35b0 /src/comp/middle/resolve.rs | |
| parent | Add a type slot to the AST (diff) | |
| download | rust-b8cca0971fc2dcd5f4bf4ac2ce82c1c635da0279.tar.xz rust-b8cca0971fc2dcd5f4bf4ac2ce82c1c635da0279.zip | |
Teach trans to allocate, initialize and load from local variables.
Diffstat (limited to 'src/comp/middle/resolve.rs')
| -rw-r--r-- | src/comp/middle/resolve.rs | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs index 08b2e588..7951ec85 100644 --- a/src/comp/middle/resolve.rs +++ b/src/comp/middle/resolve.rs @@ -18,7 +18,8 @@ tag scope { scope_block(ast.block); } -type env = list[scope]; +type env = rec(list[scope] scopes, + session.session sess); fn lookup_name(&env e, ast.ident i) -> option[def] { @@ -97,7 +98,7 @@ fn lookup_name(&env e, ast.ident i) -> option[def] { ret none[def]; } - ret std.list.find[scope,def](e, bind in_scope(i, _)); + ret std.list.find[scope,def](e.scopes, bind in_scope(i, _)); } fn fold_expr_name(&env e, &span sp, &ast.name n, @@ -110,7 +111,7 @@ fn fold_expr_name(&env e, &span sp, &ast.name n, log "resolved name " + n.node.ident; } case (none[def]) { - log "unresolved name " + n.node.ident; + e.sess.err("unresolved name: " + n.node.ident); } } @@ -118,25 +119,31 @@ fn fold_expr_name(&env e, &span sp, &ast.name n, } fn update_env_for_crate(&env e, @ast.crate c) -> env { - ret cons[scope](scope_crate(c), @e); + ret rec(scopes = cons[scope](scope_crate(c), @e.scopes) with e); } fn update_env_for_item(&env e, @ast.item i) -> env { - ret cons[scope](scope_item(i), @e); + ret rec(scopes = cons[scope](scope_item(i), @e.scopes) with e); } fn update_env_for_block(&env e, &ast.block b) -> env { - ret cons[scope](scope_block(b), @e); + ret rec(scopes = cons[scope](scope_block(b), @e.scopes) with e); } fn resolve_crate(session.session sess, @ast.crate crate) -> @ast.crate { + let fold.ast_fold[env] fld = fold.new_identity_fold[env](); + fld = @rec( fold_expr_name = bind fold_expr_name(_,_,_,_,_), update_env_for_crate = bind update_env_for_crate(_,_), update_env_for_item = bind update_env_for_item(_,_), update_env_for_block = bind update_env_for_block(_,_) with *fld ); - ret fold.fold_crate[env](nil[scope], fld, crate); + + auto e = rec(scopes = nil[scope], + sess = sess); + + ret fold.fold_crate[env](e, fld, crate); } // Local Variables: |