diff options
Diffstat (limited to 'src/comp/front')
| -rw-r--r-- | src/comp/front/ast.rs | 25 | ||||
| -rw-r--r-- | src/comp/front/parser.rs | 22 |
2 files changed, 42 insertions, 5 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs index a8bf4b00..ed1e2114 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 8141595b..6f3111c7 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; |