1
Fork 0

Parse attributes for native items. Closes #609

This commit is contained in:
Brian Anderson 2011-07-05 12:38:53 -07:00
parent 10a4737d34
commit 8499c77cee
5 changed files with 48 additions and 10 deletions

View file

@ -542,6 +542,7 @@ tag item_ {
} }
type native_item = rec(ident ident, type native_item = rec(ident ident,
vec[attribute] attrs,
native_item_ node, native_item_ node,
node_id id, node_id id,
span span); span span);

View file

@ -161,8 +161,11 @@ fn noop_fold_view_item(&view_item_ vi, ast_fold fld) -> view_item_ {
fn noop_fold_native_item(&@native_item ni, ast_fold fld) -> @native_item { fn noop_fold_native_item(&@native_item ni, ast_fold fld) -> @native_item {
auto fold_arg = bind fold_arg_(_, fld); auto fold_arg = bind fold_arg_(_, fld);
auto fold_meta_item = bind fold_meta_item_(_,fld);
auto fold_attribute = bind fold_attribute_(_,fold_meta_item);
ret @rec(ident=fld.fold_ident(ni.ident), ret @rec(ident=fld.fold_ident(ni.ident),
attrs=map(fold_attribute, ni.attrs),
node=alt (ni.node) { node=alt (ni.node) {
case (native_item_ty) { native_item_ty } case (native_item_ty) { native_item_ty }
case (native_item_fn(?st, ?fdec, ?typms)) { case (native_item_fn(?st, ?fdec, ?typms)) {

View file

@ -1870,17 +1870,20 @@ fn parse_item_mod(&parser p, vec[ast::attribute] attrs) -> @ast::item {
ret mk_item(p, lo, hi, id, ast::item_mod(m), attrs + inner_attrs._0); ret mk_item(p, lo, hi, id, ast::item_mod(m), attrs + inner_attrs._0);
} }
fn parse_item_native_type(&parser p) -> @ast::native_item { fn parse_item_native_type(&parser p,
&vec[ast::attribute] attrs) -> @ast::native_item {
auto t = parse_type_decl(p); auto t = parse_type_decl(p);
auto hi = p.get_hi_pos(); auto hi = p.get_hi_pos();
expect(p, token::SEMI); expect(p, token::SEMI);
ret @rec(ident=t._1, ret @rec(ident=t._1,
attrs=attrs,
node=ast::native_item_ty, node=ast::native_item_ty,
id=p.get_id(), id=p.get_id(),
span=rec(lo=t._0, hi=hi)); span=rec(lo=t._0, hi=hi));
} }
fn parse_item_native_fn(&parser p) -> @ast::native_item { fn parse_item_native_fn(&parser p,
&vec[ast::attribute] attrs) -> @ast::native_item {
auto lo = p.get_last_lo_pos(); auto lo = p.get_last_lo_pos();
auto t = parse_fn_header(p); auto t = parse_fn_header(p);
auto decl = parse_fn_decl(p, ast::impure_fn); auto decl = parse_fn_decl(p, ast::impure_fn);
@ -1892,25 +1895,38 @@ fn parse_item_native_fn(&parser p) -> @ast::native_item {
auto hi = p.get_hi_pos(); auto hi = p.get_hi_pos();
expect(p, token::SEMI); expect(p, token::SEMI);
ret @rec(ident=t._0, ret @rec(ident=t._0,
attrs=attrs,
node=ast::native_item_fn(link_name, decl, t._1), node=ast::native_item_fn(link_name, decl, t._1),
id=p.get_id(), id=p.get_id(),
span=rec(lo=lo, hi=hi)); span=rec(lo=lo, hi=hi));
} }
fn parse_native_item(&parser p) -> @ast::native_item { fn parse_native_item(&parser p,
&vec[ast::attribute] attrs) -> @ast::native_item {
parse_layer(p); parse_layer(p);
if (eat_word(p, "type")) { if (eat_word(p, "type")) {
ret parse_item_native_type(p); ret parse_item_native_type(p, attrs);
} else if (eat_word(p, "fn")) { } else if (eat_word(p, "fn")) {
ret parse_item_native_fn(p); ret parse_item_native_fn(p, attrs);
} else { unexpected(p, p.peek()); fail; } } else { unexpected(p, p.peek()); fail; }
} }
fn parse_native_mod_items(&parser p, &str native_name, ast::native_abi abi) -> fn parse_native_mod_items(&parser p, &str native_name, ast::native_abi abi,
&vec[ast::attribute] first_item_attrs) ->
ast::native_mod { ast::native_mod {
auto view_items = if (vec::len(first_item_attrs) == 0u) {
parse_native_view(p)
} else {
// Shouldn't be any view items since we've already parsed an item attr
[]
};
let vec[@ast::native_item] items = []; let vec[@ast::native_item] items = [];
auto view_items = parse_native_view(p); auto initial_attrs = first_item_attrs;
while (p.peek() != token::RBRACE) { items += [parse_native_item(p)]; } while (p.peek() != token::RBRACE) {
auto attrs = initial_attrs + parse_outer_attributes(p);
initial_attrs = [];
items += [parse_native_item(p, attrs)];
}
ret rec(native_name=native_name, ret rec(native_name=native_name,
abi=abi, abi=abi,
view_items=view_items, view_items=view_items,
@ -1941,10 +1957,14 @@ fn parse_item_native_mod(&parser p, vec[ast::attribute] attrs) -> @ast::item {
native_name = id; native_name = id;
} }
expect(p, token::LBRACE); expect(p, token::LBRACE);
auto m = parse_native_mod_items(p, native_name, abi); auto more_attrs = parse_inner_attrs_and_next(p);
auto inner_attrs = more_attrs._0;
auto first_item_outer_attrs = more_attrs._1;
auto m = parse_native_mod_items(p, native_name, abi,
first_item_outer_attrs);
auto hi = p.get_hi_pos(); auto hi = p.get_hi_pos();
expect(p, token::RBRACE); expect(p, token::RBRACE);
ret mk_item(p, lo, hi, id, ast::item_native_mod(m), attrs); ret mk_item(p, lo, hi, id, ast::item_native_mod(m), attrs + inner_attrs);
} }
fn parse_type_decl(&parser p) -> tup(uint, ast::ident) { fn parse_type_decl(&parser p) -> tup(uint, ast::ident) {

View file

@ -383,8 +383,10 @@ fn print_item(&ps s, &@ast::item item) {
word_nbsp(s, "mod"); word_nbsp(s, "mod");
word_nbsp(s, item.ident); word_nbsp(s, item.ident);
bopen(s); bopen(s);
print_inner_attributes(s, item.attrs);
for (@ast::native_item item in nmod.items) { for (@ast::native_item item in nmod.items) {
hardbreak_if_not_bol(s); hardbreak_if_not_bol(s);
print_outer_attributes(s, item.attrs);
ibox(s, indent_unit); ibox(s, indent_unit);
maybe_print_comment(s, item.span.lo); maybe_print_comment(s, item.span.lo);
alt (item.node) { alt (item.node) {

View file

@ -192,6 +192,18 @@ mod test_other_forms {
} }
} }
mod test_native_items {
native "rust" mod rustrt {
#[attr];
#[attr]
type vbuf;
#[attr]
fn vec_len[T](vec[T] v) -> uint;
}
}
fn main() { fn main() {
} }