From 90f299e710c49d689d5bc815e32db375cca00394 Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Mon, 7 Mar 2011 11:48:43 -0800 Subject: [PATCH] Permit view items in native modules. --- src/comp/front/ast.rs | 25 ++++++++++++++++++++++--- src/comp/front/parser.rs | 22 ++++++++++++++++++++-- src/comp/middle/fold.rs | 9 ++++++++- src/comp/middle/resolve.rs | 14 +++++++++++--- 4 files changed, 61 insertions(+), 9 deletions(-) diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs index a8bf4b00a0a..ed1e21142c5 100644 --- a/src/comp/front/ast.rs +++ b/src/comp/front/ast.rs @@ -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. } } } diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index 8141595b144..6f3111c74d0 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -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; diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs index 935f426b74f..8a1dc70faaf 100644 --- a/src/comp/middle/fold.rs +++ b/src/comp/middle/fold.rs @@ -957,8 +957,14 @@ fn fold_native_item[ENV](&ENV env, ast_fold[ENV] fld, fn fold_native_mod[ENV](&ENV e, ast_fold[ENV] fld, &ast.native_mod m) -> ast.native_mod { + let vec[@view_item] view_items = vec(); let vec[@native_item] items = vec(); - auto index = new_str_hash[@ast.native_item](); + auto index = new_str_hash[ast.native_mod_index_entry](); + + for (@view_item vi in m.view_items) { + auto new_vi = fold_view_item[ENV](e, fld, vi); + append[@view_item](view_items, new_vi); + } for (@native_item i in m.items) { auto new_item = fold_native_item[ENV](e, fld, i); @@ -968,6 +974,7 @@ fn fold_native_mod[ENV](&ENV e, ast_fold[ENV] fld, ret fld.fold_native_mod(e, rec(native_name=m.native_name, abi=m.abi, + view_items=view_items, items=items, index=index)); } diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs index a2f4da6301a..5b6db631665 100644 --- a/src/comp/middle/resolve.rs +++ b/src/comp/middle/resolve.rs @@ -300,11 +300,19 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] { } fn check_native_mod(ast.ident i, ast.native_mod m) -> option.t[def_wrap] { + alt (m.index.find(i)) { - case (some[@ast.native_item](?item)) { - ret some(found_def_native_item(item)); + case (some[ast.native_mod_index_entry](?ent)) { + alt (ent) { + case (ast.nmie_view_item(?view_item)) { + ret some(found_def_view(view_item)); + } + case (ast.nmie_item(?item)) { + ret some(found_def_native_item(item)); + } + } } - case (_) { + case (none[ast.native_mod_index_entry]) { ret none[def_wrap]; } }