diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-04-16 14:58:58 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-04-16 14:58:58 -0700 |
| commit | dea8ae4e6f7d529df85ed9bd56058dbaeb88f83f (patch) | |
| tree | 40e9ac05cd4c5e8c0df908683d29599fa7bf02e9 /src/rustc/metadata/decoder.rs | |
| parent | c461fc869c41f2f88eafc59e7c9238b267f31518 (diff) | |
| download | rust-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.rs | 19 |
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 |
