Skip to content

Commit 90f299e

Browse files
committed
Permit view items in native modules.
1 parent dfa8596 commit 90f299e

File tree

4 files changed

+61
-9
lines changed

4 files changed

+61
-9
lines changed

src/comp/front/ast.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,11 @@ tag mod_index_entry {
265265
mie_tag_variant(@item /* tag item */, uint /* variant index */);
266266
}
267267

268+
tag native_mod_index_entry {
269+
nmie_view_item(@view_item);
270+
nmie_item(@native_item);
271+
}
272+
268273
type mod_index = hashmap[ident,mod_index_entry];
269274
type _mod = rec(vec[@view_item] view_items,
270275
vec[@item] items,
@@ -277,9 +282,10 @@ tag native_abi {
277282

278283
type native_mod = rec(str native_name,
279284
native_abi abi,
285+
vec[@view_item] view_items,
280286
vec[@native_item] items,
281287
native_mod_index index);
282-
type native_mod_index = hashmap[ident,@native_item];
288+
type native_mod_index = hashmap[ident,native_mod_index_entry];
283289

284290
type variant_arg = rec(@ty ty, def_id id);
285291
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) {
359365
fn index_native_item(native_mod_index index, @native_item it) {
360366
alt (it.node) {
361367
case (ast.native_item_ty(?id, _)) {
362-
index.insert(id, it);
368+
index.insert(id, ast.nmie_item(it));
363369
}
364370
case (ast.native_item_fn(?id, _, _, _, _)) {
365-
index.insert(id, it);
371+
index.insert(id, ast.nmie_item(it));
372+
}
373+
}
374+
}
375+
376+
fn index_native_view_item(native_mod_index index, @view_item it) {
377+
alt (it.node) {
378+
case(ast.view_item_import(?def_ident,_,_,_)) {
379+
index.insert(def_ident, ast.nmie_view_item(it));
380+
}
381+
case(ast.view_item_export(_)) {
382+
// NB: don't index these, they might collide with
383+
// the import or use that they're exporting. Have
384+
// to do linear search for exports.
366385
}
367386
}
368387
}

src/comp/front/parser.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1846,8 +1846,11 @@ impure fn parse_native_item(parser p) -> @ast.native_item {
18461846
impure fn parse_native_mod_items(parser p,
18471847
str native_name,
18481848
ast.native_abi abi) -> ast.native_mod {
1849-
auto index = new_str_hash[@ast.native_item]();
1849+
auto index = new_str_hash[ast.native_mod_index_entry]();
18501850
let vec[@ast.native_item] items = vec();
1851+
1852+
auto view_items = parse_native_view(p, index);
1853+
18511854
while (p.peek() != token.RBRACE) {
18521855
auto item = parse_native_item(p);
18531856
items += vec(item);
@@ -1856,7 +1859,9 @@ impure fn parse_native_mod_items(parser p,
18561859
ast.index_native_item(index, item);
18571860
}
18581861
ret rec(native_name=native_name, abi=abi,
1859-
items=items, index=index);
1862+
view_items=view_items,
1863+
items=items,
1864+
index=index);
18601865
}
18611866

18621867
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] {
22302235
ret items;
22312236
}
22322237

2238+
impure fn parse_native_view(parser p, ast.native_mod_index index)
2239+
-> vec[@ast.view_item] {
2240+
let vec[@ast.view_item] items = vec();
2241+
while (is_view_item(p.peek())) {
2242+
auto item = parse_view_item(p);
2243+
items += vec(item);
2244+
2245+
ast.index_native_view_item(index, item);
2246+
}
2247+
ret items;
2248+
}
2249+
2250+
22332251
impure fn parse_crate_from_source_file(parser p) -> @ast.crate {
22342252
auto lo = p.get_span();
22352253
auto hi = lo;

src/comp/middle/fold.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -957,8 +957,14 @@ fn fold_native_item[ENV](&ENV env, ast_fold[ENV] fld,
957957

958958
fn fold_native_mod[ENV](&ENV e, ast_fold[ENV] fld,
959959
&ast.native_mod m) -> ast.native_mod {
960+
let vec[@view_item] view_items = vec();
960961
let vec[@native_item] items = vec();
961-
auto index = new_str_hash[@ast.native_item]();
962+
auto index = new_str_hash[ast.native_mod_index_entry]();
963+
964+
for (@view_item vi in m.view_items) {
965+
auto new_vi = fold_view_item[ENV](e, fld, vi);
966+
append[@view_item](view_items, new_vi);
967+
}
962968

963969
for (@native_item i in m.items) {
964970
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,
968974

969975
ret fld.fold_native_mod(e, rec(native_name=m.native_name,
970976
abi=m.abi,
977+
view_items=view_items,
971978
items=items,
972979
index=index));
973980
}

src/comp/middle/resolve.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -300,11 +300,19 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] {
300300
}
301301

302302
fn check_native_mod(ast.ident i, ast.native_mod m) -> option.t[def_wrap] {
303+
303304
alt (m.index.find(i)) {
304-
case (some[@ast.native_item](?item)) {
305-
ret some(found_def_native_item(item));
305+
case (some[ast.native_mod_index_entry](?ent)) {
306+
alt (ent) {
307+
case (ast.nmie_view_item(?view_item)) {
308+
ret some(found_def_view(view_item));
309+
}
310+
case (ast.nmie_item(?item)) {
311+
ret some(found_def_native_item(item));
312+
}
313+
}
306314
}
307-
case (_) {
315+
case (none[ast.native_mod_index_entry]) {
308316
ret none[def_wrap];
309317
}
310318
}

0 commit comments

Comments
 (0)