rustc: Make meta items into interior vectors
This commit is contained in:
parent
479ce4d783
commit
401b6362d7
10 changed files with 90 additions and 66 deletions
|
|
@ -12,6 +12,7 @@ import syntax::walk;
|
|||
import syntax::codemap::span;
|
||||
import back::x86;
|
||||
import util::common;
|
||||
import std::ivec;
|
||||
import std::str;
|
||||
import std::vec;
|
||||
import std::ebml;
|
||||
|
|
@ -28,12 +29,12 @@ export read_crates;
|
|||
export list_file_metadata;
|
||||
|
||||
fn metadata_matches(&vec[u8] crate_data,
|
||||
&vec[@ast::meta_item] metas) -> bool {
|
||||
&(@ast::meta_item)[] metas) -> bool {
|
||||
auto attrs = decoder::get_crate_attributes(crate_data);
|
||||
auto linkage_metas = attr::find_linkage_metas(attrs);
|
||||
|
||||
log #fmt("matching %u metadata requirements against %u items",
|
||||
vec::len(metas), vec::len(linkage_metas));
|
||||
ivec::len(metas), ivec::len(linkage_metas));
|
||||
|
||||
for (@ast::meta_item needed in metas) {
|
||||
if (!attr::contains(linkage_metas, needed)) {
|
||||
|
|
@ -54,7 +55,7 @@ fn default_native_lib_naming(session::session sess) ->
|
|||
}
|
||||
|
||||
fn find_library_crate(&session::session sess, &ast::ident ident,
|
||||
&vec[@ast::meta_item] metas,
|
||||
&(@ast::meta_item)[] metas,
|
||||
&vec[str] library_search_paths) ->
|
||||
option::t[tup(str, vec[u8])] {
|
||||
|
||||
|
|
@ -62,7 +63,7 @@ fn find_library_crate(&session::session sess, &ast::ident ident,
|
|||
|
||||
auto crate_name = {
|
||||
auto name_items = attr::find_meta_items_by_name(metas, "name");
|
||||
alt (vec::last(name_items)) {
|
||||
alt (ivec::last(name_items)) {
|
||||
case (some(?i)) {
|
||||
alt (attr::get_meta_item_value_str(i)) {
|
||||
case (some(?n)) { n }
|
||||
|
|
@ -133,7 +134,7 @@ fn get_metadata_section(str filename) -> option::t[vec[u8]] {
|
|||
}
|
||||
|
||||
fn load_library_crate(&session::session sess, span span, int cnum,
|
||||
&ast::ident ident, vec[@ast::meta_item] metas,
|
||||
&ast::ident ident, &(@ast::meta_item)[] metas,
|
||||
&vec[str] library_search_paths) {
|
||||
alt (find_library_crate(sess, ident, metas, library_search_paths)) {
|
||||
case (some(?t)) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
// Metadata decoding
|
||||
|
||||
import std::ebml;
|
||||
import std::ivec;
|
||||
import std::option;
|
||||
import std::vec;
|
||||
import std::str;
|
||||
|
|
@ -262,13 +263,13 @@ fn item_kind_to_str(u8 kind) -> str {
|
|||
}
|
||||
}
|
||||
|
||||
fn get_meta_items(&ebml::doc md) -> vec[@ast::meta_item] {
|
||||
let vec[@ast::meta_item] items = [];
|
||||
fn get_meta_items(&ebml::doc md) -> (@ast::meta_item)[] {
|
||||
let (@ast::meta_item)[] items = ~[];
|
||||
for each (ebml::doc meta_item_doc in
|
||||
ebml::tagged_docs(md, tag_meta_item_word)) {
|
||||
auto nd = ebml::get_doc(meta_item_doc, tag_meta_item_name);
|
||||
auto n = str::unsafe_from_bytes(ebml::doc_data(nd));
|
||||
items += [attr::mk_word_item(n)];
|
||||
items += ~[attr::mk_word_item(n)];
|
||||
}
|
||||
for each (ebml::doc meta_item_doc in
|
||||
ebml::tagged_docs(md, tag_meta_item_name_value)) {
|
||||
|
|
@ -278,14 +279,14 @@ fn get_meta_items(&ebml::doc md) -> vec[@ast::meta_item] {
|
|||
auto v = str::unsafe_from_bytes(ebml::doc_data(vd));
|
||||
// FIXME (#611): Should be able to decode meta_name_value variants,
|
||||
// but currently they can't be encoded
|
||||
items += [attr::mk_name_value_item_str(n, v)];
|
||||
items += ~[attr::mk_name_value_item_str(n, v)];
|
||||
}
|
||||
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 += [attr::mk_list_item(n, subitems)];
|
||||
items += ~[attr::mk_list_item(n, subitems)];
|
||||
}
|
||||
ret items;
|
||||
}
|
||||
|
|
@ -299,7 +300,7 @@ fn get_attributes(&ebml::doc md) -> ast::attribute[] {
|
|||
auto meta_items = get_meta_items(attr_doc);
|
||||
// Currently it's only possible to have a single meta item on
|
||||
// an attribute
|
||||
assert (vec::len(meta_items) == 1u);
|
||||
assert (ivec::len(meta_items) == 1u);
|
||||
auto meta_item = meta_items.(0);
|
||||
attrs += ~[rec(node=rec(style=ast::attr_outer,
|
||||
value=*meta_item),
|
||||
|
|
|
|||
|
|
@ -473,9 +473,8 @@ fn encode_attributes(&ebml::writer ebml_w, &vec[attribute] attrs) {
|
|||
fn synthesize_crate_attrs(&@crate_ctxt cx,
|
||||
&@crate crate) -> vec[attribute] {
|
||||
|
||||
fn synthesize_link_attr(&@crate_ctxt cx,
|
||||
&vec[@meta_item] items)
|
||||
-> attribute {
|
||||
fn synthesize_link_attr(&@crate_ctxt cx, &(@meta_item)[] items)
|
||||
-> attribute {
|
||||
|
||||
assert cx.link_meta.name != "";
|
||||
assert cx.link_meta.vers != "";
|
||||
|
|
@ -490,7 +489,7 @@ fn synthesize_crate_attrs(&@crate_ctxt cx,
|
|||
attr::remove_meta_items_by_name(tmp, "vers")
|
||||
};
|
||||
|
||||
auto meta_items = [name_item] + [vers_item] + other_items;
|
||||
auto meta_items = ~[name_item, vers_item] + other_items;
|
||||
auto link_item = attr::mk_list_item("link", meta_items);
|
||||
|
||||
ret attr::mk_attr(link_item);
|
||||
|
|
@ -513,7 +512,7 @@ fn synthesize_crate_attrs(&@crate_ctxt cx,
|
|||
}
|
||||
|
||||
if (!found_link_attr) {
|
||||
attrs += [synthesize_link_attr(cx, [])];
|
||||
attrs += [synthesize_link_attr(cx, ~[])];
|
||||
}
|
||||
|
||||
ret attrs;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue