Add some helper functions for attributes. Issue #487

This commit is contained in:
Brian Anderson 2011-06-28 11:24:24 -07:00
parent 7554423423
commit 0608e277b6
4 changed files with 79 additions and 201 deletions

View file

@ -328,6 +328,10 @@ fn list_crate_attributes(&ebml::doc md, io::writer out) {
out.write_str("\n\n");
}
fn get_crate_attributes(&vec[u8] data) -> vec[ast::attribute] {
ret get_attributes(ebml::new_doc(data));
}
fn list_crate_items(vec[u8] bytes, &ebml::doc md, io::writer out) {
out.write_str("=Items=\n");
auto paths = ebml::get_doc(md, tag_paths);

74
src/comp/middle/attr.rs Normal file
View file

@ -0,0 +1,74 @@
import std::vec;
import std::option;
import front::ast;
export get_linkage_metas;
export find_attrs_by_name;
// From a list of crate attributes get only the meta_items that impact crate
// linkage
fn find_linkage_metas(vec[ast::attribute] attrs) -> vec[@ast::meta_item] {
let vec[@ast::meta_item] metas = [];
for (ast::attribute attr in find_attrs_by_name(attrs, "link")) {
alt (attr.node.value.node) {
case (ast::meta_list(_, ?items)) {
metas += items;
}
case (_) {
// FIXME: Maybe need a warning that this attr isn't
// being used for linkage
}
}
}
ret metas;
}
// Search a list of attributes and return only those with a specific name
fn find_attrs_by_name(vec[ast::attribute] attrs,
ast::ident name) -> vec[ast::attribute] {
auto filter = bind fn(&ast::attribute a,
ast::ident name) -> option::t[ast::attribute] {
if (get_attr_name(a) == name) {
option::some(a)
} else {
option::none
}
} (_, name);
ret vec::filter_map(filter, attrs);
}
fn get_attr_name(&ast::attribute attr) -> ast::ident {
get_meta_item_name(@attr.node.value)
}
fn find_meta_items_by_name(vec[@ast::meta_item] metas,
ast::ident name) -> vec[@ast::meta_item] {
auto filter = bind fn(&@ast::meta_item m,
ast::ident name) -> option::t[@ast::meta_item] {
if (get_meta_item_name(m) == name) {
option::some(m)
} else {
option::none
}
} (_, name);
ret vec::filter_map(filter, metas);
}
fn get_meta_item_name(&@ast::meta_item meta) -> ast::ident {
alt (meta.node) {
case (ast::meta_word(?n)) { n }
case (ast::meta_name_value(?n, _)) { n }
case (ast::meta_list(?n, _)) { n }
}
}
//
// Local Variables:
// mode: rust
// fill-column: 78;
// indent-tabs-mode: nil
// c-basic-offset: 4
// buffer-file-coding-system: utf-8-unix
// compile-command: "make -k -C $RBUILD 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
// End:
//

View file

@ -14,6 +14,7 @@ use std (name = "std",
url = "http://rust-lang.org/src/std");
mod middle {
mod attr;
mod trans;
mod ty;
mod walk;