Skip to content

Commit 0eefa5f

Browse files
committed
rustc: Parse module attributes
Issue #487
1 parent 31116dc commit 0eefa5f

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

src/comp/front/parser.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1595,7 +1595,7 @@ fn parse_source_stmt(&parser p) -> @ast::stmt {
15951595
auto hi = p.get_span();
15961596
ret @spanned(lo, decl.span.hi, ast::stmt_decl(decl, p.get_ann()));
15971597
} else {
1598-
alt (parse_item(p)) {
1598+
alt (parse_item(p, [])) {
15991599
case (got_item(?i)) {
16001600
auto hi = i.span.hi;
16011601
auto decl = @spanned(lo, hi, ast::decl_item(i));
@@ -1886,7 +1886,8 @@ fn parse_mod_items(&parser p, token::token term) -> ast::_mod {
18861886
auto view_items = parse_view(p);
18871887
let vec[@ast::item] items = [];
18881888
while (p.peek() != term) {
1889-
alt (parse_item(p)) {
1889+
auto attrs = parse_attributes(p);
1890+
alt (parse_item(p, attrs)) {
18901891
case (got_item(?i)) {
18911892
vec::push(items, i);
18921893
}
@@ -1911,14 +1912,14 @@ fn parse_item_const(&parser p) -> @ast::item {
19111912
ret @spanned(lo, hi, item);
19121913
}
19131914

1914-
fn parse_item_mod(&parser p) -> @ast::item {
1915+
fn parse_item_mod(&parser p, vec[ast::meta_item] attrs) -> @ast::item {
19151916
auto lo = p.get_last_lo_pos();
19161917
auto id = parse_ident(p);
19171918
expect(p, token::LBRACE);
19181919
auto m = parse_mod_items(p, token::RBRACE);
19191920
auto hi = p.get_hi_pos();
19201921
expect(p, token::RBRACE);
1921-
auto item = ast::item_mod(id, m, [], p.next_def_id());
1922+
auto item = ast::item_mod(id, m, attrs, p.next_def_id());
19221923
ret @spanned(lo, hi, item);
19231924
}
19241925

@@ -2124,7 +2125,8 @@ tag parsed_item {
21242125
fn_no_item;
21252126
}
21262127

2127-
fn parse_item(&parser p) -> parsed_item {
2128+
fn parse_item(&parser p, vec[ast::meta_item] attrs) -> parsed_item {
2129+
21282130
if (eat_word(p, "const")) {
21292131
ret got_item(parse_item_const(p));
21302132
} else if (eat_word(p, "fn")) {
@@ -2137,7 +2139,7 @@ fn parse_item(&parser p) -> parsed_item {
21372139
ret got_item(parse_item_fn_or_iter(p, ast::impure_fn,
21382140
ast::proto_iter));
21392141
} else if (eat_word(p, "mod")) {
2140-
ret got_item(parse_item_mod(p));
2142+
ret got_item(parse_item_mod(p, attrs));
21412143
} else if (eat_word(p, "native")) {
21422144
ret got_item(parse_item_native_mod(p));
21432145
}
@@ -2154,6 +2156,19 @@ fn parse_item(&parser p) -> parsed_item {
21542156
}
21552157
}
21562158

2159+
fn parse_attributes(&parser p) -> vec[ast::meta_item] {
2160+
let vec[ast::meta_item] attrs = [];
2161+
2162+
while (p.peek() == token::POUND) {
2163+
p.bump();
2164+
expect(p, token::LBRACKET);
2165+
attrs += [*parse_meta_item(p)];
2166+
expect(p, token::RBRACKET);
2167+
}
2168+
2169+
ret attrs;
2170+
}
2171+
21572172
fn parse_meta_item(&parser p) -> @ast::meta_item {
21582173
auto lo = p.get_lo_pos();
21592174
auto ident = parse_ident(p);

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// xfail-stage0
2+
3+
#[attr = "val"]
4+
mod mod1 {
5+
}
6+
7+
fn main() {
8+
}

0 commit comments

Comments
 (0)