Permit view items in native modules.

This commit is contained in:
Graydon Hoare 2011-03-07 11:48:43 -08:00
parent dfa85968c3
commit 90f299e710
4 changed files with 61 additions and 9 deletions

View file

@ -265,6 +265,11 @@ tag mod_index_entry {
mie_tag_variant(@item /* tag item */, uint /* variant index */);
}
tag native_mod_index_entry {
nmie_view_item(@view_item);
nmie_item(@native_item);
}
type mod_index = hashmap[ident,mod_index_entry];
type _mod = rec(vec[@view_item] view_items,
vec[@item] items,
@ -277,9 +282,10 @@ tag native_abi {
type native_mod = rec(str native_name,
native_abi abi,
vec[@view_item] view_items,
vec[@native_item] items,
native_mod_index index);
type native_mod_index = hashmap[ident,@native_item];
type native_mod_index = hashmap[ident,native_mod_index_entry];
type variant_arg = rec(@ty ty, def_id id);
type variant = rec(str name, vec[variant_arg] args, def_id id, ann ann);
@ -359,10 +365,23 @@ fn index_item(mod_index index, @item it) {
fn index_native_item(native_mod_index index, @native_item it) {
alt (it.node) {
case (ast.native_item_ty(?id, _)) {
index.insert(id, it);
index.insert(id, ast.nmie_item(it));
}
case (ast.native_item_fn(?id, _, _, _, _)) {
index.insert(id, it);
index.insert(id, ast.nmie_item(it));
}
}
}
fn index_native_view_item(native_mod_index index, @view_item it) {
alt (it.node) {
case(ast.view_item_import(?def_ident,_,_,_)) {
index.insert(def_ident, ast.nmie_view_item(it));
}
case(ast.view_item_export(_)) {
// NB: don't index these, they might collide with
// the import or use that they're exporting. Have
// to do linear search for exports.
}
}
}

View file

@ -1846,8 +1846,11 @@ impure fn parse_native_item(parser p) -> @ast.native_item {
impure fn parse_native_mod_items(parser p,
str native_name,
ast.native_abi abi) -> ast.native_mod {
auto index = new_str_hash[@ast.native_item]();
auto index = new_str_hash[ast.native_mod_index_entry]();
let vec[@ast.native_item] items = vec();
auto view_items = parse_native_view(p, index);
while (p.peek() != token.RBRACE) {
auto item = parse_native_item(p);
items += vec(item);
@ -1856,7 +1859,9 @@ impure fn parse_native_mod_items(parser p,
ast.index_native_item(index, item);
}
ret rec(native_name=native_name, abi=abi,
items=items, index=index);
view_items=view_items,
items=items,
index=index);
}
fn default_native_name(session.session sess, str id) -> str {
@ -2230,6 +2235,19 @@ impure fn parse_view(parser p, ast.mod_index index) -> vec[@ast.view_item] {
ret items;
}
impure fn parse_native_view(parser p, ast.native_mod_index index)
-> vec[@ast.view_item] {
let vec[@ast.view_item] items = vec();
while (is_view_item(p.peek())) {
auto item = parse_view_item(p);
items += vec(item);
ast.index_native_view_item(index, item);
}
ret items;
}
impure fn parse_crate_from_source_file(parser p) -> @ast.crate {
auto lo = p.get_span();
auto hi = lo;