about summary refs log tree commit diff
path: root/src/libsyntax/parse/parser.rs
diff options
context:
space:
mode:
authorTim Chevalier <chevalier@alum.wellesley.edu>2012-08-29 12:22:05 -0700
committerTim Chevalier <chevalier@alum.wellesley.edu>2012-08-29 12:22:05 -0700
commitcb8ecd79849160d8cff2eff8b070efd7f9a3b9a7 (patch)
tree8dd4917d09b01017532ed6c8037c5bf5cc88cd56 /src/libsyntax/parse/parser.rs
parentcdcf5a7580147a58ecbe06323ad7c267f2e5ae28 (diff)
downloadrust-cb8ecd79849160d8cff2eff8b070efd7f9a3b9a7.tar.gz
rust-cb8ecd79849160d8cff2eff8b070efd7f9a3b9a7.zip
Allow extern mods to be anonymous
extern mod {
  f();
}

is now allowed, and puts f in the enclosing scope. (Requires a
link_name attribute to be really useful...)
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
-rw-r--r--src/libsyntax/parse/parser.rs13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 8bc78a53548..f9a9a8261e9 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -2890,7 +2890,8 @@ struct parser {
         }
     }
 
-    fn parse_foreign_mod_items(+first_item_attrs: ~[attribute]) ->
+    fn parse_foreign_mod_items(sort: ast::foreign_mod_sort,
+                               +first_item_attrs: ~[attribute]) ->
         foreign_mod {
         // Shouldn't be any view items since we've already parsed an item attr
         let {attrs_remaining, view_items, items: _} =
@@ -2905,7 +2906,7 @@ struct parser {
             initial_attrs = ~[];
             vec::push(items, self.parse_foreign_item(attrs));
         }
-        return {view_items: view_items,
+        return {sort: sort, view_items: view_items,
              items: items};
     }
 
@@ -2919,12 +2920,16 @@ struct parser {
         } else {
             self.expect_keyword(~"module");
         }
-        let ident = self.parse_ident();
+        let (sort, ident) = match self.token {
+                token::IDENT(*) => (ast::named, self.parse_ident()),
+                _ => (ast::anonymous,
+                      token::special_idents::clownshoes_foreign_mod)
+        };
 
         // extern mod { ... }
         if items_allowed && self.eat(token::LBRACE) {
             let extra_attrs = self.parse_inner_attrs_and_next();
-            let m = self.parse_foreign_mod_items(extra_attrs.next);
+            let m = self.parse_foreign_mod_items(sort, extra_attrs.next);
             self.expect(token::RBRACE);
             return iovi_item(self.mk_item(lo, self.last_span.hi, ident,
                                           item_foreign_mod(m), visibility,