提交 9671d214 编写于 作者: G Graydon Hoare

Implement meta tag matching in creader. Start using it in rustc.rc. Close #459. Close #457.

上级 774c6d01
......@@ -505,9 +505,54 @@ fn get_metadata_section(str filename) -> option::t[vec[u8]] {
ret option::none[vec[u8]];
}
fn get_exported_metadata(&session::session sess,
&str path,
&vec[u8] data) -> hashmap[str,str] {
auto meta_items = ebml::get_doc(ebml::new_doc(data),
metadata::tag_meta_export);
auto mm = common::new_str_hash[str]();
fn metadata_matches(&vec[u8] data,
for each (ebml::doc m in ebml::tagged_docs(meta_items,
metadata::tag_meta_item)) {
auto kd = ebml::get_doc(m, metadata::tag_meta_item_key);
auto vd = ebml::get_doc(m, metadata::tag_meta_item_value);
auto k = str::unsafe_from_bytes(ebml::doc_data(kd));
auto v = str::unsafe_from_bytes(ebml::doc_data(vd));
log #fmt("metadata in %s: %s = %s", path, k, v);
if (!mm.insert(k,v)) {
sess.warn(#fmt("Duplicate metadata item in %s: %s", path, k));
}
}
ret mm;
}
fn metadata_matches(hashmap[str,str] mm,
&vec[@ast::meta_item] metas) -> bool {
log #fmt("matching %u metadata requirements against %u metadata items",
vec::len(metas), mm.size());
for (@ast::meta_item mi in metas) {
alt (mm.find(mi.node.key)) {
case (some(?v)) {
if (v == mi.node.value) {
log #fmt("matched '%s': '%s'",
mi.node.key, mi.node.value);
} else {
log #fmt("missing '%s': '%s' (got '%s')",
mi.node.key, mi.node.value, v);
ret false;
}
}
case (none) {
log #fmt("missing '%s': '%s'",
mi.node.key, mi.node.value);
ret false;
}
}
}
ret true;
}
......@@ -547,7 +592,8 @@ fn find_library_crate(&session::session sess,
alt (get_metadata_section(path)) {
case (option::some(?cvec)) {
if (!metadata_matches(cvec, metas)) {
auto mm = get_exported_metadata(sess, path, cvec);
if (!metadata_matches(mm, metas)) {
log #fmt("skipping %s, metadata doesn't match", path);
cont;
}
......
......@@ -419,9 +419,6 @@ fn eval_crate_directive(ctx cx,
}
case (ast::cdir_meta(?vi, ?mi)) {
// FIXME: we should actually record, for documentation-sake,
// the metadata that's not exported. It would be nice to have
// compiled-in to the target crate, not just in theh AST.
if (vi == ast::export_meta) {
cx.sess.add_metadata(mi);
}
......
......@@ -10,7 +10,9 @@ meta (desc = "The Rust compiler",
license = "BSD");
use std;
use std (name = "std",
vers = "0.1",
url = "http://rust-lang.org/src/std");
mod middle {
mod trans;
......
mod foo {
export x;
use std (ver="0.0.1");
use std (vers="0.1");
fn x() -> int { ret 1; }
}
mod bar {
use std (ver="0.0.1");
use std (vers="0.1");
export y;
fn y() -> int { ret 1; }
}
......
......@@ -4,7 +4,7 @@
use std;
use libc();
use zed(name = "std");
use bar(name = "std", ver = "0.0.1");
use bar(name = "std", vers = "0.1");
// FIXME: commented out since resolve doesn't know how to handle crates yet.
// import std::str;
......@@ -14,7 +14,7 @@ mod baz {
use std;
use libc();
use zed(name = "std");
use bar(name = "std", ver = "0.0.1");
use bar(name = "std", vers = "0.0.1");
// import std::str;
// import x = std::str;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册