about summary refs log tree commit diff
path: root/src/comp/syntax/parse/parser.rs
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-07-05 12:38:53 -0700
committerBrian Anderson <banderson@mozilla.com>2011-07-05 12:43:44 -0700
commit8499c77cee3b745dfde576d1dbd03f292ab3c00f (patch)
tree6e196eedfa412f629cb2d78b8b3eb26005dce900 /src/comp/syntax/parse/parser.rs
parent10a4737d34e4b5112daaa80455ac671b87006c6b (diff)
downloadrust-8499c77cee3b745dfde576d1dbd03f292ab3c00f.tar.gz
rust-8499c77cee3b745dfde576d1dbd03f292ab3c00f.zip
Parse attributes for native items. Closes #609
Diffstat (limited to 'src/comp/syntax/parse/parser.rs')
-rw-r--r--src/comp/syntax/parse/parser.rs40
1 files changed, 30 insertions, 10 deletions
diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs
index 48213c1f1ac..e852fdcb0af 100644
--- a/src/comp/syntax/parse/parser.rs
+++ b/src/comp/syntax/parse/parser.rs
@@ -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);
 }
 
-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 hi = p.get_hi_pos();
     expect(p, token::SEMI);
     ret @rec(ident=t._1,
+             attrs=attrs,
              node=ast::native_item_ty,
              id=p.get_id(),
              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 t = parse_fn_header(p);
     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();
     expect(p, token::SEMI);
     ret @rec(ident=t._0,
+             attrs=attrs,
              node=ast::native_item_fn(link_name, decl, t._1),
              id=p.get_id(),
              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);
     if (eat_word(p, "type")) {
-        ret parse_item_native_type(p);
+        ret parse_item_native_type(p, attrs);
     } 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; }
 }
 
-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 {
+    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 = [];
-    auto view_items = parse_native_view(p);
-    while (p.peek() != token::RBRACE) { items += [parse_native_item(p)]; }
+    auto initial_attrs = first_item_attrs;
+    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,
             abi=abi,
             view_items=view_items,
@@ -1941,10 +1957,14 @@ fn parse_item_native_mod(&parser p, vec[ast::attribute] attrs) -> @ast::item {
         native_name = id;
     }
     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();
     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) {