Skip to content

Commit 55fbed3

Browse files
committed
Beginnings of support for magical self prefix; nothing profound happening yet.
1 parent f6490a6 commit 55fbed3

File tree

8 files changed

+56
-1
lines changed

8 files changed

+56
-1
lines changed

src/comp/front/ast.rs

+1
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ tag expr_ {
252252
expr_tup(vec[elt], ann);
253253
expr_rec(vec[field], option.t[@expr], ann);
254254
expr_call(@expr, vec[@expr], ann);
255+
expr_call_self(@expr, vec[@expr], ann);
255256
expr_bind(@expr, vec[option.t[@expr]], ann);
256257
expr_spawn(spawn_dom, option.t[str], @expr, vec[@expr], ann);
257258
expr_binary(binop, @expr, @expr, ann);

src/comp/front/lexer.rs

+1
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ impure fn new_reader(io.reader rdr, str filename) -> reader
169169
keywords.insert("any", token.ANY);
170170

171171
keywords.insert("obj", token.OBJ);
172+
keywords.insert("self", token.SELF);
172173

173174
keywords.insert("port", token.PORT);
174175
keywords.insert("chan", token.CHAN);

src/comp/front/parser.rs

+15
Original file line numberDiff line numberDiff line change
@@ -883,6 +883,20 @@ impure fn parse_bottom_expr(parser p) -> @ast.expr {
883883
ex = ast.expr_chan(e, ast.ann_none);
884884
}
885885

886+
case (token.SELF) {
887+
p.bump();
888+
expect(p, token.DOT);
889+
// The rest is a call expression.
890+
auto e = parse_bottom_expr(p);
891+
auto pf = parse_expr;
892+
auto es = parse_seq[@ast.expr](token.LPAREN,
893+
token.RPAREN,
894+
some(token.COMMA),
895+
pf, p);
896+
hi = es.span;
897+
auto ex = ast.expr_call_self(e, es.node, ast.ann_none);
898+
}
899+
886900
case (_) {
887901
auto lit = parse_lit(p);
888902
hi = lit.span;
@@ -1646,6 +1660,7 @@ fn stmt_ends_with_semi(@ast.stmt stmt) -> bool {
16461660
case (ast.expr_tup(_,_)) { ret true; }
16471661
case (ast.expr_rec(_,_,_)) { ret true; }
16481662
case (ast.expr_call(_,_,_)) { ret true; }
1663+
case (ast.expr_call_self(_,_,_)){ ret true; }
16491664
case (ast.expr_binary(_,_,_,_)) { ret true; }
16501665
case (ast.expr_unary(_,_,_)) { ret true; }
16511666
case (ast.expr_lit(_,_)) { ret true; }

src/comp/front/token.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,9 @@ tag token {
160160
FN;
161161
ITER;
162162

163-
/* Object type */
163+
/* Object type and related keywords */
164164
OBJ;
165+
SELF;
165166

166167
/* Comm and task types */
167168
CHAN;

src/comp/middle/ty.rs

+1
Original file line numberDiff line numberDiff line change
@@ -757,6 +757,7 @@ fn expr_ty(@ast.expr expr) -> @t {
757757
case (ast.expr_rec(_, _, ?ann)) { ret ann_to_type(ann); }
758758
case (ast.expr_bind(_, _, ?ann)) { ret ann_to_type(ann); }
759759
case (ast.expr_call(_, _, ?ann)) { ret ann_to_type(ann); }
760+
case (ast.expr_call_self(_, _, ?ann)) { ret ann_to_type(ann); }
760761
case (ast.expr_spawn(_, _, _, _, ?ann))
761762
{ ret ann_to_type(ann); }
762763
case (ast.expr_binary(_, _, _, ?ann)) { ret ann_to_type(ann); }

src/comp/middle/typeck.rs

+7
Original file line numberDiff line numberDiff line change
@@ -1312,6 +1312,13 @@ fn demand_expr_full(&@fn_ctxt fcx, @ty.t expected, @ast.expr e,
13121312
ann_to_type(ann), adk);
13131313
e_1 = ast.expr_call(sube, es, ast.ann_type(t, none[vec[@ty.t]]));
13141314
}
1315+
case (ast.expr_call_self(?sube, ?es, ?ann)) {
1316+
auto t = demand_full(fcx, e.span, expected,
1317+
ann_to_type(ann), adk);
1318+
e_1 = ast.expr_call_self(sube,
1319+
es,
1320+
ast.ann_type(t, none[vec[@ty.t]]));
1321+
}
13151322
case (ast.expr_binary(?bop, ?lhs, ?rhs, ?ann)) {
13161323
auto t = demand(fcx, e.span, expected, ann_to_type(ann));
13171324
e_1 = ast.expr_binary(bop, lhs, rhs,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// xfail-boot
2+
// error-pattern:expecting ., found (
3+
fn main() {
4+
5+
obj foo() {
6+
fn m() {
7+
self();
8+
}
9+
}
10+
11+
auto a = foo;
12+
a.m();
13+
}

src/test/run-pass/obj-self.rs

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// xfail-boot
2+
fn main() {
3+
4+
obj foo() {
5+
fn m1() {
6+
log "hi!";
7+
}
8+
fn m2() {
9+
self.m1();
10+
}
11+
}
12+
13+
auto a = foo();
14+
a.m1();
15+
a.m2();
16+
}

0 commit comments

Comments
 (0)