diff options
| author | Patrick Walton <[email protected]> | 2010-11-05 15:23:03 -0700 |
|---|---|---|
| committer | Patrick Walton <[email protected]> | 2010-11-05 15:23:03 -0700 |
| commit | 35eb088ae3a5a530880a77d32798b22639ec6cdd (patch) | |
| tree | 1dc4f4fdf7f07c203ceed3c581cb6805a49b1361 /src/comp/front | |
| parent | rustboot: Report mismatched effect qualifiers (diff) | |
| download | rust-35eb088ae3a5a530880a77d32798b22639ec6cdd.tar.xz rust-35eb088ae3a5a530880a77d32798b22639ec6cdd.zip | |
rustc: Implement function types
Diffstat (limited to 'src/comp/front')
| -rw-r--r-- | src/comp/front/ast.rs | 1 | ||||
| -rw-r--r-- | src/comp/front/parser.rs | 43 |
2 files changed, 44 insertions, 0 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs index a6cbf1ce..830856e0 100644 --- a/src/comp/front/ast.rs +++ b/src/comp/front/ast.rs @@ -130,6 +130,7 @@ tag ty_ { ty_box(@ty); ty_vec(@ty); ty_tup(vec[tup(bool /* mutability */, @ty)]); + ty_fn(vec[rec(mode mode, @ty ty)], @ty); // TODO: effect ty_path(path, option.t[def]); } diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index 6eb334ca..7ce5703f 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -108,6 +108,45 @@ impure fn parse_possibly_mutable_ty(parser p) -> tup(bool, @ast.ty) { ret tup(mut, parse_ty(p)); } +impure fn parse_ty_fn(parser p) -> ast.ty_ { + impure fn parse_fn_input_ty(parser p) -> rec(ast.mode mode, @ast.ty ty) { + auto mode; + if (p.peek() == token.BINOP(token.AND)) { + p.bump(); + mode = ast.alias; + } else { + mode = ast.val; + } + + auto t = parse_ty(p); + + alt (p.peek()) { + case (token.IDENT(_)) { p.bump(); /* ignore the param name */ } + case (_) { /* no param name present */ } + } + + ret rec(mode=mode, ty=t); + } + + auto lo = p.get_span(); + + expect(p, token.FN); + + auto f = parse_fn_input_ty; // FIXME: trans_const_lval bug + auto inputs = parse_seq[rec(ast.mode mode, @ast.ty ty)](token.LPAREN, + token.RPAREN, some(token.COMMA), f, p); + + let @ast.ty output; + if (p.peek() == token.RARROW) { + p.bump(); + output = parse_ty(p); + } else { + output = @spanned(lo, inputs.span, ast.ty_nil); + } + + ret ast.ty_fn(inputs.node, output); +} + impure fn parse_ty(parser p) -> @ast.ty { auto lo = p.get_span(); let ast.ty_ t; @@ -135,6 +174,10 @@ impure fn parse_ty(parser p) -> @ast.ty { t = ast.ty_tup(elems.node); } + case (token.FN) { + t = parse_ty_fn(p); + } + case (_) { p.err("expecting type"); t = ast.ty_nil; |