Skip to content

Commit 54340fb

Browse files
committed
---
yaml --- r: 20750 b: refs/heads/snap-stage3 c: 51a06c1 h: refs/heads/master v: v3
1 parent 5d2a485 commit 54340fb

File tree

5 files changed

+175
-18
lines changed

5 files changed

+175
-18
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
refs/heads/master: e430a699f2c60890d9b86069fd0c68a70ece7120
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: 290f079474670a14168104af5e3a32ff49abfae9
4+
refs/heads/snap-stage3: 51a06c15da1511a79cd7260f7d7473ed94292785
55
refs/heads/try: ffbe0e0e00374358b789b0037bcb3a577cd218be
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b

branches/snap-stage3/src/libsyntax/ast.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import std::serialization::{serializer,
1919
deserialize_bool};
2020
import parse::token;
2121

22-
2322
/* Note #1972 -- spans are serialized but not deserialized */
2423
fn serialize_span<S>(_s: S, _v: span) {
2524
}
@@ -589,9 +588,21 @@ enum ret_style {
589588
return_val, // everything else
590589
}
591590

591+
#[auto_serialize]
592+
enum self_ty_ {
593+
sty_by_ref, // old by-reference self: ``
594+
sty_value, // by-value self: `self`
595+
sty_region(@region, mutability), // by-region self: `&self`
596+
sty_box(mutability), // by-managed-pointer self: `@self`
597+
sty_uniq(mutability) // by-unique-pointer self: `~self`
598+
}
599+
600+
#[auto_serialize]
601+
type self_ty = spanned<self_ty_>;
602+
592603
#[auto_serialize]
593604
type method = {ident: ident, attrs: ~[attribute],
594-
tps: ~[ty_param], decl: fn_decl, body: blk,
605+
tps: ~[ty_param], self_ty: self_ty, decl: fn_decl, body: blk,
595606
id: node_id, span: span, self_id: node_id,
596607
vis: visibility}; // always public, unless it's a
597608
// class method

