From 0333612d935b88f37620be07fff971d79111823d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20=C3=81vila=20de=20Esp=C3=ADndola?= Date: Tue, 1 Feb 2011 12:09:54 -0500 Subject: [PATCH] Parse and store the optional native name in modules. --- src/Makefile | 1 + src/comp/front/ast.rs | 4 ++-- src/comp/front/parser.rs | 21 +++++++++++++++------ src/comp/middle/fold.rs | 14 ++++++++------ src/comp/middle/resolve.rs | 6 +++--- src/comp/middle/trans.rs | 4 ++-- src/comp/middle/ty.rs | 2 +- src/comp/middle/typeck.rs | 4 ++-- src/test/run-pass/native2.rs | 5 +++++ 9 files changed, 39 insertions(+), 22 deletions(-) create mode 100644 src/test/run-pass/native2.rs diff --git a/src/Makefile b/src/Makefile index 56a98b984f568..46afb56a0a2de 100644 --- a/src/Makefile +++ b/src/Makefile @@ -475,6 +475,7 @@ TEST_XFAILS_RUSTC := $(filter-out \ linear-for-loop.rs \ multiline-comment.rs \ mutual-recursion-group.rs \ + native2.rs \ obj-drop.rs \ obj-recursion.rs \ obj-with-vec.rs \ diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs index 10bcd5c4562f8..9dd2aa5a6a495 100644 --- a/src/comp/front/ast.rs +++ b/src/comp/front/ast.rs @@ -239,7 +239,7 @@ type item = spanned[item_]; tag item_ { item_const(ident, @ty, @expr, def_id, ann); item_fn(ident, _fn, vec[ty_param], def_id, ann); - item_mod(ident, _mod, def_id); + item_mod(ident, _mod, str, def_id); item_ty(ident, @ty, vec[ty_param], def_id, ann); item_tag(ident, vec[variant], vec[ty_param], def_id); item_obj(ident, _obj, vec[ty_param], def_id, ann); @@ -264,7 +264,7 @@ fn index_item(mod_index index, @item it) { case (ast.item_fn(?id, _, _, _, _)) { index.insert(id, ast.mie_item(it)); } - case (ast.item_mod(?id, _, _)) { + case (ast.item_mod(?id, _, _, _)) { index.insert(id, ast.mie_item(it)); } case (ast.item_ty(?id, _, _, _, _)) { diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index bef37a3cc7ea4..090de041ec706 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -1261,7 +1261,7 @@ fn index_block(vec[@ast.stmt] stmts, option.t[@ast.expr] expr) -> ast.block_ { case (ast.item_fn(?i, _, _, _, _)) { index.insert(i, u-1u); } - case (ast.item_mod(?i, _, _)) { + case (ast.item_mod(?i, _, _, _)) { index.insert(i, u-1u); } case (ast.item_ty(?i, _, _, _, _)) { @@ -1543,7 +1543,7 @@ impure fn parse_item_const(parser p) -> @ast.item { ret @spanned(lo, hi, item); } -impure fn parse_item_mod(parser p) -> @ast.item { +impure fn parse_item_mod(parser p, str native_name) -> @ast.item { auto lo = p.get_span(); expect(p, token.MOD); auto id = parse_ident(p); @@ -1551,7 +1551,7 @@ impure fn parse_item_mod(parser p) -> @ast.item { auto m = parse_mod_items(p, token.RBRACE); auto hi = p.get_span(); expect(p, token.RBRACE); - auto item = ast.item_mod(id, m, p.next_def_id()); + auto item = ast.item_mod(id, m, native_name, p.next_def_id()); ret @spanned(lo, hi, item); } @@ -1693,7 +1693,14 @@ impure fn parse_item(parser p) -> @ast.item { case (token.MOD) { check (eff == ast.eff_pure); check (lyr == ast.layer_value); - ret parse_item_mod(p); + ret parse_item_mod(p, ""); + } + case (token.NATIVE) { + check (eff == ast.eff_pure); + check (lyr == ast.layer_value); + p.bump(); + auto native_name = parse_str_lit(p); + ret parse_item_mod(p, native_name); } case (token.TYPE) { check (eff == ast.eff_pure); @@ -1912,7 +1919,8 @@ impure fn parse_crate_directive(str prefix, parser p, } auto p0 = new_parser(p.get_session(), 0, full_path); auto m0 = parse_mod_items(p0, token.EOF); - auto im = ast.item_mod(id, m0, p.next_def_id()); + // FIXME: are these modules never native? + auto im = ast.item_mod(id, m0, "", p.next_def_id()); auto i = @spanned(lo, hi, im); ast.index_item(index, i); append[@ast.item](items, i); @@ -1926,7 +1934,8 @@ impure fn parse_crate_directive(str prefix, parser p, token.RBRACE); hi = p.get_span(); expect(p, token.RBRACE); - auto im = ast.item_mod(id, m0, p.next_def_id()); + // FIXME: are these modules never native? + auto im = ast.item_mod(id, m0, "", p.next_def_id()); auto i = @spanned(lo, hi, im); ast.index_item(index, i); append[@ast.item](items, i); diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs index 67c260140b727..3d89374d0665f 100644 --- a/src/comp/middle/fold.rs +++ b/src/comp/middle/fold.rs @@ -192,7 +192,8 @@ type ast_fold[ENV] = def_id id, ann a) -> @item) fold_item_fn, (fn(&ENV e, &span sp, ident ident, - &ast._mod m, def_id id) -> @item) fold_item_mod, + &ast._mod m, str native_name, + def_id id) -> @item) fold_item_mod, (fn(&ENV e, &span sp, ident ident, @ty t, vec[ast.ty_param] ty_params, @@ -763,9 +764,9 @@ fn fold_item[ENV](&ENV env, ast_fold[ENV] fld, @item i) -> @item { ret fld.fold_item_fn(env_, i.span, ident, ff_, tps, id, ann); } - case (ast.item_mod(?ident, ?mm, ?id)) { + case (ast.item_mod(?ident, ?mm, ?n, ?id)) { let ast._mod mm_ = fold_mod[ENV](env_, fld, mm); - ret fld.fold_item_mod(env_, i.span, ident, mm_, id); + ret fld.fold_item_mod(env_, i.span, ident, mm_, n, id); } case (ast.item_ty(?ident, ?ty, ?params, ?id, ?ann)) { @@ -1088,8 +1089,9 @@ fn identity_fold_item_fn[ENV](&ENV e, &span sp, ident i, } fn identity_fold_item_mod[ENV](&ENV e, &span sp, ident i, - &ast._mod m, def_id id) -> @item { - ret @respan(sp, ast.item_mod(i, m, id)); + &ast._mod m, str native_name, + def_id id) -> @item { + ret @respan(sp, ast.item_mod(i, m, native_name, id)); } fn identity_fold_item_ty[ENV](&ENV e, &span sp, ident i, @@ -1267,7 +1269,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] { fold_item_const= bind identity_fold_item_const[ENV](_,_,_,_,_,_,_), fold_item_fn = bind identity_fold_item_fn[ENV](_,_,_,_,_,_,_), - fold_item_mod = bind identity_fold_item_mod[ENV](_,_,_,_,_), + fold_item_mod = bind identity_fold_item_mod[ENV](_,_,_,_,_,_), fold_item_ty = bind identity_fold_item_ty[ENV](_,_,_,_,_,_,_), fold_item_tag = bind identity_fold_item_tag[ENV](_,_,_,_,_,_), fold_item_obj = bind identity_fold_item_obj[ENV](_,_,_,_,_,_,_), diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs index 1af3b20596cd3..fc7bac6518cf8 100644 --- a/src/comp/middle/resolve.rs +++ b/src/comp/middle/resolve.rs @@ -64,7 +64,7 @@ fn unwrap_def(def_wrap d) -> def { } case (def_wrap_mod(?m)) { alt (m.node) { - case (ast.item_mod(_, _, ?id)) { + case (ast.item_mod(_, _, _, ?id)) { ret ast.def_mod(id); } } @@ -198,7 +198,7 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] { case (ast.item_fn(_, _, _, ?id, _)) { ret def_wrap_other(ast.def_fn(id)); } - case (ast.item_mod(_, _, ?id)) { + case (ast.item_mod(_, _, _, ?id)) { ret def_wrap_mod(i); } case (ast.item_ty(_, _, _, ?id, _)) { @@ -310,7 +310,7 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] { } } } - case (ast.item_mod(_, ?m, _)) { + case (ast.item_mod(_, ?m, _, _)) { ret check_mod(i, m); } case (ast.item_ty(_, _, ?ty_params, _, _)) { diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 7755ed93ca6d4..da2b55175f31e 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -3751,7 +3751,7 @@ fn trans_item(@crate_ctxt cx, &ast.item item) { obj_fields=ob.fields with *cx); trans_obj(sub_cx, ob, oid, tps, ann); } - case (ast.item_mod(?name, ?m, _)) { + case (ast.item_mod(?name, ?m, _, _)) { auto sub_cx = @rec(path=cx.path + "." + name with *cx); trans_mod(sub_cx, m); } @@ -3838,7 +3838,7 @@ fn collect_item(&@crate_ctxt cx, @ast.item i) -> @crate_ctxt { cx.items.insert(cid, i); } - case (ast.item_mod(?name, ?m, ?mid)) { + case (ast.item_mod(?name, ?m, _, ?mid)) { cx.items.insert(mid, i); } diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs index 7a184bc6dfb2e..b36f710e7c58d 100644 --- a/src/comp/middle/ty.rs +++ b/src/comp/middle/ty.rs @@ -584,7 +584,7 @@ fn item_ty(@ast.item it) -> ty_params_and_ty { ty_params = tps; result_ty = ann_to_type(ann); } - case (ast.item_mod(_, _, _)) { + case (ast.item_mod(_, _, _, _)) { fail; // modules are typeless } case (ast.item_ty(_, _, ?tps, _, ?ann)) { diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index ea9002aeccbee..37297d7fc858c 100644 --- a/src/comp/middle/typeck.rs +++ b/src/comp/middle/typeck.rs @@ -375,7 +375,7 @@ fn collect_item_types(session.session sess, @ast.crate crate) ret t; } - case (ast.item_mod(_, _, _)) { fail; } + case (ast.item_mod(_, _, _, _)) { fail; } } } @@ -452,7 +452,7 @@ fn collect_item_types(session.session sess, @ast.crate crate) fn convert(&@env e, @ast.item i) -> @env { alt (i.node) { - case (ast.item_mod(_, _, _)) { + case (ast.item_mod(_, _, _, _)) { // ignore item_mod, it has no type. } case (_) { diff --git a/src/test/run-pass/native2.rs b/src/test/run-pass/native2.rs new file mode 100644 index 0000000000000..abb6335249a06 --- /dev/null +++ b/src/test/run-pass/native2.rs @@ -0,0 +1,5 @@ +native "rust" mod rustrt { +} + +fn main(vec[str] args) { +}