diff options
| author | Tim Chevalier <chevalier@alum.wellesley.edu> | 2012-08-29 12:22:05 -0700 |
|---|---|---|
| committer | Tim Chevalier <chevalier@alum.wellesley.edu> | 2012-08-29 12:22:05 -0700 |
| commit | cb8ecd79849160d8cff2eff8b070efd7f9a3b9a7 (patch) | |
| tree | 8dd4917d09b01017532ed6c8037c5bf5cc88cd56 /src/libsyntax/parse | |
| parent | cdcf5a7580147a58ecbe06323ad7c267f2e5ae28 (diff) | |
| download | rust-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')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 13 | ||||
| -rw-r--r-- | src/libsyntax/parse/token.rs | 4 |
2 files changed, 11 insertions, 6 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, diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index 846a7e7c88e..ae1c829b3fb 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -319,7 +319,7 @@ mod special_idents { const blk : ident = 30u; const static : ident = 31u; const intrinsic : ident = 32u; - + const clownshoes_foreign_mod: ident = 33; } type ident_interner = util::interner::interner<@~str>; @@ -343,7 +343,7 @@ fn mk_ident_interner() -> ident_interner { @~"str", @~"ty_visitor", @~"arg", @~"descrim", @~"__rust_abi", @~"__rust_stack_shim", @~"tydesc", @~"dtor", @~"main", @~"<opaque>", @~"blk", @~"static", - @~"intrinsic"]; + @~"intrinsic", @~"__foreign_mod__"]; let rv = interner::mk_prefill::<@~str>(|x| str::hash(*x), |x,y| str::eq(*x, *y), init_vec); |