branches/snap-stage3/src/libsyntax/fold.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ fn noop_fold_method(&&m: @method, fld: ast_fold) -> @method {
297297
ret @{ident: fld.fold_ident(m.ident),
298298
attrs: /* FIXME (#2543) */ copy m.attrs,
299299
tps: fold_ty_params(m.tps, fld),
300+
self_ty: m.self_ty,
300301
decl: fold_fn_decl(m.decl, fld),
301302
body: fld.fold_block(m.body),
302303
id: fld.new_id(m.id),

branches/snap-stage3/src/libsyntax/parse/common.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,18 @@ impl parser_common of parser_common for parser {
117117
}
118118
}
119119

120-
fn token_is_keyword(word: ~str, ++tok: token::token) -> bool {
121-
self.require_keyword(word);
120+
fn token_is_word(word: ~str, ++tok: token::token) -> bool {
122121
alt tok {
123-
token::IDENT(sid, false) { str::eq(word, *self.get_str(sid)) }
124-
_ { false }
122+
token::IDENT(sid, false) => { str::eq(word, *self.get_str(sid)) }
123+
_ => { false }
125124
}
126125
}
127126

127+
fn token_is_keyword(word: ~str, ++tok: token::token) -> bool {
128+
self.require_keyword(word);
129+
self.token_is_word(word, tok)
130+
}
131+
128132
fn is_keyword(word: ~str) -> bool {
129133
self.token_is_keyword(word, self.token)
130134
}

branches/snap-stage3/src/libsyntax/parse/parser.rs

Lines changed: 152 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,14 @@ import ast::{_mod, add, alt_check, alt_exhaustive, arg, arm, attribute,
4545
pat_range, pat_rec, pat_tup, pat_uniq, pat_wild, path, private,
4646
proto, proto_any, proto_bare, proto_block, proto_box, proto_uniq,
4747
provided, public, pure_fn, purity, re_anon, re_named, region,
48-
rem, required, ret_style, return_val, shl, shr, stmt, stmt_decl,
49-
stmt_expr, stmt_semi, subtract, token_tree, trait_method,
50-
trait_ref, tt_delim, tt_seq, tt_tok, tt_nonterminal, ty,
51-
ty_, ty_bot, ty_box, ty_field, ty_fn, ty_infer, ty_mac,
52-
ty_method, ty_nil, ty_param, ty_path, ty_ptr, ty_rec, ty_rptr,
53-
ty_tup, ty_u32, ty_uniq, ty_vec, ty_fixed_length, unchecked_blk,
54-
uniq, unsafe_blk, unsafe_fn, variant, view_item, view_item_,
48+
rem, required, ret_style, return_val, self_ty, shl, shr, stmt,
49+
stmt_decl, stmt_expr, stmt_semi, subtract, sty_box, sty_by_ref,
50+
sty_region, sty_uniq, sty_value, token_tree, trait_method,
51+
trait_ref, tt_delim, tt_seq, tt_tok, tt_nonterminal, ty, ty_,
52+
ty_bot, ty_box, ty_field, ty_fn, ty_infer, ty_mac, ty_method,
53+
ty_nil, ty_param, ty_path, ty_ptr, ty_rec, ty_rptr, ty_tup,
54+
ty_u32, ty_uniq, ty_vec, ty_fixed_length, unchecked_blk, uniq,
55+
unsafe_blk, unsafe_fn, variant, view_item, view_item_,
5556
view_item_export, view_item_import, view_item_use, view_path,
5657
view_path_glob, view_path_list, view_path_simple, visibility,
5758
vstore, vstore_box, vstore_fixed, vstore_slice, vstore_uniq};
@@ -273,7 +274,8 @@ class parser {
273274
let tps = p.parse_ty_params();
274275
let d = p.parse_ty_fn_decl(pur);
275276
let hi = p.last_span.hi;
276-
debug!{"parse_trait_methods(): trait method signature ends in \
277+
let self_ty = spanned(lo, hi, sty_by_ref); // XXX: Wrong.
278+
debug!["parse_trait_methods(): trait method signature ends in \
277279
`%s`",
278280
token_to_str(p.reader, p.token)};
279281
alt p.token {
@@ -294,6 +296,7 @@ class parser {
294296
provided(@{ident: ident,
295297
attrs: attrs,
296298
tps: tps,
299+
self_ty: self_ty,
297300
decl: d,
298301
body: body,
299302
id: p.get_id(),
@@ -1978,6 +1981,142 @@ class parser {
19781981
cf: ret_style}, capture_clause);
19791982
}
19801983

1984+
fn is_self_ident() -> bool {
1985+
alt self.token {
1986+
token::IDENT(sid, false) if str::eq(~"self", *self.get_str(sid)) {
1987+
true
1988+
}
1989+
_ => {
1990+
false
1991+
}
1992+
}
1993+
}
1994+
1995+
fn expect_self_ident() {
1996+
if !self.is_self_ident() {
1997+
self.fatal(#fmt("expected `self` but found `%s`",
1998+
token_to_str(self.reader, self.token)));
1999+
}
2000+
self.bump();
2001+
}
2002+
2003+
fn parse_fn_decl_with_self(purity: purity,
2004+
parse_arg_fn:
2005+
fn(parser) -> arg_or_capture_item)
2006+
-> (self_ty, fn_decl, capture_clause) {
2007+
2008+
self.expect(token::LPAREN);
2009+
2010+
// A bit of complexity and lookahead is needed here in order to to be
2011+
// backwards compatible.
2012+
let lo = self.span.lo;
2013+
let self_ty;
2014+
alt copy self.token {
2015+
token::BINOP(token::AND) => {
2016+
// We need to make sure it isn't a mode.
2017+
self.bump();
2018+
if self.token_is_keyword(~"self", self.look_ahead(1)) ||
2019+
((self.token_is_keyword(~"const", self.look_ahead(1)) ||
2020+
self.token_is_keyword(~"mut", self.look_ahead(1))) &&
2021+
self.token_is_keyword(~"self", self.look_ahead(2))) {
2022+
2023+
self.bump();
2024+
let mutability = self.parse_mutability();
2025+
self.expect_self_ident();
2026+
2027+
// Parse an explicit region, if possible.
2028+
let region_name;
2029+
alt copy self.token {
2030+
token::BINOP(token::SLASH) => {
2031+
self.bump();
2032+
alt copy self.token {
2033+
token::IDENT(sid, false) => {
2034+
self.bump();
2035+
region_name = some(self.get_str(sid));
2036+
}
2037+
_ => {
2038+
region_name = none;
2039+
}
2040+
}
2041+
}
2042+
_ => {
2043+
region_name = none;
2044+
}
2045+
}
2046+
2047+
let region = self.region_from_name(region_name);
2048+
self_ty = sty_region(region, mutability);
2049+
} else {
2050+
self_ty = sty_by_ref;
2051+
}
2052+
}
2053+
token::AT => {
2054+
self.bump();
2055+
let mutability = self.parse_mutability();
2056+
self.expect_self_ident();
2057+
self_ty = sty_box(mutability);
2058+
}
2059+
token::TILDE => {
2060+
self.bump();
2061+
let mutability = self.parse_mutability();
2062+
self.expect_self_ident();
2063+
self_ty = sty_uniq(mutability);
2064+
}
2065+
token::IDENT(*) if self.is_self_ident() => {
2066+
self.bump();
2067+
self_ty = sty_value;
2068+
}
2069+
_ => {
2070+
self_ty = sty_by_ref;
2071+
}
2072+
}
2073+
2074+
// If we parsed a self type, expect a comma before the argument list.
2075+
let args_or_capture_items;
2076+
if self_ty != sty_by_ref {
2077+
alt copy self.token {
2078+
token::COMMA => {
2079+
self.bump();
2080+
let sep = seq_sep_trailing_disallowed(token::COMMA);
2081+
args_or_capture_items =
2082+
self.parse_seq_to_before_end(token::RPAREN,
2083+
sep,
2084+
parse_arg_fn);
2085+
}
2086+
token::RPAREN => {
2087+
args_or_capture_items = ~[];
2088+
}
2089+
_ => {
2090+
self.fatal(~"expected `,` or `)`, found `" +
2091+
token_to_str(self.reader, self.token) + "`");
2092+
}
2093+
}
2094+
} else {
2095+
let sep = seq_sep_trailing_disallowed(token::COMMA);
2096+
args_or_capture_items =
2097+
self.parse_seq_to_before_end(token::RPAREN,
2098+
sep,
2099+
parse_arg_fn);
2100+
}
2101+
2102+
self.expect(token::RPAREN);
2103+
2104+
let hi = self.span.hi;
2105+
2106+
let inputs = either::lefts(args_or_capture_items);
2107+
let capture_clause = @either::rights(args_or_capture_items);
2108+
let (ret_style, ret_ty) = self.parse_ret_ty();
2109+
2110+
let fn_decl = {
2111+
inputs: inputs,
2112+
output: ret_ty,
2113+
purity: purity,
2114+
cf: ret_style
2115+
};
2116+
2117+
(spanned(lo, hi, self_ty), fn_decl, capture_clause)
2118+
}
2119+
19812120
fn parse_fn_block_decl() -> (fn_decl, capture_clause) {
19822121
let inputs_captures = {
19832122
if self.eat(token::OROR) {
@@ -2049,11 +2188,13 @@ class parser {
20492188
let lo = self.span.lo, pur = self.parse_fn_purity();
20502189
let ident = self.parse_method_name();
20512190
let tps = self.parse_ty_params();
2052-
let (decl, _) = self.parse_fn_decl(pur, |p| p.parse_arg());
2191+
let (self_ty, decl, _) = do self.parse_fn_decl_with_self(pur) |p| {
2192+
p.parse_arg()
2193+
};
20532194
let (inner_attrs, body) = self.parse_inner_attrs_and_block(true);
20542195
let attrs = vec::append(attrs, inner_attrs);
2055-
@{ident: ident, attrs: attrs, tps: tps, decl: decl, body: body,
2056-
id: self.get_id(), span: mk_sp(lo, body.span.hi),
2196+
@{ident: ident, attrs: attrs, tps: tps, self_ty: self_ty, decl: decl,
2197+
body: body, id: self.get_id(), span: mk_sp(lo, body.span.hi),
20572198
self_id: self.get_id(), vis: pr}
20582199
}
20592200

0 commit comments

Comments
 (0)