Skip to content

Commit d9d7d93

Browse files
committed
---
yaml --- r: 1512 b: refs/heads/master c: 596face h: refs/heads/master v: v3
1 parent 50caee7 commit d9d7d93

File tree

3 files changed

+77
-2
lines changed

3 files changed

+77
-2
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: 95c0cefd32bc1af5e91857511187760010aaffc7
2+
refs/heads/master: 596face2745ccc11a959a530807ea3e36e9d1354

trunk/src/comp/front/ast.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,17 @@ tag ty_ {
231231
ty_path(path, option.t[def]);
232232
ty_mutable(@ty);
233233
ty_type;
234+
ty_constr(@ty, vec[@constr]);
234235
}
235236

237+
tag constr_arg_ {
238+
carg_base;
239+
carg_ident(ident);
240+
}
241+
type constr_arg = spanned[constr_arg_];
242+
type constr_ = rec(path path, vec[@constr_arg] args);
243+
type constr = spanned[constr_];
244+
236245
type arg = rec(mode mode, @ty ty, ident ident, def_id id);
237246
type fn_decl = rec(effect effect,
238247
vec[arg] inputs,

trunk/src/comp/front/parser.rs

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,10 @@ impure fn parse_ty_fn(ast.proto proto, parser p,
199199
auto inputs = parse_seq[rec(ast.mode mode, @ast.ty ty)](token.LPAREN,
200200
token.RPAREN, some(token.COMMA), f, p);
201201

202+
// FIXME: dropping constrs on the floor at the moment.
203+
// pick them up when they're used by typestate pass.
204+
parse_constrs(p);
205+
202206
let @ast.ty output;
203207
if (p.peek() == token.RARROW) {
204208
p.bump();
@@ -254,6 +258,62 @@ impure fn parse_ty_field(parser p) -> ast.ty_field {
254258
ret rec(ident=id, ty=ty);
255259
}
256260

261+
impure fn parse_constr_arg(parser p) -> @ast.constr_arg {
262+
auto lo = p.get_span();
263+
auto carg = ast.carg_base;
264+
if (p.peek() == token.BINOP(token.STAR)) {
265+
p.bump();
266+
} else {
267+
carg = ast.carg_ident(parse_ident(p));
268+
}
269+
ret @spanned(lo, lo, carg);
270+
}
271+
272+
impure fn parse_ty_constr(parser p) -> @ast.constr {
273+
auto lo = p.get_span();
274+
auto path = parse_path(p, GREEDY);
275+
auto pf = parse_constr_arg;
276+
auto args = parse_seq[@ast.constr_arg](token.LPAREN,
277+
token.RPAREN,
278+
some(token.COMMA), pf, p);
279+
auto hi = args.span;
280+
ret @spanned(lo, hi, rec(path=path, args=args.node));
281+
}
282+
283+
impure fn parse_constrs(parser p) -> common.spanned[vec[@ast.constr]] {
284+
auto lo = p.get_span();
285+
auto hi = lo;
286+
let vec[@ast.constr] constrs = vec();
287+
if (p.peek() == token.COLON) {
288+
p.bump();
289+
let bool more = true;
290+
while (more) {
291+
alt (p.peek()) {
292+
case (token.IDENT(_)) {
293+
auto constr = parse_ty_constr(p);
294+
hi = constr.span;
295+
append[@ast.constr](constrs, constr);
296+
if (p.peek() == token.COMMA) {
297+
p.bump();
298+
more = false;
299+
}
300+
}
301+
case (_) { more = false; }
302+
}
303+
}
304+
}
305+
ret spanned(lo, hi, constrs);
306+
}
307+
308+
impure fn parse_ty_constrs(@ast.ty t, parser p) -> @ast.ty {
309+
if (p.peek() == token.COLON) {
310+
auto constrs = parse_constrs(p);
311+
ret @spanned(t.span, constrs.span,
312+
ast.ty_constr(t, constrs.node));
313+
}
314+
ret t;
315+
}
316+
257317
impure fn parse_ty(parser p) -> @ast.ty {
258318
auto lo = p.get_span();
259319
auto hi = lo;
@@ -368,7 +428,8 @@ impure fn parse_ty(parser p) -> @ast.ty {
368428
fail;
369429
}
370430
}
371-
ret @spanned(lo, hi, t);
431+
432+
ret parse_ty_constrs(@spanned(lo, hi, t), p);
372433
}
373434

374435
impure fn parse_arg(parser p) -> ast.arg {
@@ -1676,6 +1737,11 @@ impure fn parse_fn_decl(parser p, ast.effect eff) -> ast.fn_decl {
16761737
pf, p);
16771738

16781739
let @ast.ty output;
1740+
1741+
// FIXME: dropping constrs on the floor at the moment.
1742+
// pick them up when they're used by typestate pass.
1743+
parse_constrs(p);
1744+
16791745
if (p.peek() == token.RARROW) {
16801746
p.bump();
16811747
output = parse_ty(p);

0 commit comments

Comments
 (0)