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...)
This commit is contained in:
Tim Chevalier 2012-08-29 12:22:05 -07:00
parent cdcf5a7580
commit cb8ecd7984
8 changed files with 54 additions and 20 deletions

View file

@ -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,