about summary refs log tree commit diff
path: root/src/rustc/metadata/decoder.rs
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-04-16 14:58:58 -0700
committerBrian Anderson <banderson@mozilla.com>2012-04-16 14:58:58 -0700
commitdea8ae4e6f7d529df85ed9bd56058dbaeb88f83f (patch)
tree40e9ac05cd4c5e8c0df908683d29599fa7bf02e9 /src/rustc/metadata/decoder.rs
parentc461fc869c41f2f88eafc59e7c9238b267f31518 (diff)
downloadrust-dea8ae4e6f7d529df85ed9bd56058dbaeb88f83f.tar.gz
rust-dea8ae4e6f7d529df85ed9bd56058dbaeb88f83f.zip
rustc: Resolve external impls defined in yet other crates. Issue #2196
Diffstat (limited to 'src/rustc/metadata/decoder.rs')
-rw-r--r--src/rustc/metadata/decoder.rs19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/rustc/metadata/decoder.rs b/src/rustc/metadata/decoder.rs
index ab33355dee2..06881630bc2 100644
--- a/src/rustc/metadata/decoder.rs
+++ b/src/rustc/metadata/decoder.rs
@@ -397,18 +397,27 @@ fn item_impl_methods(cdata: cmd, item: ebml::doc, base_tps: uint)
 }
 
 fn get_impls_for_mod(cdata: cmd, m_id: ast::node_id,
-                     name: option<ast::ident>)
+                     name: option<ast::ident>,
+                     get_cdata: fn(ast::crate_num) -> cmd)
     -> @[@middle::resolve::_impl] {
     let data = cdata.data;
     let mod_item = lookup_item(m_id, data);
     let mut result = [];
     ebml::tagged_docs(mod_item, tag_mod_impl) {|doc|
-        let did = translate_def_id(cdata, parse_def_id(ebml::doc_data(doc)));
-        let item = lookup_item(did.node, data), nm = item_name(item);
+        let did = parse_def_id(ebml::doc_data(doc));
+        let local_did = translate_def_id(cdata, did);
+        // The impl may be defined in a different crate. Ask the caller
+        // to give us the metadata
+        let impl_cdata = get_cdata(local_did.crate);
+        let impl_data = impl_cdata.data;
+        let item = lookup_item(local_did.node, impl_data);
+        let nm = item_name(item);
         if alt name { some(n) { n == nm } none { true } } {
             let base_tps = item_ty_param_count(item);
-            result += [@{did: did, ident: nm,
-                         methods: item_impl_methods(cdata, item, base_tps)}];
+            result += [@{
+                did: local_did, ident: nm,
+                methods: item_impl_methods(impl_cdata, item, base_tps)
+            }];
         }
     }
     @result