about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-02-17 17:34:03 -0800
committerBrian Anderson <banderson@mozilla.com>2012-02-17 17:34:05 -0800
commit4e4443718021f9fb82c70f87e67bc4ae5ef67233 (patch)
tree76812738e851cd86b957d19550b38f467096ba8b /src/comp
parentcec1679cf60304a0992c491ed39834b48c460337 (diff)
rustc: Make resolve more forgiving of missing external crates
Rustdoc needs to be able to resolve locals without resolving externals
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/metadata/cstore.rs7
-rw-r--r--src/comp/middle/resolve.rs16
2 files changed, 16 insertions, 7 deletions
diff --git a/src/comp/metadata/cstore.rs b/src/comp/metadata/cstore.rs
index ca5eb332931..c044f32457d 100644
--- a/src/comp/metadata/cstore.rs
+++ b/src/comp/metadata/cstore.rs
@@ -20,7 +20,7 @@ export get_used_libraries;
 export add_used_link_args;
 export get_used_link_args;
 export add_use_stmt_cnum;
-export get_use_stmt_cnum;
+export find_use_stmt_cnum;
 export get_dep_hashes;
 export get_path;
 
@@ -131,8 +131,9 @@ fn add_use_stmt_cnum(cstore: cstore, use_id: ast::node_id,
     p(cstore).use_crate_map.insert(use_id, cnum);
 }
 
-fn get_use_stmt_cnum(cstore: cstore, use_id: ast::node_id) -> ast::crate_num {
-    ret p(cstore).use_crate_map.get(use_id);
+fn find_use_stmt_cnum(cstore: cstore,
+                      use_id: ast::node_id) -> option<ast::crate_num> {
+    p(cstore).use_crate_map.find(use_id)
 }
 
 // returns hashes of crates directly used by this crate. Hashes are
diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs
index c4e1923fc29..7c93f7650f4 100644
--- a/src/comp/middle/resolve.rs
+++ b/src/comp/middle/resolve.rs
@@ -1285,9 +1285,17 @@ fn lookup_in_mod(e: env, m: def, sp: span, name: ident, ns: namespace,
     }
 }
 
-fn found_view_item(e: env, id: node_id) -> def {
-    let cnum = cstore::get_use_stmt_cnum(e.cstore, id);
-    ret ast::def_mod({crate: cnum, node: ast::crate_node_id});
+fn found_view_item(e: env, id: node_id) -> option<def> {
+    alt cstore::find_use_stmt_cnum(e.cstore, id) {
+      some(cnum) {
+        some(ast::def_mod({crate: cnum, node: ast::crate_node_id}))
+      }
+      none {
+        // This can happen if we didn't load external crate info.
+        // Rustdoc depends on this.
+        none
+      }
+    }
 }
 
 fn lookup_import(e: env, defid: def_id, ns: namespace) -> option<def> {
@@ -1418,7 +1426,7 @@ fn lookup_in_mie(e: env, mie: mod_index_entry, ns: namespace) ->
    option<def> {
     alt mie {
       mie_view_item(_, id, _) {
-         if ns == ns_module { ret some(found_view_item(e, id)); }
+         if ns == ns_module { ret found_view_item(e, id); }
       }
       mie_import_ident(id, _) { ret lookup_import(e, local_def(id), ns); }
       mie_item(item) { ret found_def_item(item, ns); }