@@ -199,6 +199,10 @@ impure fn parse_ty_fn(ast.proto proto, parser p,
199
199
auto inputs = parse_seq[ rec ( ast. mode mode, @ast. ty ty) ] ( token. LPAREN ,
200
200
token. RPAREN , some ( token. COMMA ) , f, p) ;
201
201
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
+
202
206
let @ast. ty output;
203
207
if ( p. peek ( ) == token. RARROW ) {
204
208
p. bump ( ) ;
@@ -254,6 +258,62 @@ impure fn parse_ty_field(parser p) -> ast.ty_field {
254
258
ret rec( ident=id, ty=ty) ;
255
259
}
256
260
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
+
257
317
impure fn parse_ty ( parser p) -> @ast . ty {
258
318
auto lo = p. get_span ( ) ;
259
319
auto hi = lo;
@@ -368,7 +428,8 @@ impure fn parse_ty(parser p) -> @ast.ty {
368
428
fail;
369
429
}
370
430
}
371
- ret @spanned ( lo, hi, t) ;
431
+
432
+ ret parse_ty_constrs ( @spanned ( lo, hi, t) , p) ;
372
433
}
373
434
374
435
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 {
1676
1737
pf, p) ;
1677
1738
1678
1739
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
+
1679
1745
if ( p. peek ( ) == token. RARROW ) {
1680
1746
p. bump ( ) ;
1681
1747
output = parse_ty ( p) ;
0 commit comments