Skip to content

Commit 8499c77

Browse files
committed
Parse attributes for native items. Closes #609
1 parent 10a4737 commit 8499c77

File tree

5 files changed

+48
-10
lines changed

5 files changed

+48
-10
lines changed

src/comp/syntax/ast.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,7 @@ tag item_ {
542542
}
543543

544544
type native_item = rec(ident ident,
545+
vec[attribute] attrs,
545546
native_item_ node,
546547
node_id id,
547548
span span);

src/comp/syntax/fold.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,11 @@ fn noop_fold_view_item(&view_item_ vi, ast_fold fld) -> view_item_ {
161161

162162
fn noop_fold_native_item(&@native_item ni, ast_fold fld) -> @native_item {
163163
auto fold_arg = bind fold_arg_(_, fld);
164+
auto fold_meta_item = bind fold_meta_item_(_,fld);
165+
auto fold_attribute = bind fold_attribute_(_,fold_meta_item);
164166

165167
ret @rec(ident=fld.fold_ident(ni.ident),
168+
attrs=map(fold_attribute, ni.attrs),
166169
node=alt (ni.node) {
167170
case (native_item_ty) { native_item_ty }
168171
case (native_item_fn(?st, ?fdec, ?typms)) {

src/comp/syntax/parse/parser.rs

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1870,17 +1870,20 @@ fn parse_item_mod(&parser p, vec[ast::attribute] attrs) -> @ast::item {
18701870
ret mk_item(p, lo, hi, id, ast::item_mod(m), attrs + inner_attrs._0);
18711871
}
18721872

1873-
fn parse_item_native_type(&parser p) -> @ast::native_item {
1873+
fn parse_item_native_type(&parser p,
1874+
&vec[ast::attribute] attrs) -> @ast::native_item {
18741875
auto t = parse_type_decl(p);
18751876
auto hi = p.get_hi_pos();
18761877
expect(p, token::SEMI);
18771878
ret @rec(ident=t._1,
1879+
attrs=attrs,
18781880
node=ast::native_item_ty,
18791881
id=p.get_id(),
18801882
span=rec(lo=t._0, hi=hi));
18811883
}
18821884

1883-
fn parse_item_native_fn(&parser p) -> @ast::native_item {
1885+
fn parse_item_native_fn(&parser p,
1886+
&vec[ast::attribute] attrs) -> @ast::native_item {
18841887
auto lo = p.get_last_lo_pos();
18851888
auto t = parse_fn_header(p);
18861889
auto decl = parse_fn_decl(p, ast::impure_fn);
@@ -1892,25 +1895,38 @@ fn parse_item_native_fn(&parser p) -> @ast::native_item {
18921895
auto hi = p.get_hi_pos();
18931896
expect(p, token::SEMI);
18941897
ret @rec(ident=t._0,
1898+
attrs=attrs,
18951899
node=ast::native_item_fn(link_name, decl, t._1),
18961900
id=p.get_id(),
18971901
span=rec(lo=lo, hi=hi));
18981902
}
18991903

1900-
fn parse_native_item(&parser p) -> @ast::native_item {
1904+
fn parse_native_item(&parser p,
1905+
&vec[ast::attribute] attrs) -> @ast::native_item {
19011906
parse_layer(p);
19021907
if (eat_word(p, "type")) {
1903-
ret parse_item_native_type(p);
1908+
ret parse_item_native_type(p, attrs);
19041909
} else if (eat_word(p, "fn")) {
1905-
ret parse_item_native_fn(p);
1910+
ret parse_item_native_fn(p, attrs);
19061911
} else { unexpected(p, p.peek()); fail; }
19071912
}
19081913

1909-
fn parse_native_mod_items(&parser p, &str native_name, ast::native_abi abi) ->
1914+
fn parse_native_mod_items(&parser p, &str native_name, ast::native_abi abi,
1915+
&vec[ast::attribute] first_item_attrs) ->
19101916
ast::native_mod {
1917+
auto view_items = if (vec::len(first_item_attrs) == 0u) {
1918+
parse_native_view(p)
1919+
} else {
1920+
// Shouldn't be any view items since we've already parsed an item attr
1921+
[]
1922+
};
19111923
let vec[@ast::native_item] items = [];
1912-
auto view_items = parse_native_view(p);
1913-
while (p.peek() != token::RBRACE) { items += [parse_native_item(p)]; }
1924+
auto initial_attrs = first_item_attrs;
1925+
while (p.peek() != token::RBRACE) {
1926+
auto attrs = initial_attrs + parse_outer_attributes(p);
1927+
initial_attrs = [];
1928+
items += [parse_native_item(p, attrs)];
1929+
}
19141930
ret rec(native_name=native_name,
19151931
abi=abi,
19161932
view_items=view_items,
@@ -1941,10 +1957,14 @@ fn parse_item_native_mod(&parser p, vec[ast::attribute] attrs) -> @ast::item {
19411957
native_name = id;
19421958
}
19431959
expect(p, token::LBRACE);
1944-
auto m = parse_native_mod_items(p, native_name, abi);
1960+
auto more_attrs = parse_inner_attrs_and_next(p);
1961+
auto inner_attrs = more_attrs._0;
1962+
auto first_item_outer_attrs = more_attrs._1;
1963+
auto m = parse_native_mod_items(p, native_name, abi,
1964+
first_item_outer_attrs);
19451965
auto hi = p.get_hi_pos();
19461966
expect(p, token::RBRACE);
1947-
ret mk_item(p, lo, hi, id, ast::item_native_mod(m), attrs);
1967+
ret mk_item(p, lo, hi, id, ast::item_native_mod(m), attrs + inner_attrs);
19481968
}
19491969

19501970
fn parse_type_decl(&parser p) -> tup(uint, ast::ident) {

src/comp/syntax/print/pprust.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,8 +383,10 @@ fn print_item(&ps s, &@ast::item item) {
383383
word_nbsp(s, "mod");
384384
word_nbsp(s, item.ident);
385385
bopen(s);
386+
print_inner_attributes(s, item.attrs);
386387
for (@ast::native_item item in nmod.items) {
387388
hardbreak_if_not_bol(s);
389+
print_outer_attributes(s, item.attrs);
388390
ibox(s, indent_unit);
389391
maybe_print_comment(s, item.span.lo);
390392
alt (item.node) {

src/test/run-pass/item-attributes.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,18 @@ mod test_other_forms {
192192
}
193193
}
194194

195+
mod test_native_items {
196+
native "rust" mod rustrt {
197+
#[attr];
198+
199+
#[attr]
200+
type vbuf;
201+
202+
#[attr]
203+
fn vec_len[T](vec[T] v) -> uint;
204+
}
205+
}
206+
195207
fn main() {
196208
}
197209

0 commit comments

Comments
 (0)