diff options
| author | Marijn Haverbeke <marijnh@gmail.com> | 2011-09-14 10:46:40 +0200 |
|---|---|---|
| committer | Marijn Haverbeke <marijnh@gmail.com> | 2011-09-14 10:46:40 +0200 |
| commit | c1c083cd66dd2a6dd46dac3e68210227a67331ab (patch) | |
| tree | fe1a51f1a3fa0cd2ce8e696cbdccf6601db85670 /src | |
| parent | 6eb9738a661f577eeb972032b5570013e6bcafdd (diff) | |
| download | rust-c1c083cd66dd2a6dd46dac3e68210227a67331ab.tar.gz rust-c1c083cd66dd2a6dd46dac3e68210227a67331ab.zip | |
Refactor parse_ret_ty, start parsing by-alias return specs
Diffstat (limited to 'src')
| -rw-r--r-- | src/comp/syntax/ast.rs | 2 | ||||
| -rw-r--r-- | src/comp/syntax/parse/parser.rs | 73 |
2 files changed, 24 insertions, 51 deletions
diff --git a/src/comp/syntax/ast.rs b/src/comp/syntax/ast.rs index 0db696654be..15d05cfe243 100644 --- a/src/comp/syntax/ast.rs +++ b/src/comp/syntax/ast.rs @@ -381,7 +381,7 @@ tag ret_style { noreturn; // functions with return type _|_ that always // raise an error or exit (i.e. never return to the caller) return_val; // everything else - return_alias; + return_ref; } type _fn = {decl: fn_decl, proto: proto, body: blk}; diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs index e6679f60b17..8309afb85a2 100644 --- a/src/comp/syntax/parse/parser.rs +++ b/src/comp/syntax/parse/parser.rs @@ -13,8 +13,6 @@ tag restriction { UNRESTRICTED; RESTRICT_NO_CALL_EXPRS; } tag file_type { CRATE_FILE; SOURCE_FILE; } -tag ty_or_bang { a_ty(@ast::ty); a_bang; } - type parse_sess = @{cm: codemap::codemap, mutable next_id: node_id}; fn next_node_id(sess: parse_sess) -> node_id { @@ -281,27 +279,14 @@ fn parse_ty_fn(proto: ast::proto, p: parser) -> ast::ty_ { let t = parse_ty(p, false); ret spanned(lo, t.span.hi, {mode: mode, ty: t}); } - let lo = p.get_lo_pos(); let inputs = parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA), parse_fn_input_ty, p); // FIXME: there's no syntax for this right now anyway // auto constrs = parse_constrs(~[], p); let constrs: [@ast::constr] = []; - let output: @ast::ty; - let cf = ast::return_val; - if p.peek() == token::RARROW { - p.bump(); - let tmp = parse_ret_ty(p); - alt tmp { - a_ty(t) { output = t; } - a_bang. { - output = @spanned(lo, inputs.span.hi, ast::ty_bot); - cf = ast::noreturn; - } - } - } else { output = @spanned(lo, inputs.span.hi, ast::ty_nil); } - ret ast::ty_fn(proto, inputs.node, output, cf, constrs); + let (ret_style, ret_ty) = parse_ret_ty(p); + ret ast::ty_fn(proto, inputs.node, ret_ty, ret_style, constrs); } fn parse_proto(p: parser) -> ast::proto { @@ -452,15 +437,21 @@ fn parse_ty_postfix(orig_t: ast::ty_, p: parser, colons_before_params: bool) } } -fn parse_ret_ty(p: parser) -> ty_or_bang { -/* if eat(p, token::RARROW) { - +fn parse_ret_ty(p: parser) -> (ast::ret_style, @ast::ty) { + ret if eat(p, token::RARROW) { + let lo = p.get_lo_pos(); + if eat(p, token::NOT) { + (ast::noreturn, @spanned(lo, p.get_last_hi_pos(), ast::ty_bot)) + } else { + let style = ast::return_val; + if eat(p, token::BINOP(token::AND)) { + style = ast::return_ref; + }; + (style, parse_ty(p, false)) + } } else { - - }*/ - alt p.peek() { - token::NOT. { p.bump(); ret a_bang; } - _ { ret a_ty(parse_ty(p, false)); } + let pos = p.get_lo_pos(); + (ast::return_val, @spanned(pos, pos, ast::ty_nil)) } } @@ -1760,7 +1751,6 @@ fn parse_fn_decl(p: parser, purity: ast::purity, il: ast::inlineness) -> let inputs: ast::spanned<[ast::arg]> = parse_seq(token::LPAREN, token::RPAREN, some(token::COMMA), parse_arg, p); - let rslt: ty_or_bang; // Use the args list to translate each bound variable // mentioned in a constraint to an arg index. // Seems weird to do this in the parser, but I'm not sure how else to. @@ -1769,30 +1759,13 @@ fn parse_fn_decl(p: parser, purity: ast::purity, il: ast::inlineness) -> p.bump(); constrs = parse_constrs(bind parse_ty_constr(inputs.node, _), p); } - if p.peek() == token::RARROW { - p.bump(); - rslt = parse_ret_ty(p); - } else { - rslt = a_ty(@spanned(inputs.span.lo, inputs.span.hi, ast::ty_nil)); - } - alt rslt { - a_ty(t) { - ret {inputs: inputs.node, - output: t, - purity: purity, - il: il, - cf: ast::return_val, - constraints: constrs}; - } - a_bang. { - ret {inputs: inputs.node, - output: @spanned(p.get_lo_pos(), p.get_hi_pos(), ast::ty_bot), - purity: purity, - il: il, - cf: ast::noreturn, - constraints: constrs}; - } - } + let (ret_style, ret_ty) = parse_ret_ty(p); + ret {inputs: inputs.node, + output: ret_ty, + purity: purity, + il: il, + cf: ret_style, + constraints: constrs}; } fn parse_fn_block_decl(p: parser) -> ast::fn_decl { |
