infer when types are region parameterized rather than requiring /&

- removes various fields from various variants in the AST
- also update tests not to use this notation
This commit is contained in:
Niko Matsakis 2012-07-11 10:28:30 -07:00
parent 9b094c0baf
commit b9aa9def85
59 changed files with 602 additions and 387 deletions

View file

@ -41,8 +41,8 @@ import ast::{_mod, add, alt_check, alt_exhaustive, arg, arm, attribute,
pat_box, pat_enum, pat_ident, pat_lit, pat_range, pat_rec,
pat_tup, pat_uniq, pat_wild, path, private, proto, proto_any,
proto_bare, proto_block, proto_box, proto_uniq, public, pure_fn,
purity, re_anon, re_named, region, region_param, rem, ret_style,
return_val, rp_none, rp_self, shl, shr, stmt, stmt_decl,
purity, re_anon, re_named, region, rem, ret_style,
return_val, shl, shr, stmt, stmt_decl,
stmt_expr, stmt_semi, subtract, token_tree, trait_ref, tt_delim,
tt_dotdotdot, tt_flat, tt_interpolate, ty, ty_, ty_bot, ty_box,
ty_constr, ty_constr_, ty_constr_arg, ty_field, ty_fn, ty_infer,
@ -2133,10 +2133,10 @@ class parser {
fn parse_item_trait() -> item_info {
let ident = self.parse_ident();
let rp = self.parse_region_param();
self.parse_region_param();
let tps = self.parse_ty_params();
let meths = self.parse_ty_methods();
(ident, item_trait(tps, rp, meths), none)
(ident, item_trait(tps, meths), none)
}
// Parses three variants (with the region/type params always optional):
@ -2147,18 +2147,19 @@ class parser {
fn wrap_path(p: parser, pt: @path) -> @ty {
@{id: p.get_id(), node: ty_path(pt, p.get_id()), span: pt.span}
}
let mut (ident, rp, tps) = {
let mut (ident, tps) = {
if self.token == token::LT {
(none, rp_none, self.parse_ty_params())
(none, self.parse_ty_params())
} else if self.token == token::BINOP(token::SLASH) {
(none, self.parse_region_param(), self.parse_ty_params())
self.parse_region_param();
(none, self.parse_ty_params())
}
else if self.is_keyword("of") {
(none, rp_none, ~[])
(none, ~[])
} else {
let id = self.parse_ident();
let rp = self.parse_region_param();
(some(id), rp, self.parse_ty_params())
self.parse_region_param();
(some(id), self.parse_ty_params())
}
};
let ifce = if self.eat_keyword("of") {
@ -2179,25 +2180,18 @@ class parser {
while !self.eat(token::RBRACE) {
vec::push(meths, self.parse_method(public));
}
(ident, item_impl(tps, rp, ifce, ty, meths), none)
(ident, item_impl(tps, ifce, ty, meths), none)
}
// Instantiates ident <i> with references to <typarams> as arguments.
// Used to create a path that refers to a class which will be defined as
// the return type of the ctor function.
fn ident_to_path_tys(i: ident,
rp: region_param,
typarams: ~[ty_param]) -> @path {
let s = self.last_span;
// Hack. But then, this whole function is in service of a hack.
let a_r = alt rp {
rp_none { none }
rp_self { some(self.region_from_name(some(@"self"))) }
};
@{span: s, global: false, idents: ~[i],
rp: a_r,
rp: none,
types: vec::map(typarams, |tp| {
@{id: self.get_id(),
node: ty_path(ident_to_path(s, tp.ident), self.get_id()),
@ -2218,9 +2212,9 @@ class parser {
fn parse_item_class() -> item_info {
let class_name = self.parse_value_ident();
let rp = self.parse_region_param();
self.parse_region_param();
let ty_params = self.parse_ty_params();
let class_path = self.ident_to_path_tys(class_name, rp, ty_params);
let class_path = self.ident_to_path_tys(class_name, ty_params);
let traits : ~[@trait_ref] = if self.eat(token::COLON)
{ self.parse_trait_ref_list() }
else { ~[] };
@ -2255,7 +2249,7 @@ class parser {
self_id: self.get_id(),
dec: ct_d,
body: ct_b},
span: ct_s}, actual_dtor, rp),
span: ct_s}, actual_dtor),
none)
}
/*
@ -2447,26 +2441,23 @@ class parser {
fn parse_item_type() -> item_info {
let t = self.parse_type_decl();
let rp = self.parse_region_param();
self.parse_region_param();
let tps = self.parse_ty_params();
self.expect(token::EQ);
let ty = self.parse_ty(false);
self.expect(token::SEMI);
(t.ident, item_ty(ty, tps, rp), none)
(t.ident, item_ty(ty, tps), none)
}
fn parse_region_param() -> region_param {
fn parse_region_param() {
if self.eat(token::BINOP(token::SLASH)) {
self.expect(token::BINOP(token::AND));
rp_self
} else {
rp_none
}
}
fn parse_item_enum(default_vis: visibility) -> item_info {
let id = self.parse_ident();
let rp = self.parse_region_param();
self.parse_region_param();
let ty_params = self.parse_ty_params();
let mut variants: ~[variant] = ~[];
// Newtype syntax
@ -2483,7 +2474,7 @@ class parser {
id: self.get_id(),
disr_expr: none,
vis: public});
ret (id, item_enum(~[variant], ty_params, rp), none);
ret (id, item_enum(~[variant], ty_params), none);
}
self.expect(token::LBRACE);
@ -2521,7 +2512,7 @@ class parser {
self.fatal("discriminator values can only be used with a c-like \
enum");
}
(id, item_enum(variants, ty_params, rp), none)
(id, item_enum(variants, ty_params), none)
}
fn parse_fn_ty_proto() -> proto {