Skip to content

Commit dea8ae4

Browse files
committed
rustc: Resolve external impls defined in yet other crates. Issue #2196
1 parent c461fc8 commit dea8ae4

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

src/rustc/metadata/csearch.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,9 @@ fn get_impls_for_mod(cstore: cstore::cstore, def: ast::def_id,
116116
name: option<ast::ident>)
117117
-> @[@middle::resolve::_impl] {
118118
let cdata = cstore::get_crate_data(cstore, def.crate);
119-
decoder::get_impls_for_mod(cdata, def.node, name)
119+
decoder::get_impls_for_mod(cdata, def.node, name) {|cnum|
120+
cstore::get_crate_data(cstore, cnum)
121+
}
120122
}
121123

122124
fn get_iface_methods(tcx: ty::ctxt, def: ast::def_id) -> @[ty::method] {

src/rustc/metadata/decoder.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -397,18 +397,27 @@ fn item_impl_methods(cdata: cmd, item: ebml::doc, base_tps: uint)
397397
}
398398

399399
fn get_impls_for_mod(cdata: cmd, m_id: ast::node_id,
400-
name: option<ast::ident>)
400+
name: option<ast::ident>,
401+
get_cdata: fn(ast::crate_num) -> cmd)
401402
-> @[@middle::resolve::_impl] {
402403
let data = cdata.data;
403404
let mod_item = lookup_item(m_id, data);
404405
let mut result = [];
405406
ebml::tagged_docs(mod_item, tag_mod_impl) {|doc|
406-
let did = translate_def_id(cdata, parse_def_id(ebml::doc_data(doc)));
407-
let item = lookup_item(did.node, data), nm = item_name(item);
407+
let did = parse_def_id(ebml::doc_data(doc));
408+
let local_did = translate_def_id(cdata, did);
409+
// The impl may be defined in a different crate. Ask the caller
410+
// to give us the metadata
411+
let impl_cdata = get_cdata(local_did.crate);
412+
let impl_data = impl_cdata.data;
413+
let item = lookup_item(local_did.node, impl_data);
414+
let nm = item_name(item);
408415
if alt name { some(n) { n == nm } none { true } } {
409416
let base_tps = item_ty_param_count(item);
410-
result += [@{did: did, ident: nm,
411-
methods: item_impl_methods(cdata, item, base_tps)}];
417+
result += [@{
418+
did: local_did, ident: nm,
419+
methods: item_impl_methods(impl_cdata, item, base_tps)
420+
}];
412421
}
413422
}
414423
@result

0 commit comments

Comments
 (0)