Write metadata for more meta_item types. Issue #487
This commit is contained in:
parent
f53c4f79d7
commit
cab73f8897
10 changed files with 95 additions and 55 deletions
|
@ -292,12 +292,10 @@ fn get_crate_meta_export(&session::session sess, &ast::crate c, str k,
|
||||||
for each (@ast::meta_item mi in crate_export_metas(c)) {
|
for each (@ast::meta_item mi in crate_export_metas(c)) {
|
||||||
// FIXME (#487): Support all variants of meta_item
|
// FIXME (#487): Support all variants of meta_item
|
||||||
alt (mi.node) {
|
alt (mi.node) {
|
||||||
case (ast::meta_key_value(?key, ?value)) {
|
case (ast::meta_name_value(?name, ?value)) {
|
||||||
if (key == k) { v += [mi]; }
|
if (name == k) { v += [mi]; }
|
||||||
}
|
|
||||||
case (_) {
|
|
||||||
sess.unimpl("meta_item variant");
|
|
||||||
}
|
}
|
||||||
|
case (_) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
alt (vec::len(v)) {
|
alt (vec::len(v)) {
|
||||||
|
@ -310,11 +308,11 @@ fn get_crate_meta_export(&session::session sess, &ast::crate c, str k,
|
||||||
}
|
}
|
||||||
case (1u) {
|
case (1u) {
|
||||||
alt (v.(0).node) {
|
alt (v.(0).node) {
|
||||||
case (ast::meta_key_value(_, ?value)) {
|
case (ast::meta_name_value(_, ?value)) {
|
||||||
ret value;
|
ret value;
|
||||||
}
|
}
|
||||||
case (_) {
|
case (_) {
|
||||||
sess.unimpl("meta_item variant");
|
ret default;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -333,8 +331,11 @@ fn crate_meta_extras_hash(sha1 sha, &ast::crate crate) -> str {
|
||||||
case (ast::meta_word(?name)) {
|
case (ast::meta_word(?name)) {
|
||||||
name
|
name
|
||||||
}
|
}
|
||||||
case (ast::meta_key_value(?key, _)) {
|
case (ast::meta_name_value(?name, _)) {
|
||||||
key
|
name
|
||||||
|
}
|
||||||
|
case (ast::meta_list(?name, _)) {
|
||||||
|
name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -344,8 +345,8 @@ fn crate_meta_extras_hash(sha1 sha, &ast::crate crate) -> str {
|
||||||
let vec[mutable @ast::meta_item] v = [mutable ];
|
let vec[mutable @ast::meta_item] v = [mutable ];
|
||||||
for each (@ast::meta_item mi in crate_export_metas(crate)) {
|
for each (@ast::meta_item mi in crate_export_metas(crate)) {
|
||||||
alt (mi.node) {
|
alt (mi.node) {
|
||||||
case (ast::meta_key_value(?key, _)) {
|
case (ast::meta_name_value(?name, _)) {
|
||||||
if (key != "name" && key != "vers") {
|
if (name != "name" && name != "vers") {
|
||||||
v += [mutable mi];
|
v += [mutable mi];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -359,13 +360,14 @@ fn crate_meta_extras_hash(sha1 sha, &ast::crate crate) -> str {
|
||||||
for (@ast::meta_item m_ in v) {
|
for (@ast::meta_item m_ in v) {
|
||||||
auto m = m_;
|
auto m = m_;
|
||||||
alt (m.node) {
|
alt (m.node) {
|
||||||
case (ast::meta_key_value(?key, ?value)) {
|
case (ast::meta_name_value(?key, ?value)) {
|
||||||
sha.input_str(len_and_str(key));
|
sha.input_str(len_and_str(key));
|
||||||
sha.input_str(len_and_str(value));
|
sha.input_str(len_and_str(value));
|
||||||
}
|
}
|
||||||
case (ast::meta_word(?name)) {
|
case (ast::meta_word(?name)) {
|
||||||
sha.input_str(len_and_str(name));
|
sha.input_str(len_and_str(name));
|
||||||
}
|
}
|
||||||
|
case (_) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret truncated_sha1_result(sha);
|
ret truncated_sha1_result(sha);
|
||||||
|
|
|
@ -103,7 +103,7 @@ type meta_item = spanned[meta_item_];
|
||||||
tag meta_item_ {
|
tag meta_item_ {
|
||||||
meta_word(ident);
|
meta_word(ident);
|
||||||
meta_list(ident, vec[@meta_item]);
|
meta_list(ident, vec[@meta_item]);
|
||||||
meta_key_value(ident, str);
|
meta_name_value(ident, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
type block = spanned[block_];
|
type block = spanned[block_];
|
||||||
|
|
|
@ -104,8 +104,8 @@ fn fold_meta_item_(&@meta_item mi, ast_fold fld) -> @meta_item {
|
||||||
auto fold_meta_item = bind fold_meta_item_(_,fld);
|
auto fold_meta_item = bind fold_meta_item_(_,fld);
|
||||||
meta_list(id, map(fold_meta_item, mis))
|
meta_list(id, map(fold_meta_item, mis))
|
||||||
}
|
}
|
||||||
case (meta_key_value(?id,?s)) {
|
case (meta_name_value(?id,?s)) {
|
||||||
meta_key_value(fld.fold_ident(id),s)
|
meta_name_value(fld.fold_ident(id),s)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
span=mi.span);
|
span=mi.span);
|
||||||
|
|
|
@ -2142,7 +2142,7 @@ fn parse_meta_item(&parser p) -> @ast::meta_item {
|
||||||
p.bump();
|
p.bump();
|
||||||
auto value = p.get_str(s);
|
auto value = p.get_str(s);
|
||||||
auto hi = p.get_hi_pos();
|
auto hi = p.get_hi_pos();
|
||||||
ret @spanned(lo, hi, ast::meta_key_value(ident, value));
|
ret @spanned(lo, hi, ast::meta_name_value(ident, value));
|
||||||
}
|
}
|
||||||
case (_) {
|
case (_) {
|
||||||
p.fatal("Metadata items must be string literals");
|
p.fatal("Metadata items must be string literals");
|
||||||
|
|
|
@ -30,22 +30,22 @@ fn metadata_matches(hashmap[str, str] mm, &vec[@ast::meta_item] metas) ->
|
||||||
vec::len(metas), mm.size());
|
vec::len(metas), mm.size());
|
||||||
for (@ast::meta_item mi in metas) {
|
for (@ast::meta_item mi in metas) {
|
||||||
alt (mi.node) {
|
alt (mi.node) {
|
||||||
case (ast::meta_key_value(?key, ?value)) {
|
case (ast::meta_name_value(?name, ?value)) {
|
||||||
alt (mm.find(key)) {
|
alt (mm.find(name)) {
|
||||||
case (some(?v)) {
|
case (some(?v)) {
|
||||||
if (v == value) {
|
if (v == value) {
|
||||||
log #fmt("matched '%s': '%s'", key,
|
log #fmt("matched '%s': '%s'", name,
|
||||||
value);
|
value);
|
||||||
} else {
|
} else {
|
||||||
log #fmt("missing '%s': '%s' (got '%s')",
|
log #fmt("missing '%s': '%s' (got '%s')",
|
||||||
key,
|
name,
|
||||||
value, v);
|
value, v);
|
||||||
ret false;
|
ret false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case (none) {
|
case (none) {
|
||||||
log #fmt("missing '%s': '%s'",
|
log #fmt("missing '%s': '%s'",
|
||||||
key, value);
|
name, value);
|
||||||
ret false;
|
ret false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,15 +76,14 @@ fn find_library_crate(&session::session sess, &ast::ident ident,
|
||||||
let str crate_name = ident;
|
let str crate_name = ident;
|
||||||
for (@ast::meta_item mi in metas) {
|
for (@ast::meta_item mi in metas) {
|
||||||
alt (mi.node) {
|
alt (mi.node) {
|
||||||
case (ast::meta_key_value(?key, ?value)) {
|
case (ast::meta_name_value(?name, ?value)) {
|
||||||
if (key == "name") {
|
if (name == "name") {
|
||||||
crate_name = value;
|
crate_name = value;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case (_) {
|
case (_) {
|
||||||
// FIXME (#487)
|
// FIXME (#487)
|
||||||
sess.unimpl("meta_item variant")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -256,15 +256,30 @@ fn item_kind_to_str(u8 kind) -> str {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_meta_items(&ebml::doc md) -> vec[ast::meta_item] {
|
fn get_meta_items(&ebml::doc md) -> vec[@ast::meta_item] {
|
||||||
let vec[ast::meta_item] items = [];
|
let vec[@ast::meta_item] items = [];
|
||||||
for each (ebml::doc meta_item_doc in
|
for each (ebml::doc meta_item_doc in
|
||||||
ebml::tagged_docs(md, tag_meta_item_key_value)) {
|
ebml::tagged_docs(md, tag_meta_item_word)) {
|
||||||
auto kd = ebml::get_doc(meta_item_doc, tag_meta_item_key);
|
auto nd = ebml::get_doc(meta_item_doc, tag_meta_item_name);
|
||||||
|
auto n = str::unsafe_from_bytes(ebml::doc_data(nd));
|
||||||
|
items += [@rec(node=ast::meta_word(n),
|
||||||
|
span=rec(lo=0u, hi=0u))];
|
||||||
|
}
|
||||||
|
for each (ebml::doc meta_item_doc in
|
||||||
|
ebml::tagged_docs(md, tag_meta_item_name_value)) {
|
||||||
|
auto nd = ebml::get_doc(meta_item_doc, tag_meta_item_name);
|
||||||
auto vd = ebml::get_doc(meta_item_doc, tag_meta_item_value);
|
auto vd = ebml::get_doc(meta_item_doc, tag_meta_item_value);
|
||||||
auto k = str::unsafe_from_bytes(ebml::doc_data(kd));
|
auto n = str::unsafe_from_bytes(ebml::doc_data(nd));
|
||||||
auto v = str::unsafe_from_bytes(ebml::doc_data(vd));
|
auto v = str::unsafe_from_bytes(ebml::doc_data(vd));
|
||||||
items += [rec(node=ast::meta_key_value(k, v),
|
items += [@rec(node=ast::meta_name_value(n, v),
|
||||||
|
span=rec(lo=0u, hi=0u))];
|
||||||
|
}
|
||||||
|
for each (ebml::doc meta_item_doc in
|
||||||
|
ebml::tagged_docs(md, tag_meta_item_list)) {
|
||||||
|
auto nd = ebml::get_doc(meta_item_doc, tag_meta_item_name);
|
||||||
|
auto n = str::unsafe_from_bytes(ebml::doc_data(nd));
|
||||||
|
auto subitems = get_meta_items(meta_item_doc);
|
||||||
|
items += [@rec(node=ast::meta_list(n, subitems),
|
||||||
span=rec(lo=0u, hi=0u))];
|
span=rec(lo=0u, hi=0u))];
|
||||||
}
|
}
|
||||||
ret items;
|
ret items;
|
||||||
|
@ -279,10 +294,11 @@ fn get_attributes(&ebml::doc md) -> vec[ast::attribute] {
|
||||||
auto meta_items = get_meta_items(attr_doc);
|
auto meta_items = get_meta_items(attr_doc);
|
||||||
// Currently it's only possible to have a single meta item on
|
// Currently it's only possible to have a single meta item on
|
||||||
// an attribute
|
// an attribute
|
||||||
|
log_err vec::len(meta_items);
|
||||||
assert (vec::len(meta_items) == 1u);
|
assert (vec::len(meta_items) == 1u);
|
||||||
auto meta_item = meta_items.(0);
|
auto meta_item = meta_items.(0);
|
||||||
attrs += [rec(node=rec(style=ast::attr_outer,
|
attrs += [rec(node=rec(style=ast::attr_outer,
|
||||||
value=meta_item),
|
value=*meta_item),
|
||||||
span=rec(lo=0u, hi=0u))];
|
span=rec(lo=0u, hi=0u))];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -292,8 +308,8 @@ fn get_attributes(&ebml::doc md) -> vec[ast::attribute] {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn list_meta_items(&ebml::doc meta_items, io::writer out) {
|
fn list_meta_items(&ebml::doc meta_items, io::writer out) {
|
||||||
for (ast::meta_item mi in get_meta_items(meta_items)) {
|
for (@ast::meta_item mi in get_meta_items(meta_items)) {
|
||||||
out.write_str(#fmt("%s\n", pprust::meta_item_to_str(mi)));
|
out.write_str(#fmt("%s\n", pprust::meta_item_to_str(*mi)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -345,14 +361,14 @@ fn get_exported_metadata(&session::session sess, &str path, &vec[u8] data) ->
|
||||||
ebml::get_doc(ebml::new_doc(data), tag_meta_export);
|
ebml::get_doc(ebml::new_doc(data), tag_meta_export);
|
||||||
auto mm = common::new_str_hash[str]();
|
auto mm = common::new_str_hash[str]();
|
||||||
for each (ebml::doc m in
|
for each (ebml::doc m in
|
||||||
ebml::tagged_docs(meta_items, tag_meta_item_key_value)) {
|
ebml::tagged_docs(meta_items, tag_meta_item_name_value)) {
|
||||||
auto kd = ebml::get_doc(m, tag_meta_item_key);
|
auto nd = ebml::get_doc(m, tag_meta_item_name);
|
||||||
auto vd = ebml::get_doc(m, tag_meta_item_value);
|
auto vd = ebml::get_doc(m, tag_meta_item_value);
|
||||||
auto k = str::unsafe_from_bytes(ebml::doc_data(kd));
|
auto n = str::unsafe_from_bytes(ebml::doc_data(nd));
|
||||||
auto v = str::unsafe_from_bytes(ebml::doc_data(vd));
|
auto v = str::unsafe_from_bytes(ebml::doc_data(vd));
|
||||||
log #fmt("metadata in %s: %s = %s", path, k, v);
|
log #fmt("metadata in %s: %s = %s", path, n, v);
|
||||||
if (!mm.insert(k, v)) {
|
if (!mm.insert(n, v)) {
|
||||||
sess.warn(#fmt("Duplicate metadata item in %s: %s", path, k));
|
sess.warn(#fmt("Duplicate metadata item in %s: %s", path, n));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret mm;
|
ret mm;
|
||||||
|
|
|
@ -418,21 +418,35 @@ fn write_int(&io::writer writer, &int n) {
|
||||||
|
|
||||||
fn encode_meta_item(&ebml::writer ebml_w, &meta_item mi) {
|
fn encode_meta_item(&ebml::writer ebml_w, &meta_item mi) {
|
||||||
// FIXME (#487): Support all forms of meta item
|
// FIXME (#487): Support all forms of meta item
|
||||||
ebml::start_tag(ebml_w, tag_meta_item_key_value);
|
|
||||||
alt (mi.node) {
|
alt (mi.node) {
|
||||||
case (meta_key_value(?key, ?value)) {
|
case (meta_word(?name)) {
|
||||||
ebml::start_tag(ebml_w, tag_meta_item_key);
|
ebml::start_tag(ebml_w, tag_meta_item_word);
|
||||||
ebml_w.writer.write(str::bytes(key));
|
ebml::start_tag(ebml_w, tag_meta_item_name);
|
||||||
|
ebml_w.writer.write(str::bytes(name));
|
||||||
|
ebml::end_tag(ebml_w);
|
||||||
|
ebml::end_tag(ebml_w);
|
||||||
|
}
|
||||||
|
case (meta_name_value(?name, ?value)) {
|
||||||
|
ebml::start_tag(ebml_w, tag_meta_item_name_value);
|
||||||
|
ebml::start_tag(ebml_w, tag_meta_item_name);
|
||||||
|
ebml_w.writer.write(str::bytes(name));
|
||||||
ebml::end_tag(ebml_w);
|
ebml::end_tag(ebml_w);
|
||||||
ebml::start_tag(ebml_w, tag_meta_item_value);
|
ebml::start_tag(ebml_w, tag_meta_item_value);
|
||||||
ebml_w.writer.write(str::bytes(value));
|
ebml_w.writer.write(str::bytes(value));
|
||||||
ebml::end_tag(ebml_w);
|
ebml::end_tag(ebml_w);
|
||||||
|
ebml::end_tag(ebml_w);
|
||||||
}
|
}
|
||||||
case (_) {
|
case (meta_list(?name, ?items)) {
|
||||||
log_err "unimplemented meta_item type";
|
ebml::start_tag(ebml_w, tag_meta_item_list);
|
||||||
}
|
ebml::start_tag(ebml_w, tag_meta_item_name);
|
||||||
|
ebml_w.writer.write(str::bytes(name));
|
||||||
|
ebml::end_tag(ebml_w);
|
||||||
|
for (@meta_item inner_item in items) {
|
||||||
|
encode_meta_item(ebml_w, *inner_item);
|
||||||
}
|
}
|
||||||
ebml::end_tag(ebml_w);
|
ebml::end_tag(ebml_w);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn encode_attributes(&ebml::writer ebml_w, &vec[attribute] attrs) {
|
fn encode_attributes(&ebml::writer ebml_w, &vec[attribute] attrs) {
|
||||||
|
|
|
@ -44,9 +44,9 @@ const uint tag_meta_export = 0x16u;
|
||||||
|
|
||||||
const uint tag_meta_local = 0x17u;
|
const uint tag_meta_local = 0x17u;
|
||||||
|
|
||||||
const uint tag_meta_item_key_value = 0x18u;
|
const uint tag_meta_item_name_value = 0x18u;
|
||||||
|
|
||||||
const uint tag_meta_item_key = 0x19u;
|
const uint tag_meta_item_name = 0x19u;
|
||||||
|
|
||||||
const uint tag_meta_item_value = 0x20u;
|
const uint tag_meta_item_value = 0x20u;
|
||||||
|
|
||||||
|
@ -54,3 +54,6 @@ const uint tag_attributes = 0x21u;
|
||||||
|
|
||||||
const uint tag_attribute = 0x22u;
|
const uint tag_attribute = 0x22u;
|
||||||
|
|
||||||
|
const uint tag_meta_item_word = 0x23u;
|
||||||
|
|
||||||
|
const uint tag_meta_item_list = 0x24u;
|
|
@ -1062,16 +1062,20 @@ fn print_type_params(&ps s, &vec[ast::ty_param] params) {
|
||||||
|
|
||||||
fn print_meta_item(&ps s, &@ast::meta_item item) {
|
fn print_meta_item(&ps s, &@ast::meta_item item) {
|
||||||
ibox(s, indent_unit);
|
ibox(s, indent_unit);
|
||||||
// FIXME (#487): Print other meta item variants
|
|
||||||
alt (item.node) {
|
alt (item.node) {
|
||||||
case (ast::meta_key_value(?key, ?value)) {
|
case (ast::meta_word(?name)) {
|
||||||
word_space(s, key);
|
word(s.s, name);
|
||||||
|
}
|
||||||
|
case (ast::meta_name_value(?name, ?value)) {
|
||||||
|
word_space(s, name);
|
||||||
word_space(s, "=");
|
word_space(s, "=");
|
||||||
print_string(s, value);
|
print_string(s, value);
|
||||||
}
|
}
|
||||||
case (_) {
|
case (ast::meta_list(?name, ?items)) {
|
||||||
log_err "unimplemented meta_item variant";
|
word(s.s, name);
|
||||||
fail;
|
popen(s);
|
||||||
|
commasep(s, consistent, items, print_meta_item);
|
||||||
|
pclose(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
end(s);
|
end(s);
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
// notation to specify their module's attributes
|
// notation to specify their module's attributes
|
||||||
#[attr1 = "val"];
|
#[attr1 = "val"];
|
||||||
#[attr2 = "val"];
|
#[attr2 = "val"];
|
||||||
|
#[attr3];
|
||||||
|
#[attr4(attr5)];
|
||||||
|
|
||||||
// These are are attributes of the following mod
|
// These are are attributes of the following mod
|
||||||
#[attr1 = "val"]
|
#[attr1 = "val"]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue