2012-12-03 18:48:01 -06:00
|
|
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
|
|
|
// file at the top-level directory of this distribution and at
|
|
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
// option. This file may not be copied, modified, or distributed
|
|
|
|
// except according to those terms.
|
|
|
|
|
2012-07-04 16:53:12 -05:00
|
|
|
//! Validates all used crates and extern libraries and loads their metadata
|
2011-03-15 18:30:43 -05:00
|
|
|
|
2013-05-17 17:28:44 -05:00
|
|
|
use core::prelude::*;
|
|
|
|
|
2012-12-23 16:41:37 -06:00
|
|
|
use metadata::cstore;
|
|
|
|
use metadata::decoder;
|
|
|
|
use metadata::filesearch::FileSearch;
|
|
|
|
use metadata::loader;
|
|
|
|
|
2013-04-03 08:28:36 -05:00
|
|
|
use core::hashmap::HashMap;
|
2013-05-24 21:35:29 -05:00
|
|
|
use core::vec;
|
2012-09-04 13:54:36 -05:00
|
|
|
use syntax::attr;
|
2013-01-30 11:56:33 -06:00
|
|
|
use syntax::codemap::{span, dummy_sp};
|
2012-12-23 16:41:37 -06:00
|
|
|
use syntax::diagnostic::span_handler;
|
2013-06-04 14:34:25 -05:00
|
|
|
use syntax::parse::token;
|
2012-09-04 13:54:36 -05:00
|
|
|
use syntax::parse::token::ident_interner;
|
2012-12-23 16:41:37 -06:00
|
|
|
use syntax::visit;
|
2013-03-26 15:38:07 -05:00
|
|
|
use syntax::ast;
|
2011-03-15 18:30:43 -05:00
|
|
|
|
2012-07-03 18:11:00 -05:00
|
|
|
// Traverses an AST, reading all the information about use'd crates and extern
|
2011-07-07 23:03:09 -05:00
|
|
|
// libraries necessary for later resolving, typechecking, linking, etc.
|
2013-03-12 15:00:50 -05:00
|
|
|
pub fn read_crates(diag: @span_handler,
|
2013-04-17 11:15:37 -05:00
|
|
|
crate: @ast::crate,
|
2013-02-04 16:02:01 -06:00
|
|
|
cstore: @mut cstore::CStore,
|
2013-03-12 15:00:50 -05:00
|
|
|
filesearch: @FileSearch,
|
2013-01-29 18:51:16 -06:00
|
|
|
os: loader::os,
|
2013-02-04 16:02:01 -06:00
|
|
|
statik: bool,
|
2013-01-29 18:51:16 -06:00
|
|
|
intr: @ident_interner) {
|
2013-02-04 16:02:01 -06:00
|
|
|
let e = @mut Env {
|
|
|
|
diag: diag,
|
|
|
|
filesearch: filesearch,
|
|
|
|
cstore: cstore,
|
|
|
|
os: os,
|
|
|
|
statik: statik,
|
|
|
|
crate_cache: @mut ~[],
|
|
|
|
next_crate_num: 1,
|
|
|
|
intr: intr
|
|
|
|
};
|
2011-07-27 07:19:39 -05:00
|
|
|
let v =
|
2013-01-08 16:00:45 -06:00
|
|
|
visit::mk_simple_visitor(@visit::SimpleVisitor {
|
|
|
|
visit_view_item: |a| visit_view_item(e, a),
|
|
|
|
visit_item: |a| visit_item(e, a),
|
|
|
|
.. *visit::default_simple_visitor()});
|
2013-02-16 09:21:56 -06:00
|
|
|
visit_crate(e, crate);
|
2011-07-26 09:47:13 -05:00
|
|
|
visit::visit_crate(crate, (), v);
|
2012-04-09 17:06:38 -05:00
|
|
|
dump_crates(e.crate_cache);
|
2013-02-04 16:02:01 -06:00
|
|
|
warn_if_multiple_versions(e, diag, e.crate_cache);
|
2012-04-06 01:42:32 -05:00
|
|
|
}
|
|
|
|
|
2013-02-19 01:40:42 -06:00
|
|
|
struct cache_entry {
|
2012-04-06 01:42:32 -05:00
|
|
|
cnum: int,
|
|
|
|
span: span,
|
2013-02-16 12:16:32 -06:00
|
|
|
hash: @~str,
|
2012-09-20 20:15:39 -05:00
|
|
|
metas: @~[@ast::meta_item]
|
2013-02-19 01:40:42 -06:00
|
|
|
}
|
2012-04-06 01:42:32 -05:00
|
|
|
|
2013-03-03 10:50:20 -06:00
|
|
|
fn dump_crates(crate_cache: @mut ~[cache_entry]) {
|
2012-08-22 19:24:52 -05:00
|
|
|
debug!("resolved crates:");
|
2012-06-30 18:19:07 -05:00
|
|
|
for crate_cache.each |entry| {
|
2012-08-22 19:24:52 -05:00
|
|
|
debug!("cnum: %?", entry.cnum);
|
|
|
|
debug!("span: %?", entry.span);
|
|
|
|
debug!("hash: %?", entry.hash);
|
2012-04-09 17:06:38 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-02-04 16:02:01 -06:00
|
|
|
fn warn_if_multiple_versions(e: @mut Env,
|
2013-03-12 15:00:50 -05:00
|
|
|
diag: @span_handler,
|
2013-02-04 16:02:01 -06:00
|
|
|
crate_cache: @mut ~[cache_entry]) {
|
2013-03-01 12:44:43 -06:00
|
|
|
use core::either::*;
|
2012-04-06 01:42:32 -05:00
|
|
|
|
2013-03-16 13:11:31 -05:00
|
|
|
let crate_cache = &mut *crate_cache;
|
|
|
|
|
2012-06-04 10:03:14 -05:00
|
|
|
if crate_cache.len() != 0u {
|
2013-01-07 16:16:52 -06:00
|
|
|
let name = loader::crate_name_from_metas(
|
2013-03-05 21:39:18 -06:00
|
|
|
*crate_cache[crate_cache.len() - 1].metas
|
|
|
|
);
|
|
|
|
|
2012-11-26 22:05:19 -06:00
|
|
|
let (matches, non_matches) =
|
2012-12-17 22:36:12 -06:00
|
|
|
partition(crate_cache.map_to_vec(|&entry| {
|
2013-01-10 08:29:26 -06:00
|
|
|
let othername = loader::crate_name_from_metas(
|
|
|
|
copy *entry.metas);
|
2012-04-06 01:42:32 -05:00
|
|
|
if name == othername {
|
2012-09-28 19:04:39 -05:00
|
|
|
Left(entry)
|
2012-04-06 01:42:32 -05:00
|
|
|
} else {
|
2012-09-28 19:04:39 -05:00
|
|
|
Right(entry)
|
2012-04-06 01:42:32 -05:00
|
|
|
}
|
2012-06-26 15:55:56 -05:00
|
|
|
}));
|
2012-04-06 01:42:32 -05:00
|
|
|
|
2013-03-28 20:39:09 -05:00
|
|
|
assert!(!matches.is_empty());
|
2012-04-06 01:42:32 -05:00
|
|
|
|
|
|
|
if matches.len() != 1u {
|
2012-05-22 19:48:04 -05:00
|
|
|
diag.handler().warn(
|
2013-02-16 12:16:32 -06:00
|
|
|
fmt!("using multiple versions of crate `%s`", *name));
|
2012-07-31 18:38:41 -05:00
|
|
|
for matches.each |match_| {
|
2013-05-19 00:07:44 -05:00
|
|
|
diag.span_note(match_.span, "used here");
|
2012-06-29 18:26:56 -05:00
|
|
|
let attrs = ~[
|
2013-01-07 16:16:52 -06:00
|
|
|
attr::mk_attr(attr::mk_list_item(
|
2013-02-14 22:19:27 -06:00
|
|
|
@~"link", /*bad*/copy *match_.metas))
|
2012-06-29 18:26:56 -05:00
|
|
|
];
|
2012-07-18 18:18:02 -05:00
|
|
|
loader::note_linkage_attrs(e.intr, diag, attrs);
|
2012-04-06 01:42:32 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-02-04 16:02:01 -06:00
|
|
|
warn_if_multiple_versions(e, diag, @mut non_matches);
|
2012-04-06 01:42:32 -05:00
|
|
|
}
|
2011-07-07 23:03:09 -05:00
|
|
|
}
|
|
|
|
|
2013-02-04 16:02:01 -06:00
|
|
|
struct Env {
|
2013-03-12 15:00:50 -05:00
|
|
|
diag: @span_handler,
|
|
|
|
filesearch: @FileSearch,
|
2013-02-04 16:02:01 -06:00
|
|
|
cstore: @mut cstore::CStore,
|
|
|
|
os: loader::os,
|
|
|
|
statik: bool,
|
|
|
|
crate_cache: @mut ~[cache_entry],
|
|
|
|
next_crate_num: ast::crate_num,
|
|
|
|
intr: @ident_interner
|
|
|
|
}
|
2011-07-07 23:37:56 -05:00
|
|
|
|
2013-04-17 11:15:37 -05:00
|
|
|
fn visit_crate(e: @mut Env, c: &ast::crate) {
|
2013-02-16 09:21:56 -06:00
|
|
|
let cstore = e.cstore;
|
|
|
|
let link_args = attr::find_attrs_by_name(c.node.attrs, "link_args");
|
|
|
|
|
|
|
|
for link_args.each |a| {
|
|
|
|
match attr::get_meta_item_value_str(attr::attr_meta(*a)) {
|
|
|
|
Some(ref linkarg) => {
|
2013-02-14 22:19:27 -06:00
|
|
|
cstore::add_used_link_args(cstore, **linkarg);
|
2013-02-16 09:21:56 -06:00
|
|
|
}
|
|
|
|
None => {/* fallthrough */ }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-02-04 16:02:01 -06:00
|
|
|
fn visit_view_item(e: @mut Env, i: @ast::view_item) {
|
2013-03-20 00:17:42 -05:00
|
|
|
match i.node {
|
2013-05-29 18:59:33 -05:00
|
|
|
ast::view_item_extern_mod(ident, ref meta_items, id) => {
|
2013-02-17 20:45:00 -06:00
|
|
|
debug!("resolving extern mod stmt. ident: %?, meta: %?",
|
2013-05-29 18:59:33 -05:00
|
|
|
ident, *meta_items);
|
|
|
|
let cnum = resolve_crate(e, ident, copy *meta_items, @~"", i.span);
|
2013-02-17 20:45:00 -06:00
|
|
|
cstore::add_extern_mod_stmt_cnum(e.cstore, id, cnum);
|
2011-07-27 07:19:39 -05:00
|
|
|
}
|
2012-08-03 21:59:04 -05:00
|
|
|
_ => ()
|
2011-07-07 23:37:56 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-02-04 16:02:01 -06:00
|
|
|
fn visit_item(e: @mut Env, i: @ast::item) {
|
2013-03-20 00:17:42 -05:00
|
|
|
match i.node {
|
|
|
|
ast::item_foreign_mod(ref fm) => {
|
2013-03-13 21:25:28 -05:00
|
|
|
if fm.abis.is_rust() || fm.abis.is_intrinsic() {
|
|
|
|
return;
|
2011-07-07 23:37:56 -05:00
|
|
|
}
|
2011-12-15 14:25:29 -06:00
|
|
|
|
2012-05-22 19:48:04 -05:00
|
|
|
let cstore = e.cstore;
|
2012-03-15 08:47:03 -05:00
|
|
|
let mut already_added = false;
|
2013-01-10 01:17:57 -06:00
|
|
|
let link_args = attr::find_attrs_by_name(i.attrs, "link_args");
|
2012-09-04 18:40:11 -05:00
|
|
|
|
|
|
|
match fm.sort {
|
2013-02-16 11:48:28 -06:00
|
|
|
ast::named => {
|
|
|
|
let foreign_name =
|
|
|
|
match attr::first_attr_value_str_by_name(i.attrs,
|
2013-05-19 00:07:44 -05:00
|
|
|
"link_name") {
|
2013-02-16 12:16:32 -06:00
|
|
|
Some(nn) => {
|
|
|
|
if *nn == ~"" {
|
2013-02-16 11:48:28 -06:00
|
|
|
e.diag.span_fatal(
|
|
|
|
i.span,
|
2013-05-23 11:09:11 -05:00
|
|
|
"empty #[link_name] not allowed; use \
|
|
|
|
#[nolink].");
|
2013-02-16 11:48:28 -06:00
|
|
|
}
|
2013-02-16 12:16:32 -06:00
|
|
|
nn
|
2013-02-16 11:48:28 -06:00
|
|
|
}
|
2013-06-04 14:34:25 -05:00
|
|
|
None => token::ident_to_str(i.ident)
|
2013-02-16 11:48:28 -06:00
|
|
|
};
|
2013-05-19 00:07:44 -05:00
|
|
|
if attr::find_attrs_by_name(i.attrs, "nolink").is_empty() {
|
2013-02-16 11:48:28 -06:00
|
|
|
already_added =
|
2013-02-16 12:16:32 -06:00
|
|
|
!cstore::add_used_library(cstore, foreign_name);
|
2013-02-16 11:48:28 -06:00
|
|
|
}
|
|
|
|
if !link_args.is_empty() && already_added {
|
|
|
|
e.diag.span_fatal(i.span, ~"library '" + *foreign_name +
|
2013-05-23 11:09:11 -05:00
|
|
|
"' already added: can't specify link_args.");
|
2013-02-16 11:48:28 -06:00
|
|
|
}
|
2012-09-04 18:40:11 -05:00
|
|
|
}
|
2013-02-16 11:48:28 -06:00
|
|
|
ast::anonymous => { /* do nothing */ }
|
2011-12-15 14:25:29 -06:00
|
|
|
}
|
2012-09-04 18:40:11 -05:00
|
|
|
|
2012-06-30 18:19:07 -05:00
|
|
|
for link_args.each |a| {
|
2012-09-20 20:15:39 -05:00
|
|
|
match attr::get_meta_item_value_str(attr::attr_meta(*a)) {
|
2013-02-16 12:16:32 -06:00
|
|
|
Some(linkarg) => {
|
|
|
|
cstore::add_used_link_args(cstore, *linkarg);
|
2013-02-16 11:48:28 -06:00
|
|
|
}
|
|
|
|
None => { /* fallthrough */ }
|
2011-07-27 07:19:39 -05:00
|
|
|
}
|
2011-07-07 23:37:56 -05:00
|
|
|
}
|
2011-07-27 07:19:39 -05:00
|
|
|
}
|
2012-08-03 21:59:04 -05:00
|
|
|
_ => { }
|
2011-07-07 23:37:56 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-04-17 11:15:37 -05:00
|
|
|
fn metas_with(ident: @~str, key: @~str, metas: ~[@ast::meta_item])
|
2012-09-20 20:15:39 -05:00
|
|
|
-> ~[@ast::meta_item] {
|
2013-02-16 12:16:32 -06:00
|
|
|
let name_items = attr::find_meta_items_by_name(metas, *key);
|
2012-04-05 20:31:03 -05:00
|
|
|
if name_items.is_empty() {
|
2013-02-16 12:16:32 -06:00
|
|
|
vec::append_one(metas, attr::mk_name_value_item_str(key, ident))
|
2012-04-05 20:31:03 -05:00
|
|
|
} else {
|
|
|
|
metas
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-04-17 11:15:37 -05:00
|
|
|
fn metas_with_ident(ident: @~str, metas: ~[@ast::meta_item])
|
2012-09-20 20:15:39 -05:00
|
|
|
-> ~[@ast::meta_item] {
|
2013-02-16 12:16:32 -06:00
|
|
|
metas_with(ident, @~"name", metas)
|
2012-04-07 13:00:00 -05:00
|
|
|
}
|
|
|
|
|
2013-03-10 10:02:16 -05:00
|
|
|
fn existing_match(e: @mut Env, metas: &[@ast::meta_item], hash: @~str)
|
2013-02-04 16:02:01 -06:00
|
|
|
-> Option<int> {
|
2012-06-30 18:19:07 -05:00
|
|
|
for e.crate_cache.each |c| {
|
2012-06-04 10:03:14 -05:00
|
|
|
if loader::metadata_matches(*c.metas, metas)
|
2012-07-18 18:18:02 -05:00
|
|
|
&& (hash.is_empty() || c.hash == hash) {
|
2012-08-20 14:23:37 -05:00
|
|
|
return Some(c.cnum);
|
2012-06-04 10:03:14 -05:00
|
|
|
}
|
|
|
|
}
|
2012-08-20 14:23:37 -05:00
|
|
|
return None;
|
2012-04-05 20:31:03 -05:00
|
|
|
}
|
|
|
|
|
2013-02-04 16:02:01 -06:00
|
|
|
fn resolve_crate(e: @mut Env,
|
|
|
|
ident: ast::ident,
|
2013-04-17 11:15:37 -05:00
|
|
|
metas: ~[@ast::meta_item],
|
2013-02-16 12:16:32 -06:00
|
|
|
hash: @~str,
|
2013-02-04 16:02:01 -06:00
|
|
|
span: span)
|
|
|
|
-> ast::crate_num {
|
2013-06-04 14:34:25 -05:00
|
|
|
let metas = metas_with_ident(token::ident_to_str(ident), metas);
|
2012-04-05 20:31:03 -05:00
|
|
|
|
2012-08-06 14:34:08 -05:00
|
|
|
match existing_match(e, metas, hash) {
|
2012-08-20 14:23:37 -05:00
|
|
|
None => {
|
2013-02-19 01:40:42 -06:00
|
|
|
let load_ctxt = loader::Context {
|
2012-05-22 19:48:04 -05:00
|
|
|
diag: e.diag,
|
|
|
|
filesearch: e.filesearch,
|
2012-05-22 19:16:26 -05:00
|
|
|
span: span,
|
|
|
|
ident: ident,
|
2013-01-17 21:14:26 -06:00
|
|
|
metas: metas,
|
2012-05-22 19:16:26 -05:00
|
|
|
hash: hash,
|
2012-05-22 19:48:04 -05:00
|
|
|
os: e.os,
|
2013-02-19 01:40:42 -06:00
|
|
|
is_static: e.statik,
|
2012-07-18 18:18:02 -05:00
|
|
|
intr: e.intr
|
2012-05-22 19:16:26 -05:00
|
|
|
};
|
2013-04-17 11:15:37 -05:00
|
|
|
let (lident, ldata) = loader::load_library_crate(&load_ctxt);
|
2011-07-08 14:40:16 -05:00
|
|
|
|
2013-02-19 01:40:42 -06:00
|
|
|
let cfilename = Path(lident);
|
|
|
|
let cdata = ldata;
|
2011-07-08 14:40:16 -05:00
|
|
|
|
2012-04-05 20:31:03 -05:00
|
|
|
let attrs = decoder::get_crate_attributes(cdata);
|
|
|
|
let linkage_metas = attr::find_linkage_metas(attrs);
|
2012-04-08 08:19:15 -05:00
|
|
|
let hash = decoder::get_crate_hash(cdata);
|
2012-04-05 20:31:03 -05:00
|
|
|
|
2011-07-08 14:55:38 -05:00
|
|
|
// Claim this crate number and cache it
|
2011-07-27 07:19:39 -05:00
|
|
|
let cnum = e.next_crate_num;
|
2013-02-19 01:40:42 -06:00
|
|
|
e.crate_cache.push(cache_entry {
|
|
|
|
cnum: cnum,
|
|
|
|
span: span,
|
|
|
|
hash: hash,
|
|
|
|
metas: @linkage_metas
|
|
|
|
});
|
2011-07-08 14:04:52 -05:00
|
|
|
e.next_crate_num += 1;
|
2011-07-08 14:40:16 -05:00
|
|
|
|
2011-07-08 14:55:38 -05:00
|
|
|
// Now resolve the crates referenced by this crate
|
2011-07-27 07:19:39 -05:00
|
|
|
let cnum_map = resolve_crate_deps(e, cdata);
|
2011-07-08 14:55:38 -05:00
|
|
|
|
2012-04-15 03:07:47 -05:00
|
|
|
let cname =
|
2013-01-17 21:14:26 -06:00
|
|
|
match attr::last_meta_item_value_str_by_name(load_ctxt.metas,
|
2013-05-19 00:07:44 -05:00
|
|
|
"name") {
|
2013-02-16 12:16:32 -06:00
|
|
|
Some(v) => v,
|
2013-06-04 14:34:25 -05:00
|
|
|
None => token::ident_to_str(ident),
|
2012-04-15 03:07:47 -05:00
|
|
|
};
|
2013-02-19 01:40:42 -06:00
|
|
|
let cmeta = @cstore::crate_metadata {
|
|
|
|
name: cname,
|
|
|
|
data: cdata,
|
|
|
|
cnum_map: cnum_map,
|
|
|
|
cnum: cnum
|
|
|
|
};
|
2011-07-08 14:55:38 -05:00
|
|
|
|
2012-05-22 19:48:04 -05:00
|
|
|
let cstore = e.cstore;
|
2011-07-08 14:40:16 -05:00
|
|
|
cstore::set_crate_data(cstore, cnum, cmeta);
|
2012-08-24 17:28:43 -05:00
|
|
|
cstore::add_used_crate_file(cstore, &cfilename);
|
2012-08-01 19:30:05 -05:00
|
|
|
return cnum;
|
2012-04-05 20:31:03 -05:00
|
|
|
}
|
2012-08-20 14:23:37 -05:00
|
|
|
Some(cnum) => {
|
2012-08-01 19:30:05 -05:00
|
|
|
return cnum;
|
2012-04-05 20:31:03 -05:00
|
|
|
}
|
|
|
|
}
|
2011-07-08 14:55:38 -05:00
|
|
|
}
|
2011-05-26 19:16:54 -05:00
|
|
|
|
2011-07-08 14:55:38 -05:00
|
|
|
// Go through the crate metadata and load any crates that it references
|
2013-02-04 16:02:01 -06:00
|
|
|
fn resolve_crate_deps(e: @mut Env, cdata: @~[u8]) -> cstore::cnum_map {
|
2012-08-22 19:24:52 -05:00
|
|
|
debug!("resolving deps of external crate");
|
2011-07-08 14:55:38 -05:00
|
|
|
// The map from crate numbers in the crate we're resolving to local crate
|
|
|
|
// numbers
|
2013-04-03 08:28:36 -05:00
|
|
|
let mut cnum_map = HashMap::new();
|
2012-07-18 18:18:02 -05:00
|
|
|
for decoder::get_crate_deps(e.intr, cdata).each |dep| {
|
2011-07-27 07:19:39 -05:00
|
|
|
let extrn_cnum = dep.cnum;
|
2012-04-07 13:00:00 -05:00
|
|
|
let cname = dep.name;
|
2013-06-04 14:34:25 -05:00
|
|
|
let cname_str = token::ident_to_str(dep.name);
|
2013-02-16 12:16:32 -06:00
|
|
|
let cmetas = metas_with(dep.vers, @~"vers", ~[]);
|
2012-08-22 19:24:52 -05:00
|
|
|
debug!("resolving dep crate %s ver: %s hash: %s",
|
2013-06-04 14:34:25 -05:00
|
|
|
*cname_str, *dep.vers, *dep.hash);
|
|
|
|
match existing_match(e, metas_with_ident(cname_str,
|
2013-01-10 12:59:58 -06:00
|
|
|
copy cmetas),
|
2012-07-18 18:18:02 -05:00
|
|
|
dep.hash) {
|
2012-08-20 14:23:37 -05:00
|
|
|
Some(local_cnum) => {
|
2012-08-22 19:24:52 -05:00
|
|
|
debug!("already have it");
|
2011-07-08 14:55:38 -05:00
|
|
|
// We've already seen this crate
|
|
|
|
cnum_map.insert(extrn_cnum, local_cnum);
|
2012-04-05 20:31:03 -05:00
|
|
|
}
|
2012-08-20 14:23:37 -05:00
|
|
|
None => {
|
2012-08-22 19:24:52 -05:00
|
|
|
debug!("need to load it");
|
2011-07-08 14:55:38 -05:00
|
|
|
// This is a new one so we've got to load it
|
2012-06-21 18:44:10 -05:00
|
|
|
// FIXME (#2404): Need better error reporting than just a bogus
|
|
|
|
// span.
|
2013-01-30 11:56:33 -06:00
|
|
|
let fake_span = dummy_sp();
|
2013-02-16 12:16:32 -06:00
|
|
|
let local_cnum = resolve_crate(e, cname, cmetas, dep.hash,
|
|
|
|
fake_span);
|
2011-07-08 14:55:38 -05:00
|
|
|
cnum_map.insert(extrn_cnum, local_cnum);
|
2012-04-05 20:31:03 -05:00
|
|
|
}
|
2011-07-08 14:55:38 -05:00
|
|
|
}
|
|
|
|
}
|
2013-03-22 21:26:41 -05:00
|
|
|
return @mut cnum_map;
|
2011-07-08 14:55:38 -05:00
|
|
|
}
|