Skip to content

Commit c636223

Browse files
committed
---
yaml --- r: 1384 b: refs/heads/master c: f1f33ab h: refs/heads/master v: v3
1 parent 36b147f commit c636223

File tree

7 files changed

+213
-194
lines changed

7 files changed

+213
-194
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: 88cb9663639e915d2b69cef7ec514043ed39e5f4
2+
refs/heads/master: f1f33abdeba156523d6db1752bbff75dc4088724

trunk/src/comp/front/ast.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,6 @@ tag mode {
116116
type stmt = spanned[stmt_];
117117
tag stmt_ {
118118
stmt_decl(@decl);
119-
stmt_ret(option.t[@expr]);
120-
stmt_be(@expr);
121-
stmt_log(@expr);
122-
stmt_check_expr(@expr);
123-
stmt_fail;
124119
stmt_expr(@expr);
125120
}
126121

@@ -165,6 +160,11 @@ tag expr_ {
165160
expr_index(@expr, @expr, ann);
166161
expr_path(path, option.t[def], ann);
167162
expr_ext(vec[@expr], option.t[@expr], ann);
163+
expr_fail;
164+
expr_ret(option.t[@expr]);
165+
expr_be(@expr);
166+
expr_log(@expr);
167+
expr_check_expr(@expr);
168168
}
169169

170170
type lit = spanned[lit_];

trunk/src/comp/front/parser.rs

Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,59 @@ impure fn parse_bottom_expr(parser p) -> @ast.expr {
598598
ex = ast.expr_ext(es.node, none[@ast.expr], ast.ann_none);
599599
}
600600

601+
case (token.FAIL) {
602+
p.bump();
603+
ex = ast.expr_fail;
604+
}
605+
606+
case (token.LOG) {
607+
p.bump();
608+
auto e = parse_expr(p);
609+
auto hi = e.span;
610+
ex = ast.expr_log(e);
611+
}
612+
613+
case (token.CHECK) {
614+
p.bump();
615+
alt (p.peek()) {
616+
case (token.LPAREN) {
617+
auto e = parse_expr(p);
618+
auto hi = e.span;
619+
ex = ast.expr_check_expr(e);
620+
}
621+
case (_) {
622+
p.get_session().unimpl("constraint-check stmt");
623+
}
624+
}
625+
}
626+
627+
case (token.RET) {
628+
p.bump();
629+
alt (p.peek()) {
630+
case (token.SEMI) {
631+
ex = ast.expr_ret(none[@ast.expr]);
632+
}
633+
case (_) {
634+
auto e = parse_expr(p);
635+
hi = e.span;
636+
ex = ast.expr_ret(some[@ast.expr](e));
637+
}
638+
}
639+
}
640+
641+
case (token.BE) {
642+
p.bump();
643+
auto e = parse_expr(p);
644+
// FIXME: Is this the right place for this check?
645+
if /*check*/ (ast.is_call_expr(e)) {
646+
hi = e.span;
647+
ex = ast.expr_be(e);
648+
}
649+
else {
650+
p.err("Non-call expression in tail call");
651+
}
652+
}
653+
601654
case (_) {
602655
auto lit = parse_lit(p);
603656
hi = lit.span;
@@ -1203,59 +1256,6 @@ impure fn parse_stmt(parser p) -> @ast.stmt {
12031256
auto lo = p.get_span();
12041257
alt (p.peek()) {
12051258

1206-
case (token.LOG) {
1207-
p.bump();
1208-
auto e = parse_expr(p);
1209-
auto hi = p.get_span();
1210-
ret @spanned(lo, hi, ast.stmt_log(e));
1211-
}
1212-
1213-
case (token.CHECK) {
1214-
p.bump();
1215-
alt (p.peek()) {
1216-
case (token.LPAREN) {
1217-
auto e = parse_expr(p);
1218-
auto hi = p.get_span();
1219-
ret @spanned(lo, hi, ast.stmt_check_expr(e));
1220-
}
1221-
case (_) {
1222-
p.get_session().unimpl("constraint-check stmt");
1223-
}
1224-
}
1225-
}
1226-
1227-
case (token.FAIL) {
1228-
p.bump();
1229-
ret @spanned(lo, p.get_span(), ast.stmt_fail);
1230-
}
1231-
1232-
case (token.RET) {
1233-
p.bump();
1234-
alt (p.peek()) {
1235-
case (token.SEMI) {
1236-
ret @spanned(lo, p.get_span(),
1237-
ast.stmt_ret(none[@ast.expr]));
1238-
}
1239-
case (_) {
1240-
auto e = parse_expr(p);
1241-
ret @spanned(lo, e.span,
1242-
ast.stmt_ret(some[@ast.expr](e)));
1243-
}
1244-
}
1245-
}
1246-
1247-
case (token.BE) {
1248-
p.bump();
1249-
auto e = parse_expr(p);
1250-
// FIXME: Is this the right place for this check?
1251-
if /*check*/ (ast.is_call_expr(e)) {
1252-
ret @spanned(lo, e.span, ast.stmt_be(e));
1253-
}
1254-
else {
1255-
p.err("Non-call expression in tail call");
1256-
}
1257-
}
1258-
12591259
case (token.LET) {
12601260
auto decl = parse_let(p);
12611261
auto hi = p.get_span();
@@ -1396,11 +1396,6 @@ fn stmt_ends_with_semi(@ast.stmt stmt) -> bool {
13961396
case (ast.decl_item(_)) { ret false; }
13971397
}
13981398
}
1399-
case (ast.stmt_ret(_)) { ret true; }
1400-
case (ast.stmt_be(_)) { ret true; }
1401-
case (ast.stmt_log(_)) { ret true; }
1402-
case (ast.stmt_check_expr(_)) { ret true; }
1403-
case (ast.stmt_fail) { ret true; }
14041399
case (ast.stmt_expr(?e)) {
14051400
alt (e.node) {
14061401
case (ast.expr_vec(_,_)) { ret true; }
@@ -1423,6 +1418,11 @@ fn stmt_ends_with_semi(@ast.stmt stmt) -> bool {
14231418
case (ast.expr_field(_,_,_)) { ret true; }
14241419
case (ast.expr_index(_,_,_)) { ret true; }
14251420
case (ast.expr_path(_,_,_)) { ret true; }
1421+
case (ast.expr_fail) { ret true; }
1422+
case (ast.expr_ret(_)) { ret true; }
1423+
case (ast.expr_be(_)) { ret true; }
1424+
case (ast.expr_log(_)) { ret true; }
1425+
case (ast.expr_check_expr(_)) { ret true; }
14261426
}
14271427
}
14281428
}

trunk/src/comp/middle/fold.rs

Lines changed: 72 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,20 @@ type ast_fold[ENV] =
149149
&option.t[def] d,
150150
ann a) -> @expr) fold_expr_path,
151151

152+
(fn(&ENV e, &span sp) -> @expr) fold_expr_fail,
153+
154+
(fn(&ENV e, &span sp,
155+
&option.t[@expr] rv) -> @expr) fold_expr_ret,
156+
157+
(fn(&ENV e, &span sp,
158+
@expr e) -> @expr) fold_expr_be,
159+
160+
(fn(&ENV e, &span sp,
161+
@expr e) -> @expr) fold_expr_log,
162+
163+
(fn(&ENV e, &span sp,
164+
@expr e) -> @expr) fold_expr_check_expr,
165+
152166
// Decl folds.
153167
(fn(&ENV e, &span sp,
154168
@ast.local local) -> @decl) fold_decl_local,
@@ -177,18 +191,6 @@ type ast_fold[ENV] =
177191
(fn(&ENV e, &span sp,
178192
@decl decl) -> @stmt) fold_stmt_decl,
179193

180-
(fn(&ENV e, &span sp,
181-
&option.t[@expr] rv) -> @stmt) fold_stmt_ret,
182-
183-
(fn(&ENV e, &span sp,
184-
@expr e) -> @stmt) fold_stmt_be,
185-
186-
(fn(&ENV e, &span sp,
187-
@expr e) -> @stmt) fold_stmt_log,
188-
189-
(fn(&ENV e, &span sp,
190-
@expr e) -> @stmt) fold_stmt_check_expr,
191-
192194
(fn(&ENV e, &span sp,
193195
@expr e) -> @stmt) fold_stmt_expr,
194196

@@ -622,6 +624,37 @@ fn fold_expr[ENV](&ENV env, ast_fold[ENV] fld, &@expr e) -> @expr {
622624
auto p_ = fold_path(env_, fld, p);
623625
ret fld.fold_expr_path(env_, e.span, p_, r, t);
624626
}
627+
628+
case (ast.expr_fail) {
629+
ret fld.fold_expr_fail(env_, e.span);
630+
}
631+
632+
case (ast.expr_ret(?oe)) {
633+
auto oee = none[@expr];
634+
alt (oe) {
635+
case (some[@expr](?x)) {
636+
oee = some(fold_expr(env_, fld, x));
637+
}
638+
case (_) { /* fall through */ }
639+
}
640+
ret fld.fold_expr_ret(env_, e.span, oee);
641+
}
642+
643+
case (ast.expr_be(?x)) {
644+
auto ee = fold_expr(env_, fld, x);
645+
ret fld.fold_expr_be(env_, e.span, ee);
646+
}
647+
648+
case (ast.expr_log(?x)) {
649+
auto ee = fold_expr(env_, fld, x);
650+
ret fld.fold_expr_log(env_, e.span, ee);
651+
}
652+
653+
case (ast.expr_check_expr(?x)) {
654+
auto ee = fold_expr(env_, fld, x);
655+
ret fld.fold_expr_check_expr(env_, e.span, ee);
656+
}
657+
625658
}
626659

627660
ret e;
@@ -642,36 +675,6 @@ fn fold_stmt[ENV](&ENV env, ast_fold[ENV] fld, &@stmt s) -> @stmt {
642675
ret fld.fold_stmt_decl(env_, s.span, dd);
643676
}
644677

645-
case (ast.stmt_ret(?oe)) {
646-
auto oee = none[@expr];
647-
alt (oe) {
648-
case (some[@expr](?e)) {
649-
oee = some(fold_expr(env_, fld, e));
650-
}
651-
case (_) { /* fall through */ }
652-
}
653-
ret fld.fold_stmt_ret(env_, s.span, oee);
654-
}
655-
656-
case (ast.stmt_be(?e)) {
657-
auto ee = fold_expr(env_, fld, e);
658-
ret fld.fold_stmt_be(env_, s.span, ee);
659-
}
660-
661-
case (ast.stmt_log(?e)) {
662-
auto ee = fold_expr(env_, fld, e);
663-
ret fld.fold_stmt_log(env_, s.span, ee);
664-
}
665-
666-
case (ast.stmt_check_expr(?e)) {
667-
auto ee = fold_expr(env_, fld, e);
668-
ret fld.fold_stmt_check_expr(env_, s.span, ee);
669-
}
670-
671-
case (ast.stmt_fail) {
672-
ret s;
673-
}
674-
675678
case (ast.stmt_expr(?e)) {
676679
auto ee = fold_expr(env_, fld, e);
677680
ret fld.fold_stmt_expr(env_, s.span, ee);
@@ -1118,6 +1121,27 @@ fn identity_fold_expr_path[ENV](&ENV env, &span sp,
11181121
ret @respan(sp, ast.expr_path(p, d, a));
11191122
}
11201123

1124+
fn identity_fold_expr_fail[ENV](&ENV env, &span sp) -> @expr {
1125+
ret @respan(sp, ast.expr_fail);
1126+
}
1127+
1128+
fn identity_fold_expr_ret[ENV](&ENV env, &span sp,
1129+
&option.t[@expr] rv) -> @expr {
1130+
ret @respan(sp, ast.expr_ret(rv));
1131+
}
1132+
1133+
fn identity_fold_expr_be[ENV](&ENV env, &span sp, @expr x) -> @expr {
1134+
ret @respan(sp, ast.expr_be(x));
1135+
}
1136+
1137+
fn identity_fold_expr_log[ENV](&ENV e, &span sp, @expr x) -> @expr {
1138+
ret @respan(sp, ast.expr_log(x));
1139+
}
1140+
1141+
fn identity_fold_expr_check_expr[ENV](&ENV e, &span sp, @expr x) -> @expr {
1142+
ret @respan(sp, ast.expr_check_expr(x));
1143+
}
1144+
11211145

11221146
// Decl identities.
11231147

@@ -1158,23 +1182,6 @@ fn identity_fold_stmt_decl[ENV](&ENV env, &span sp, @decl d) -> @stmt {
11581182
ret @respan(sp, ast.stmt_decl(d));
11591183
}
11601184

1161-
fn identity_fold_stmt_ret[ENV](&ENV env, &span sp,
1162-
&option.t[@expr] rv) -> @stmt {
1163-
ret @respan(sp, ast.stmt_ret(rv));
1164-
}
1165-
1166-
fn identity_fold_stmt_be[ENV](&ENV env, &span sp, @expr x) -> @stmt {
1167-
ret @respan(sp, ast.stmt_be(x));
1168-
}
1169-
1170-
fn identity_fold_stmt_log[ENV](&ENV e, &span sp, @expr x) -> @stmt {
1171-
ret @respan(sp, ast.stmt_log(x));
1172-
}
1173-
1174-
fn identity_fold_stmt_check_expr[ENV](&ENV e, &span sp, @expr x) -> @stmt {
1175-
ret @respan(sp, ast.stmt_check_expr(x));
1176-
}
1177-
11781185
fn identity_fold_stmt_expr[ENV](&ENV e, &span sp, @expr x) -> @stmt {
11791186
ret @respan(sp, ast.stmt_expr(x));
11801187
}
@@ -1387,6 +1394,12 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
13871394
fold_expr_field = bind identity_fold_expr_field[ENV](_,_,_,_,_),
13881395
fold_expr_index = bind identity_fold_expr_index[ENV](_,_,_,_,_),
13891396
fold_expr_path = bind identity_fold_expr_path[ENV](_,_,_,_,_),
1397+
fold_expr_fail = bind identity_fold_expr_fail[ENV](_,_),
1398+
fold_expr_ret = bind identity_fold_expr_ret[ENV](_,_,_),
1399+
fold_expr_be = bind identity_fold_expr_be[ENV](_,_,_),
1400+
fold_expr_log = bind identity_fold_expr_log[ENV](_,_,_),
1401+
fold_expr_check_expr
1402+
= bind identity_fold_expr_check_expr[ENV](_,_,_),
13901403

13911404
fold_decl_local = bind identity_fold_decl_local[ENV](_,_,_),
13921405
fold_decl_item = bind identity_fold_decl_item[ENV](_,_,_),
@@ -1397,11 +1410,6 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
13971410
fold_pat_tag = bind identity_fold_pat_tag[ENV](_,_,_,_,_,_),
13981411

13991412
fold_stmt_decl = bind identity_fold_stmt_decl[ENV](_,_,_),
1400-
fold_stmt_ret = bind identity_fold_stmt_ret[ENV](_,_,_),
1401-
fold_stmt_be = bind identity_fold_stmt_be[ENV](_,_,_),
1402-
fold_stmt_log = bind identity_fold_stmt_log[ENV](_,_,_),
1403-
fold_stmt_check_expr
1404-
= bind identity_fold_stmt_check_expr[ENV](_,_,_),
14051413
fold_stmt_expr = bind identity_fold_stmt_expr[ENV](_,_,_),
14061414

14071415
fold_item_const= bind identity_fold_item_const[ENV](_,_,_,_,_,_,_),

0 commit comments

Comments
 (0)