about summary refs log tree commit diff
path: root/src/comp/middle
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2011-07-03 02:48:08 -0700
committerTim Chevalier <chevalier@alum.wellesley.edu>2011-07-03 02:48:08 -0700
commit48a69d2100622df88e3f1014eff00227401bf079 (patch)
tree9aa6f69db27f9ab88ba2948e790f99dfb14a28ea /src/comp/middle
parentc425a422ed8aec799532ba96e6f274ef83a0b759 (diff)
downloadrust-48a69d2100622df88e3f1014eff00227401bf079.tar.gz
rust-48a69d2100622df88e3f1014eff00227401bf079.zip
Eliminate all direct calls to option::get() from typeck
This means fewer mysterious error messages.
Diffstat (limited to 'src/comp/middle')
-rw-r--r--src/comp/middle/typeck.rs76
1 files changed, 55 insertions, 21 deletions
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs
index 3a06d0ddfa5..41c3ff993ee 100644
--- a/src/comp/middle/typeck.rs
+++ b/src/comp/middle/typeck.rs
@@ -69,6 +69,25 @@ type fn_ctxt =
 // Used for ast_ty_to_ty() below.
 type ty_getter = fn(&ast::def_id) -> ty::ty_param_count_and_ty ;
 
+fn lookup_local(&@fn_ctxt fcx, &span sp, ast::node_id id) -> int {
+    alt (fcx.locals.find(id)) {
+        case (some(?x)) { x }
+        case (_) {
+            fcx.ccx.tcx.sess.span_fatal(sp, "internal error looking up a \
+              local var")
+        }
+    }
+}
+
+fn lookup_def(&@fn_ctxt fcx, &span sp, ast::node_id id) -> ast::def {
+    alt (fcx.ccx.tcx.def_map.find(id)) {
+        case (some(?x)) { x }
+        case (_) {
+            fcx.ccx.tcx.sess.span_fatal(sp, "internal error looking up \
+              a definition")
+        }
+    }
+}
 
 // Returns the type parameter count and the type for the given definition.
 fn ty_param_count_and_ty_for_def(&@fn_ctxt fcx, &span sp, &ast::def defn) ->
