Skip to content

Commit 01498c5

Browse files
committed
---
yaml --- r: 1379 b: refs/heads/master c: 59bce06 h: refs/heads/master i: 1377: 791943b 1375: 5e268f1 v: v3
1 parent 978f225 commit 01498c5

File tree

7 files changed

+70
-25
lines changed

7 files changed

+70
-25
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: 6393a34e6e4cfc7638d698353659643e63549532
2+
refs/heads/master: 59bce06a967b3806c3d874b8956857f0f01287e1

trunk/src/comp/front/ast.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ type expr = spanned[expr_];
146146
tag expr_ {
147147
expr_vec(vec[@expr], ann);
148148
expr_tup(vec[elt], ann);
149-
expr_rec(vec[field], ann);
149+
expr_rec(vec[field], option.t[@expr], ann);
150150
expr_call(@expr, vec[@expr], ann);
151151
expr_bind(@expr, vec[option.t[@expr]], ann);
152152
expr_binary(binop, @expr, @expr, ann);

trunk/src/comp/front/parser.rs

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -529,14 +529,37 @@ impure fn parse_bottom_expr(parser p) -> @ast.expr {
529529

530530
case (token.REC) {
531531
p.bump();
532-
auto pf = parse_field;
533-
auto fs =
534-
parse_seq[ast.field](token.LPAREN,
535-
token.RPAREN,
536-
some(token.COMMA),
537-
pf, p);
538-
hi = fs.span;
539-
ex = ast.expr_rec(fs.node, ast.ann_none);
532+
expect(p, token.LPAREN);
533+
auto fields = vec(parse_field(p));
534+
535+
auto more = true;
536+
auto base = none[@ast.expr];
537+
while (more) {
538+
alt (p.peek()) {
539+
case (token.RPAREN) {
540+
hi = p.get_span();
541+
p.bump();
542+
more = false;
543+
}
544+
case (token.WITH) {
545+
p.bump();
546+
base = some[@ast.expr](parse_expr(p));
547+
hi = p.get_span();
548+
expect(p, token.RPAREN);
549+
more = false;
550+
}
551+
case (token.COMMA) {
552+
p.bump();
553+
fields += parse_field(p);
554+
}
555+
case (?t) {
556+
unexpected(p, t);
557+
}
558+
}
559+
560+
}
561+
562+
ex = ast.expr_rec(fields, base, ast.ann_none);
540563
}
541564

542565
case (token.BIND) {
@@ -1370,7 +1393,7 @@ fn stmt_ends_with_semi(@ast.stmt stmt) -> bool {
13701393
alt (e.node) {
13711394
case (ast.expr_vec(_,_)) { ret true; }
13721395
case (ast.expr_tup(_,_)) { ret true; }
1373-
case (ast.expr_rec(_,_)) { ret true; }
1396+
case (ast.expr_rec(_,_,_)) { ret true; }
13741397
case (ast.expr_call(_,_,_)) { ret true; }
13751398
case (ast.expr_binary(_,_,_,_)) { ret true; }
13761399
case (ast.expr_unary(_,_,_)) { ret true; }

trunk/src/comp/middle/fold.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ type ast_fold[ENV] =
7575
vec[ast.elt] es, ann a) -> @expr) fold_expr_tup,
7676

7777
(fn(&ENV e, &span sp,
78-
vec[ast.field] fields, ann a) -> @expr) fold_expr_rec,
78+
vec[ast.field] fields,
79+
option.t[@expr] base, ann a) -> @expr) fold_expr_rec,
7980

8081
(fn(&ENV e, &span sp,
8182
@expr f, vec[@expr] args,
@@ -479,12 +480,19 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
479480
ret fld.fold_expr_tup(env_, e.span, elts, t);
480481
}
481482

482-
case (ast.expr_rec(?fs, ?t)) {
483+
case (ast.expr_rec(?fs, ?base, ?t)) {
483484
let vec[ast.field] fields = vec();
485+
let option.t[@expr] b = none[@expr];
484486
for (ast.field f in fs) {
485487
fields += fold_rec_field(env, fld, f);
486488
}
487-
ret fld.fold_expr_rec(env_, e.span, fields, t);
489+
alt (base) {
490+
case (none[@ast.expr]) { }
491+
case (some[@ast.expr](?eb)) {
492+
b = some[@expr](fold_expr(env_, fld, eb));
493+
}
494+
}
495+
ret fld.fold_expr_rec(env_, e.span, fields, b, t);
488496
}
489497

490498
case (ast.expr_call(?f, ?args, ?t)) {
@@ -1011,8 +1019,9 @@ fn identity_fold_expr_tup[ENV](&ENV env, &span sp,
10111019
}
10121020

10131021
fn identity_fold_expr_rec[ENV](&ENV env, &span sp,
1014-
vec[ast.field] fields, ann a) -> @expr {
1015-
ret @respan(sp, ast.expr_rec(fields, a));
1022+
vec[ast.field] fields,
1023+
option.t[@expr] base, ann a) -> @expr {
1024+
ret @respan(sp, ast.expr_rec(fields, base, a));
10161025
}
10171026

10181027
fn identity_fold_expr_call[ENV](&ENV env, &span sp, @expr f,
@@ -1358,7 +1367,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
13581367

13591368
fold_expr_vec = bind identity_fold_expr_vec[ENV](_,_,_,_),
13601369
fold_expr_tup = bind identity_fold_expr_tup[ENV](_,_,_,_),
1361-
fold_expr_rec = bind identity_fold_expr_rec[ENV](_,_,_,_),
1370+
fold_expr_rec = bind identity_fold_expr_rec[ENV](_,_,_,_,_),
13621371
fold_expr_call = bind identity_fold_expr_call[ENV](_,_,_,_,_),
13631372
fold_expr_bind = bind identity_fold_expr_bind[ENV](_,_,_,_,_),
13641373
fold_expr_binary = bind identity_fold_expr_binary[ENV](_,_,_,_,_,_),

trunk/src/comp/middle/trans.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2984,7 +2984,10 @@ fn trans_vec(@block_ctxt cx, vec[@ast.expr] args,
29842984
}
29852985

29862986
fn trans_rec(@block_ctxt cx, vec[ast.field] fields,
2987-
&ast.ann ann) -> result {
2987+
option.t[@ast.expr] base, &ast.ann ann) -> result {
2988+
2989+
// FIXME: handle presence of a nonempty base.
2990+
check (base == none[@ast.expr]);
29882991

29892992
auto bcx = cx;
29902993
auto t = node_ann_type(bcx.fcx.ccx, ann);
@@ -3099,8 +3102,8 @@ fn trans_expr(@block_ctxt cx, @ast.expr e) -> result {
30993102
ret trans_tup(cx, args, ann);
31003103
}
31013104

3102-
case (ast.expr_rec(?args, ?ann)) {
3103-
ret trans_rec(cx, args, ann);
3105+
case (ast.expr_rec(?args, ?base, ?ann)) {
3106+
ret trans_rec(cx, args, base, ann);
31043107
}
31053108

31063109
// lval cases fall through to trans_lval and then

trunk/src/comp/middle/ty.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,7 @@ fn expr_ty(@ast.expr expr) -> @t {
667667
alt (expr.node) {
668668
case (ast.expr_vec(_, ?ann)) { ret ann_to_type(ann); }
669669
case (ast.expr_tup(_, ?ann)) { ret ann_to_type(ann); }
670-
case (ast.expr_rec(_, ?ann)) { ret ann_to_type(ann); }
670+
case (ast.expr_rec(_, _, ?ann)) { ret ann_to_type(ann); }
671671
case (ast.expr_bind(_, _, ?ann)) { ret ann_to_type(ann); }
672672
case (ast.expr_call(_, _, ?ann)) { ret ann_to_type(ann); }
673673
case (ast.expr_binary(_, _, _, ?ann)) { ret ann_to_type(ann); }

trunk/src/comp/middle/typeck.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -910,7 +910,12 @@ fn demand_expr_full(&@fn_ctxt fcx, @ty.t expected, @ast.expr e,
910910
}
911911
e_1 = ast.expr_tup(elts_1, ast.ann_type(t));
912912
}
913-
case (ast.expr_rec(?fields_0, ?ann)) {
913+
case (ast.expr_rec(?fields_0, ?base_0, ?ann)) {
914+
915+
// FIXME: handle presence of a nonempty base.
916+
check (base_0 == none[@ast.expr]);
917+
auto base_1 = base_0;
918+
914919
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
915920
let vec[ast.field] fields_1 = vec();
916921
alt (t.struct) {
@@ -931,7 +936,7 @@ fn demand_expr_full(&@fn_ctxt fcx, @ty.t expected, @ast.expr e,
931936
fail;
932937
}
933938
}
934-
e_1 = ast.expr_rec(fields_1, ast.ann_type(t));
939+
e_1 = ast.expr_rec(fields_1, base_1, ast.ann_type(t));
935940
}
936941
case (ast.expr_bind(?sube, ?es, ?ann)) {
937942
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
@@ -1610,7 +1615,12 @@ fn check_expr(&@fn_ctxt fcx, @ast.expr expr) -> @ast.expr {
16101615
ast.expr_tup(elts_1, ann));
16111616
}
16121617

1613-
case (ast.expr_rec(?fields, _)) {
1618+
case (ast.expr_rec(?fields, ?base, _)) {
1619+
1620+
// FIXME: handle presence of a nonempty base.
1621+
check (base == none[@ast.expr]);
1622+
auto base_1 = base;
1623+
16141624
let vec[ast.field] fields_1 = vec();
16151625
let vec[field] fields_t = vec();
16161626

@@ -1626,7 +1636,7 @@ fn check_expr(&@fn_ctxt fcx, @ast.expr expr) -> @ast.expr {
16261636

16271637
auto ann = ast.ann_type(plain_ty(ty.ty_rec(fields_t)));
16281638
ret @fold.respan[ast.expr_](expr.span,
1629-
ast.expr_rec(fields_1, ann));
1639+
ast.expr_rec(fields_1, base_1, ann));
16301640
}
16311641

16321642
case (ast.expr_field(?base, ?field, _)) {

0 commit comments

Comments
 (0)