Skip to content

Commit ffae642

Browse files
committed
rustc: Parse attributes in crate files
Issue #487
1 parent 62939e4 commit ffae642

File tree

3 files changed

+19
-6
lines changed

3 files changed

+19
-6
lines changed

src/comp/front/eval.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import ast::ident;
1010
import front::parser::parser;
1111
import front::parser::spanned;
1212
import front::parser::new_parser;
13-
import front::parser::parse_inner_attributes;
13+
import front::parser::parse_inner_attrs_and_next;
1414
import front::parser::parse_mod_items;
1515
import util::common;
1616
import util::common::filename;
@@ -288,7 +288,7 @@ fn eval_crate_directive(ctx cx, env e, @ast::crate_directive cdir, str prefix,
288288
auto p0 =
289289
new_parser(cx.sess, e, start_id, full_path, cx.chpos,
290290
cx.next_ann);
291-
auto inner_attrs = parse_inner_attributes(p0);
291+
auto inner_attrs = parse_inner_attrs_and_next(p0);
292292
auto first_item_outer_attrs = inner_attrs._1;
293293
auto m0 = parse_mod_items(p0, token::EOF,
294294
first_item_outer_attrs);

src/comp/front/parser.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1838,7 +1838,7 @@ fn parse_item_mod(&parser p, vec[ast::attribute] attrs) -> @ast::item {
18381838
auto lo = p.get_last_lo_pos();
18391839
auto id = parse_ident(p);
18401840
expect(p, token::LBRACE);
1841-
auto inner_attrs = parse_inner_attributes(p);
1841+
auto inner_attrs = parse_inner_attrs_and_next(p);
18421842
auto first_item_outer_attrs = inner_attrs._1;
18431843
auto m = parse_mod_items(p, token::RBRACE,
18441844
first_item_outer_attrs);
@@ -2095,8 +2095,8 @@ fn parse_attribute_naked(&parser p, ast::attr_style style,
20952095
// next item (since we can't know whether the attribute is an inner attribute
20962096
// of the containing item or an outer attribute of the first contained item
20972097
// until we see the semi).
2098-
fn parse_inner_attributes(&parser p) -> tup(vec[ast::attribute],
2099-
vec[ast::attribute]) {
2098+
fn parse_inner_attrs_and_next(&parser p) -> tup(vec[ast::attribute],
2099+
vec[ast::attribute]) {
21002100
let vec[ast::attribute] inner_attrs = [];
21012101
let vec[ast::attribute] next_outer_attrs = [];
21022102
while (p.peek() == token::POUND) {
@@ -2117,6 +2117,14 @@ fn parse_inner_attributes(&parser p) -> tup(vec[ast::attribute],
21172117
ret tup(inner_attrs, next_outer_attrs);
21182118
}
21192119

2120+
fn parse_inner_attrs(&parser p) -> vec[ast::attribute] {
2121+
auto attrs_and_next = parse_inner_attrs_and_next(p);
2122+
if (vec::len(attrs_and_next._1) > 0u) {
2123+
// FIXME: Don't drop this dangling attr on the ground
2124+
}
2125+
ret attrs_and_next._0;
2126+
}
2127+
21202128
fn parse_meta_item(&parser p) -> @ast::meta_item {
21212129
auto lo = p.get_lo_pos();
21222130
auto ident = parse_ident(p);
@@ -2369,6 +2377,8 @@ fn parse_crate_directives(&parser p, token::token term) ->
23692377
fn parse_crate_from_crate_file(&parser p) -> @ast::crate {
23702378
auto lo = p.get_lo_pos();
23712379
auto prefix = std::fs::dirname(p.get_filemap().name);
2380+
// FIXME (issue #487): Do something with these attrs
2381+
auto attrs = parse_inner_attrs(p);
23722382
auto cdirs = parse_crate_directives(p, token::EOF);
23732383
let vec[str] deps = [];
23742384
auto cx =

src/test/run-pass/crate-attributes.rc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
#[name = "crate-attributes"];
2+
#[vers = "1.0"];
3+
14
mod m = "crate-attributes-src" {
25
mod foo;
3-
}
6+
}

0 commit comments

Comments
 (0)