@@ -76,17 +95,18 @@ fn ty_param_count_and_ty_for_def(&@fn_ctxt fcx, &span sp, &ast::def defn) ->
     alt (defn) {
         case (ast::def_arg(?id)) {
             assert (fcx.locals.contains_key(id._1));
-            auto typ = ty::mk_var(fcx.ccx.tcx, fcx.locals.get(id._1));
+            auto typ = ty::mk_var(fcx.ccx.tcx, 
+                                  lookup_local(fcx, sp, id._1));
             ret tup(0u, typ);
         }
         case (ast::def_local(?id)) {
             assert (fcx.locals.contains_key(id._1));
-            auto typ = ty::mk_var(fcx.ccx.tcx, fcx.locals.get(id._1));
+            auto typ = ty::mk_var(fcx.ccx.tcx, lookup_local(fcx, sp, id._1));
             ret tup(0u, typ);
         }
         case (ast::def_obj_field(?id)) {
             assert (fcx.locals.contains_key(id._1));
-            auto typ = ty::mk_var(fcx.ccx.tcx, fcx.locals.get(id._1));
+            auto typ = ty::mk_var(fcx.ccx.tcx, lookup_local(fcx, sp, id._1));
             ret tup(0u, typ);
         }
         case (ast::def_fn(?id, _)) {
@@ -103,7 +123,7 @@ fn ty_param_count_and_ty_for_def(&@fn_ctxt fcx, &span sp, &ast::def defn) ->
         }
         case (ast::def_binding(?id)) {
             assert (fcx.locals.contains_key(id._1));
-            auto typ = ty::mk_var(fcx.ccx.tcx, fcx.locals.get(id._1));
+            auto typ = ty::mk_var(fcx.ccx.tcx, lookup_local(fcx, sp, id._1));
             ret tup(0u, typ);
         }
         case (ast::def_mod(_)) {
@@ -320,18 +340,24 @@ fn ast_ty_to_ty(&ty::ctxt tcx, &ty_getter getter, &@ast::ty ast_ty) -> ty::t {
             typ = ty::mk_fn(tcx, proto, i, out_ty, cf, out_constrs);
         }
         case (ast::ty_path(?path, ?id)) {
-            alt (tcx.def_map.get(id)) {
-                case (ast::def_ty(?id)) {
+            alt (tcx.def_map.find(id)) {
+                case (some(ast::def_ty(?id))) {
                     typ =
                         instantiate(tcx, ast_ty.span, getter, id,
                                     path.node.types);
                 }
-                case (ast::def_native_ty(?id)) { typ = getter(id)._1; }
-                case (ast::def_ty_arg(?id)) { typ = ty::mk_param(tcx, id); }
-                case (_) {
+                case (some(ast::def_native_ty(?id))) { typ = getter(id)._1; }
+                case (some(ast::def_ty_arg(?id))) {
+                    typ = ty::mk_param(tcx, id);
+                }
+                case (some(_)) {
                     tcx.sess.span_fatal(ast_ty.span,
                                       "found type name used as a variable");
                 }
+                case (_) {
+                    tcx.sess.span_fatal(ast_ty.span,
+                                       "internal error in instantiate");
+                }
             }
             cname = some(path_to_str(path));
         }
@@ -499,14 +525,20 @@ mod collect {
 
             ret decoder::get_type(cx.tcx, id);
         }
-        auto it = cx.tcx.items.get(id._1);
+        auto it = cx.tcx.items.find(id._1);
         auto tpt;
         alt (it) {
-            case (ast_map::node_item(?item)) { tpt = ty_of_item(cx, item); }
-            case (ast_map::node_native_item(?native_item)) {
+            case (some(ast_map::node_item(?item))) {
+                tpt = ty_of_item(cx, item);
+            }
+            case (some(ast_map::node_native_item(?native_item))) {
                 tpt = ty_of_native_item(cx, native_item,
                                         ast::native_abi_cdecl);
             }
+            case (_) {
+                cx.tcx.sess.fatal("internal error " +
+                                  util::common::istr(id._1));
+            }
         }
         ret tpt;
     }
@@ -1027,7 +1059,7 @@ mod writeback {
         resolve_type_vars_for_node(fcx, p.span, ty::pat_node_id(p));
     }
     fn visit_local_pre(@fn_ctxt fcx, &@ast::local l) {
-        auto var_id = fcx.locals.get(l.node.id);
+        auto var_id = lookup_local(fcx, l.span, l.node.id);
         auto fix_rslt =
             ty::unify::resolve_type_var(fcx.ccx.tcx, fcx.var_bindings,
                                         var_id);
@@ -1226,7 +1258,7 @@ fn check_pat(&@fn_ctxt fcx, &@ast::pat pat, ty::t expected) {
             write::ty_only_fixup(fcx, id, typ);
         }
         case (ast::pat_bind(?name, ?id)) {
-            auto vid = fcx.locals.get(id);
+            auto vid = lookup_local(fcx, pat.span, id);
             auto typ = ty::mk_var(fcx.ccx.tcx, vid);
             typ = demand::simple(fcx, pat.span, expected, typ);
             write::ty_only_fixup(fcx, id, typ);
@@ -1234,7 +1266,7 @@ fn check_pat(&@fn_ctxt fcx, &@ast::pat pat, ty::t expected) {
         case (ast::pat_tag(?path, ?subpats, ?id)) {
             // Typecheck the path.
 
-            auto v_def = fcx.ccx.tcx.def_map.get(id);
+            auto v_def = lookup_def(fcx, path.span, id);
             auto v_def_ids = ast::variant_def_ids(v_def);
             auto tag_tpt = ty::lookup_item_type(fcx.ccx.tcx, v_def_ids._0);
             auto path_tpot = instantiate_path(fcx, path, tag_tpt, pat.span);
@@ -1329,8 +1361,8 @@ fn require_pure_call(@crate_ctxt ccx, &ast::purity caller_purity,
     alt (caller_purity) {
         case (ast::impure_fn) { ret; }
         case (ast::pure_fn) {
-            alt (ccx.tcx.def_map.get(callee.id)) {
-                case (ast::def_fn(_, ast::pure_fn)) {
+            alt (ccx.tcx.def_map.find(callee.id)) {
+                case (some(ast::def_fn(_, ast::pure_fn))) {
                     ret;
                 }
                 case (_) {
@@ -1458,8 +1490,9 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) {
                 case (ast::expr_call(?operator, ?operands)) {
                     alt (operator.node) {
                         case (ast::expr_path(?oper_name)) {
-                            alt (fcx.ccx.tcx.def_map.get(operator.id)) {
-                                case (ast::def_fn(?_d_id, ast::pure_fn)) { 
+                            alt (fcx.ccx.tcx.def_map.find(operator.id)) {
+                                case (some(ast::def_fn(?_d_id,
+                                                       ast::pure_fn))) { 
                                     // do nothing
                                 }
                                 case (_) {
@@ -1600,7 +1633,7 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) {
             write::ty_only_fixup(fcx, id, oper_t);
         }
         case (ast::expr_path(?pth)) {
-            auto defn = fcx.ccx.tcx.def_map.get(id);
+            auto defn = lookup_def(fcx, pth.span, id);
             auto tpt = ty_param_count_and_ty_for_def(fcx, expr.span, defn);
             if (ty::def_has_ty_params(defn)) {
                 auto path_tpot = instantiate_path(fcx, pth, tpt, expr.span);
@@ -2287,7 +2320,8 @@ fn ast_constr_to_constr(ty::ctxt tcx, &@ast::constr c)
 fn check_decl_initializer(&@fn_ctxt fcx, ast::node_id nid,
                           &ast::initializer init) {
     check_expr(fcx, init.expr);
-    auto lty = ty::mk_var(fcx.ccx.tcx, fcx.locals.get(nid));
+    auto lty = ty::mk_var(fcx.ccx.tcx,
+                          lookup_local(fcx, init.expr.span, nid));
     alt (init.op) {
         case (ast::init_assign) {
             demand::simple(fcx, init.expr.span, lty,