@@ -314,16 +314,21 @@ fn load_library_crate(sess: session::session, ident: ast::ident, span: span,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn metas_with_ident(ident: ast::ident,
|
fn metas_with(ident: ast::ident, key: str,
|
||||||
metas: [@ast::meta_item]) -> [@ast::meta_item] {
|
metas: [@ast::meta_item]) -> [@ast::meta_item] {
|
||||||
let name_items = attr::find_meta_items_by_name(metas, "name");
|
let name_items = attr::find_meta_items_by_name(metas, key);
|
||||||
if name_items.is_empty() {
|
if name_items.is_empty() {
|
||||||
metas + [attr::mk_name_value_item_str("name", ident)]
|
metas + [attr::mk_name_value_item_str(key, ident)]
|
||||||
} else {
|
} else {
|
||||||
metas
|
metas
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn metas_with_ident(ident: ast::ident,
|
||||||
|
metas: [@ast::meta_item]) -> [@ast::meta_item] {
|
||||||
|
metas_with(ident, "name", metas)
|
||||||
|
}
|
||||||
|
|
||||||
fn existing_match(e: env, metas: [@ast::meta_item]) -> option<int> {
|
fn existing_match(e: env, metas: [@ast::meta_item]) -> option<int> {
|
||||||
let maybe_entry = e.crate_cache.find {|c|
|
let maybe_entry = e.crate_cache.find {|c|
|
||||||
metadata_matches(*c.metas, metas)
|
metadata_matches(*c.metas, metas)
|
||||||
@@ -381,11 +386,12 @@ fn resolve_crate_deps(e: env, cdata: @[u8]) -> cstore::cnum_map {
|
|||||||
let cnum_map = int_hash::<ast::crate_num>();
|
let cnum_map = int_hash::<ast::crate_num>();
|
||||||
for decoder::get_crate_deps(cdata).each {|dep|
|
for decoder::get_crate_deps(cdata).each {|dep|
|
||||||
let extrn_cnum = dep.cnum;
|
let extrn_cnum = dep.cnum;
|
||||||
let cname = dep.ident;
|
let cname = dep.name;
|
||||||
|
let cvers = dep.vers;
|
||||||
// FIXME: We really need to know the linkage metas of our transitive
|
// FIXME: We really need to know the linkage metas of our transitive
|
||||||
// dependencies in order to resolve them correctly.
|
// dependencies in order to resolve them correctly.
|
||||||
let cmetas = [];
|
let cmetas = metas_with(cvers, "vers", []);
|
||||||
#debug("resolving dep %s", cname);
|
#debug("resolving dep %s ver: %s", cname, dep.vers);
|
||||||
alt existing_match(e, metas_with_ident(cname, cmetas)) {
|
alt existing_match(e, metas_with_ident(cname, cmetas)) {
|
||||||
some(local_cnum) {
|
some(local_cnum) {
|
||||||
#debug("already have it");
|
#debug("already have it");
|
||||||
|
|||||||
4
src/test/auxiliary/crateresolve4a-1.rs
Normal file
4
src/test/auxiliary/crateresolve4a-1.rs
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#[link(name = "crateresolve4a", vers = "0.1")];
|
||||||
|
#[crate_type = "lib"];
|
||||||
|
|
||||||
|
fn f() -> int { 10 }
|
||||||
4
src/test/auxiliary/crateresolve4a-2.rs
Normal file
4
src/test/auxiliary/crateresolve4a-2.rs
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#[link(name = "crateresolve4a", vers= "0.2")];
|
||||||
|
#[crate_type = "lib"];
|
||||||
|
|
||||||
|
fn g() -> int { 20 }
|
||||||
8
src/test/auxiliary/crateresolve4b-1.rs
Normal file
8
src/test/auxiliary/crateresolve4b-1.rs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
// aux-build:crateresolve4a-1.rs
|
||||||
|
// aux-build:crateresolve4a-2.rs
|
||||||
|
#[link(name = "crateresolve4b", vers = "0.1")];
|
||||||
|
#[crate_type = "lib"];
|
||||||
|
|
||||||
|
use crateresolve4a(vers="0.2");
|
||||||
|
|
||||||
|
fn f() -> int { crateresolve4a::g() }
|
||||||
8
src/test/auxiliary/crateresolve4b-2.rs
Normal file
8
src/test/auxiliary/crateresolve4b-2.rs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
// aux-build:crateresolve4a-1.rs
|
||||||
|
// aux-build:crateresolve4a-2.rs
|
||||||
|
#[link(name = "crateresolve4b", vers = "0.2")];
|
||||||
|
#[crate_type = "lib"];
|
||||||
|
|
||||||
|
use crateresolve4a(vers="0.1");
|
||||||
|
|
||||||
|
fn g() -> int { crateresolve4a::f() }
|
||||||
20
src/test/run-pass/crateresolve4.rs
Normal file
20
src/test/run-pass/crateresolve4.rs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
// xfail-fast
|
||||||
|
// aux-build:crateresolve4a-1.rs
|
||||||
|
// aux-build:crateresolve4a-2.rs
|
||||||
|
// aux-build:crateresolve4b-1.rs
|
||||||
|
// aux-build:crateresolve4b-2.rs
|
||||||
|
|
||||||
|
mod a {
|
||||||
|
use crateresolve4b(vers = "0.1");
|
||||||
|
fn f() { assert crateresolve4b::f() == 20; }
|
||||||
|
}
|
||||||
|
|
||||||
|
mod b {
|
||||||
|
use crateresolve4b(vers = "0.2");
|
||||||
|
fn f() { assert crateresolve4b::g() == 10; }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
a::f();
|
||||||
|
b::f();
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user