Skip to content

Commit 8e380bc

Browse files
committed
---
yaml --- r: 1333 b: refs/heads/master c: dd3ed61 h: refs/heads/master i: 1331: 87b31a0 v: v3
1 parent b9225eb commit 8e380bc

File tree

5 files changed

+97
-5
lines changed

5 files changed

+97
-5
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: f22dc4d581760d365392323a431f4787f31ae130
2+
refs/heads/master: dd3ed6139a6fc6fda15403d0b5679535959945e5

trunk/src/comp/front/ast.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,6 @@ type obj_field = rec(@ty ty, ident ident, def_id id, ann ann);
215215
type _obj = rec(vec[obj_field] fields,
216216
vec[@method] methods);
217217

218-
219218
tag mod_index_entry {
220219
mie_view_item(@view_item);
221220
mie_item(@item);
@@ -227,7 +226,10 @@ type _mod = rec(vec[@view_item] view_items,
227226
vec[@item] items,
228227
mod_index index);
229228

230-
type native_mod = rec(str native_name);
229+
type native_mod = rec(str native_name,
230+
vec[@native_item] items,
231+
native_mod_index index);
232+
type native_mod_index = hashmap[ident,@native_item];
231233

232234
type variant_arg = rec(@ty ty, def_id id);
233235
type variant = rec(str name, vec[variant_arg] args, def_id id, ann ann);
@@ -249,6 +251,11 @@ tag item_ {
249251
item_obj(ident, _obj, vec[ty_param], def_id, ann);
250252
}
251253

254+
type native_item = spanned[native_item_];
255+
tag native_item_ {
256+
native_item_ty(ident, def_id);
257+
}
258+
252259
fn index_view_item(mod_index index, @view_item it) {
253260
alt (it.node) {
254261
case(ast.view_item_use(?id, _, _)) {
@@ -292,6 +299,14 @@ fn index_item(mod_index index, @item it) {
292299
}
293300
}
294301

302+
fn index_native_item(native_mod_index index, @native_item it) {
303+
alt (it.node) {
304+
case (ast.native_item_ty(?id, _)) {
305+
index.insert(id, it);
306+
}
307+
}
308+
}
309+
295310
//
296311
// Local Variables:
297312
// mode: rust

trunk/src/comp/front/parser.rs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1577,14 +1577,47 @@ impure fn parse_item_mod(parser p) -> @ast.item {
15771577
ret @spanned(lo, hi, item);
15781578
}
15791579

1580+
1581+
impure fn parse_item_native_type(parser p) -> @ast.native_item {
1582+
auto lo = p.get_span();
1583+
expect(p, token.TYPE);
1584+
auto id = parse_ident(p);
1585+
auto hi = p.get_span();
1586+
expect(p, token.SEMI);
1587+
auto item = ast.native_item_ty(id, p.next_def_id());
1588+
ret @spanned(lo, hi, item);
1589+
}
1590+
1591+
impure fn parse_native_item(parser p) -> @ast.native_item {
1592+
alt (p.peek()) {
1593+
case (token.TYPE) {
1594+
ret parse_item_native_type(p);
1595+
}
1596+
}
1597+
}
1598+
1599+
impure fn parse_native_mod_items(parser p,
1600+
str native_name) -> ast.native_mod {
1601+
auto index = new_str_hash[@ast.native_item]();
1602+
let vec[@ast.native_item] items = vec();
1603+
while (p.peek() != token.RBRACE) {
1604+
auto item = parse_native_item(p);
1605+
items += vec(item);
1606+
1607+
// Index the item.
1608+
ast.index_native_item(index, item);
1609+
}
1610+
ret rec(native_name=native_name, items=items, index=index);
1611+
}
1612+
15801613
impure fn parse_item_native_mod(parser p) -> @ast.item {
15811614
auto lo = p.get_span();
15821615
expect(p, token.NATIVE);
15831616
auto native_name = parse_str_lit(p);
15841617
expect(p, token.MOD);
15851618
auto id = parse_ident(p);
15861619
expect(p, token.LBRACE);
1587-
auto m = rec(native_name = native_name);
1620+
auto m = parse_native_mod_items(p, native_name);
15881621
auto hi = p.get_span();
15891622
expect(p, token.RBRACE);
15901623
auto item = ast.item_native_mod(id, m, p.next_def_id());

trunk/src/comp/middle/fold.rs

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import front.ast.block;
2020
import front.ast.item;
2121
import front.ast.view_item;
2222
import front.ast.meta_item;
23+
import front.ast.native_item;
2324
import front.ast.arg;
2425
import front.ast.pat;
2526
import front.ast.decl;
@@ -203,6 +204,9 @@ type ast_fold[ENV] =
203204
@ty t, vec[ast.ty_param] ty_params,
204205
def_id id, ann a) -> @item) fold_item_ty,
205206

207+
(fn(&ENV e, &span sp, ident ident,
208+
def_id id) -> @native_item) fold_native_item_ty,
209+
206210
(fn(&ENV e, &span sp, ident ident,
207211
vec[ast.variant] variants,
208212
vec[ast.ty_param] ty_params,
@@ -244,6 +248,7 @@ type ast_fold[ENV] =
244248
// Env updates.
245249
(fn(&ENV e, @ast.crate c) -> ENV) update_env_for_crate,
246250
(fn(&ENV e, @item i) -> ENV) update_env_for_item,
251+
(fn(&ENV e, @native_item i) -> ENV) update_env_for_native_item,
247252
(fn(&ENV e, @view_item i) -> ENV) update_env_for_view_item,
248253
(fn(&ENV e, &block b) -> ENV) update_env_for_block,
249254
(fn(&ENV e, @stmt s) -> ENV) update_env_for_stmt,
@@ -841,9 +846,34 @@ fn fold_mod[ENV](&ENV e, ast_fold[ENV] fld, &ast._mod m) -> ast._mod {
841846
ret fld.fold_mod(e, rec(view_items=view_items, items=items, index=index));
842847
}
843848

849+
fn fold_native_item[ENV](&ENV env, ast_fold[ENV] fld,
850+
@native_item i) -> @native_item {
851+
let ENV env_ = fld.update_env_for_native_item(env, i);
852+
853+
if (!fld.keep_going(env_)) {
854+
ret i;
855+
}
856+
alt (i.node) {
857+
case (ast.native_item_ty(?ident, ?id)) {
858+
ret fld.fold_native_item_ty(env_, i.span, ident, id);
859+
}
860+
}
861+
}
862+
844863
fn fold_native_mod[ENV](&ENV e, ast_fold[ENV] fld,
845864
&ast.native_mod m) -> ast.native_mod {
846-
ret fld.fold_native_mod(e, rec(native_name = m.native_name));
865+
let vec[@native_item] items = vec();
866+
auto index = new_str_hash[@ast.native_item]();
867+
868+
for (@native_item i in m.items) {
869+
auto new_item = fold_native_item[ENV](e, fld, i);
870+
append[@native_item](items, new_item);
871+
ast.index_native_item(index, new_item);
872+
}
873+
874+
ret fld.fold_native_mod(e, rec(native_name=m.native_name,
875+
items=items,
876+
index=index));
847877
}
848878

849879
fn fold_crate[ENV](&ENV env, ast_fold[ENV] fld, @ast.crate c) -> @ast.crate {
@@ -1130,6 +1160,11 @@ fn identity_fold_item_ty[ENV](&ENV e, &span sp, ident i,
11301160
ret @respan(sp, ast.item_ty(i, t, ty_params, id, a));
11311161
}
11321162

1163+
fn identity_fold_native_item_ty[ENV](&ENV e, &span sp, ident i,
1164+
def_id id) -> @native_item {
1165+
ret @respan(sp, ast.native_item_ty(i, id));
1166+
}
1167+
11331168
fn identity_fold_item_tag[ENV](&ENV e, &span sp, ident i,
11341169
vec[ast.variant] variants,
11351170
vec[ast.ty_param] ty_params,
@@ -1204,6 +1239,10 @@ fn identity_update_env_for_item[ENV](&ENV e, @item i) -> ENV {
12041239
ret e;
12051240
}
12061241

1242+
fn identity_update_env_for_native_item[ENV](&ENV e, @native_item i) -> ENV {
1243+
ret e;
1244+
}
1245+
12071246
fn identity_update_env_for_view_item[ENV](&ENV e, @view_item i) -> ENV {
12081247
ret e;
12091248
}
@@ -1308,6 +1347,8 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
13081347
fold_item_native_mod =
13091348
bind identity_fold_item_native_mod[ENV](_,_,_,_,_),
13101349
fold_item_ty = bind identity_fold_item_ty[ENV](_,_,_,_,_,_,_),
1350+
fold_native_item_ty =
1351+
bind identity_fold_native_item_ty[ENV](_,_,_,_),
13111352
fold_item_tag = bind identity_fold_item_tag[ENV](_,_,_,_,_,_),
13121353
fold_item_obj = bind identity_fold_item_obj[ENV](_,_,_,_,_,_,_),
13131354

@@ -1325,6 +1366,8 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
13251366

13261367
update_env_for_crate = bind identity_update_env_for_crate[ENV](_,_),
13271368
update_env_for_item = bind identity_update_env_for_item[ENV](_,_),
1369+
update_env_for_native_item =
1370+
bind identity_update_env_for_native_item[ENV](_,_),
13281371
update_env_for_view_item =
13291372
bind identity_update_env_for_view_item[ENV](_,_),
13301373
update_env_for_block = bind identity_update_env_for_block[ENV](_,_),

trunk/src/test/run-pass/native2.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
native "rust" mod rustrt {
2+
type vbuf;
23
}
34

45
fn main(vec[str] args) {

0 commit comments

Comments
 (0)