Skip to content

Commit 9c46cc5

Browse files
committed
Add a temporary syntax for bare functions
Bare functions will be represented as 'fn#' until they're implemented. Then we'll switch it over to just 'fn'. Issue #1022
1 parent 2a0644f commit 9c46cc5

File tree

3 files changed

+35
-8
lines changed

3 files changed

+35
-8
lines changed

src/comp/syntax/parse/parser.rs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ fn parse_ty_fn(proto: ast::proto, p: parser) -> ast::ty_ {
293293
ret ast::ty_fn(proto, inputs.node, ret_ty, ret_style, constrs);
294294
}
295295

296-
fn parse_proto(p: parser) -> ast::proto {
296+
fn parse_method_proto(p: parser) -> ast::proto {
297297
if eat_word(p, "iter") {
298298
ret ast::proto_iter;
299299
} else if eat_word(p, "fn") {
@@ -306,7 +306,7 @@ fn parse_proto(p: parser) -> ast::proto {
306306
fn parse_ty_obj(p: parser, &hi: uint) -> ast::ty_ {
307307
fn parse_method_sig(p: parser) -> ast::ty_method {
308308
let flo = p.get_lo_pos();
309-
let proto: ast::proto = parse_proto(p);
309+
let proto: ast::proto = parse_method_proto(p);
310310
let ident = parse_value_ident(p);
311311
let f = parse_ty_fn(proto, p);
312312
expect(p, token::SEMI);
@@ -568,7 +568,8 @@ fn parse_ty(p: parser, colons_before_params: bool) -> @ast::ty {
568568
hi = p.get_hi_pos();
569569
expect(p, token::RBRACKET);
570570
} else if eat_word(p, "fn") {
571-
t = parse_ty_fn(ast::proto_fn, p);
571+
let proto = parse_fn_proto(p);
572+
t = parse_ty_fn(proto, p);
572573
alt t { ast::ty_fn(_, _, out, _, _) { hi = out.span.hi; } }
573574
} else if eat_word(p, "block") {
574575
t = parse_ty_fn(ast::proto_block, p);
@@ -844,7 +845,8 @@ fn parse_bottom_expr(p: parser) -> @ast::expr {
844845
ret parse_spawn_expr(p);
845846
*/
846847
} else if eat_word(p, "fn") {
847-
ret parse_fn_expr(p, ast::proto_fn);
848+
let proto = parse_fn_proto(p);
849+
ret parse_fn_expr(p, proto);
848850
} else if eat_word(p, "block") {
849851
ret parse_fn_expr(p, ast::proto_block);
850852
} else if eat_word(p, "lambda") {
@@ -1851,7 +1853,7 @@ fn parse_anon_obj_field(p: parser) -> ast::anon_obj_field {
18511853

18521854
fn parse_method(p: parser) -> @ast::method {
18531855
let lo = p.get_lo_pos();
1854-
let proto = parse_proto(p);
1856+
let proto = parse_method_proto(p);
18551857
let ident = parse_value_ident(p);
18561858
let f = parse_fn(p, proto, ast::impure_fn, ast::il_normal);
18571859
let meth = {ident: ident, meth: f, id: p.get_id()};
@@ -2124,20 +2126,32 @@ fn parse_auth(p: parser) -> ast::_auth {
21242126
} else { unexpected(p, p.peek()); }
21252127
}
21262128

2129+
fn parse_fn_proto(p: parser) -> ast::proto {
2130+
if p.peek() == token::POUND {
2131+
p.bump();
2132+
ast::proto_fn
2133+
} else {
2134+
ast::proto_fn
2135+
}
2136+
}
2137+
21272138
fn parse_item(p: parser, attrs: [ast::attribute]) -> option::t<@ast::item> {
21282139
if eat_word(p, "const") {
21292140
ret some(parse_item_const(p, attrs));
21302141
} else if eat_word(p, "inline") {
21312142
expect_word(p, "fn");
2132-
ret some(parse_item_fn_or_iter(p, ast::impure_fn, ast::proto_fn,
2143+
let proto = parse_fn_proto(p);
2144+
ret some(parse_item_fn_or_iter(p, ast::impure_fn, proto,
21332145
attrs, ast::il_inline));
21342146
} else if is_word(p, "fn") && p.look_ahead(1u) != token::LPAREN {
21352147
p.bump();
2136-
ret some(parse_item_fn_or_iter(p, ast::impure_fn, ast::proto_fn,
2148+
let proto = parse_fn_proto(p);
2149+
ret some(parse_item_fn_or_iter(p, ast::impure_fn, proto,
21372150
attrs, ast::il_normal));
21382151
} else if eat_word(p, "pure") {
21392152
expect_word(p, "fn");
2140-
ret some(parse_item_fn_or_iter(p, ast::pure_fn, ast::proto_fn, attrs,
2153+
let proto = parse_fn_proto(p);
2154+
ret some(parse_item_fn_or_iter(p, ast::pure_fn, proto, attrs,
21412155
ast::il_normal));
21422156
} else if eat_word(p, "iter") {
21432157
ret some(parse_item_fn_or_iter(p, ast::impure_fn, ast::proto_iter,

src/test/run-pass/fn-bare-anon.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
fn main() {
2+
let f: fn#() = fn# () {
3+
log "This is a bare function"
4+
};
5+
f();
6+
}

src/test/run-pass/fn-bare-item.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
fn# f() {
2+
log "This is a bare function";
3+
}
4+
5+
fn main() {
6+
f();
7+
}

0 commit comments

Comments
 (0)