Skip to content

Commit 43cbbab

Browse files
committed
rustc: Correctly mark attributes as inner attributes
Issue #487
1 parent f3996d3 commit 43cbbab

File tree

1 file changed

+14
-8
lines changed

1 file changed

+14
-8
lines changed

src/comp/front/parser.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2050,7 +2050,7 @@ fn parse_outer_attrs_or_ext(&parser p) -> attr_or_ext {
20502050
auto lo = p.get_lo_pos();
20512051
p.bump();
20522052
if (p.peek() == token::LBRACKET) {
2053-
auto first_attr = parse_attribute_naked(p, lo);
2053+
auto first_attr = parse_attribute_naked(p, ast::attr_outer, lo);
20542054
ret some(left([first_attr] + parse_outer_attributes(p)));
20552055
} else {
20562056
ret some(right(parse_syntax_ext_naked(p, lo)));
@@ -2064,23 +2064,24 @@ fn parse_outer_attrs_or_ext(&parser p) -> attr_or_ext {
20642064
fn parse_outer_attributes(&parser p) -> vec[ast::attribute] {
20652065
let vec[ast::attribute] attrs = [];
20662066
while (p.peek() == token::POUND) {
2067-
attrs += [parse_attribute(p)];
2067+
attrs += [parse_attribute(p, ast::attr_outer)];
20682068
}
20692069
ret attrs;
20702070
}
20712071

2072-
fn parse_attribute(&parser p) -> ast::attribute {
2072+
fn parse_attribute(&parser p, ast::attr_style style) -> ast::attribute {
20732073
auto lo = p.get_lo_pos();
20742074
expect(p, token::POUND);
2075-
ret parse_attribute_naked(p, lo);
2075+
ret parse_attribute_naked(p, style, lo);
20762076
}
20772077

2078-
fn parse_attribute_naked(&parser p, uint lo) -> ast::attribute {
2078+
fn parse_attribute_naked(&parser p, ast::attr_style style,
2079+
uint lo) -> ast::attribute {
20792080
expect(p, token::LBRACKET);
20802081
auto meta_item = parse_meta_item(p);
20812082
expect(p, token::RBRACKET);
20822083
auto hi = p.get_hi_pos();
2083-
ret spanned(lo, hi, rec(style=ast::attr_outer, value=*meta_item));
2084+
ret spanned(lo, hi, rec(style=style, value=*meta_item));
20842085
}
20852086

20862087
// Parse attributes that appear after the opening of an item, each terminated
@@ -2094,12 +2095,17 @@ fn parse_inner_attributes(&parser p) -> tup(vec[ast::attribute],
20942095
let vec[ast::attribute] inner_attrs = [];
20952096
let vec[ast::attribute] next_outer_attrs = [];
20962097
while (p.peek() == token::POUND) {
2097-
auto attr = parse_attribute(p);
2098+
auto attr = parse_attribute(p, ast::attr_inner);
20982099
if (p.peek() == token::SEMI) {
20992100
p.bump();
21002101
inner_attrs += [attr];
21012102
} else {
2102-
next_outer_attrs += [attr];
2103+
// It's not really an inner attribute
2104+
auto outer_attr = spanned(attr.span.lo,
2105+
attr.span.hi,
2106+
rec(style=ast::attr_outer,
2107+
value=attr.node.value));
2108+
next_outer_attrs += [outer_attr];
21032109
break;
21042110
}
21052111
}

0 commit comments

Comments
 (0)