Skip to content

Commit 7e7420a

Browse files
committed
---
yaml --- r: 48487 b: refs/heads/snap-stage3 c: 4077d7b h: refs/heads/master i: 48485: 8d18e99 48483: def560e 48479: 8839830 v: v3
1 parent 5d59894 commit 7e7420a

File tree

2 files changed

+34
-10
lines changed

2 files changed

+34
-10
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: 3bbcac322669cff3abde5be937cc4ec3860f3985
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
4-
refs/heads/snap-stage3: 3168fe06ff69970be329583f560a3ccd9c00c874
4+
refs/heads/snap-stage3: 4077d7b8b7b2e208b18c9245db0544c8c114dcec
55
refs/heads/try: 2a8fb58d79e685d5ca07b039badcf2ae3ef077ea
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b

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

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,12 @@ pub impl Parser {
599599
}
600600
}
601601

602+
fn region_from_lifetime(&self, l: &ast::Lifetime) -> @region {
603+
// eventually `ast::region` should go away in favor of
604+
// `ast::Lifetime`. For now we convert between them.
605+
self.region_from_name(Some(l.ident))
606+
}
607+
602608
fn parse_ty(&self, colons_before_params: bool) -> @Ty {
603609
maybe_whole!(self, nt_ty);
604610

@@ -944,7 +950,7 @@ pub impl Parser {
944950

945951
// Parse the region parameter, if any, which will
946952
// be written "foo/&x"
947-
let rp = {
953+
let rp_slash = {
948954
// Hack: avoid parsing vstores like /@ and /~. This is painful
949955
// because the notation for region bounds and the notation for
950956
// vstores is... um... the same. I guess that's my fault. This
@@ -961,9 +967,23 @@ pub impl Parser {
961967
};
962968

963969
// Parse any lifetime or type parameters which may appear:
964-
let tps = self.parse_generic_values();
970+
let (lifetimes, tps) = self.parse_generic_values();
965971
let hi = self.span.lo;
966972

973+
let rp = match (&rp_slash, &lifetimes) {
974+
(&Some(_), _) => rp_slash,
975+
(&None, v) => {
976+
if v.len() == 0 {
977+
None
978+
} else if v.len() == 1 {
979+
Some(self.region_from_lifetime(v.get(0)))
980+
} else {
981+
self.fatal(fmt!("Expected at most one \
982+
lifetime name (for now)"));
983+
}
984+
}
985+
};
986+
967987
@ast::path { span: mk_sp(lo, hi),
968988
rp: rp,
969989
types: tps,
@@ -1316,11 +1336,11 @@ pub impl Parser {
13161336
token::IDENT(i, _) => {
13171337
hi = self.span.hi;
13181338
self.bump();
1319-
let tys = if self.eat(&token::MOD_SEP) {
1339+
let (_, tys) = if self.eat(&token::MOD_SEP) {
13201340
self.expect(&token::LT);
13211341
self.parse_generic_values_after_lt()
13221342
} else {
1323-
~[]
1343+
(opt_vec::Empty, ~[])
13241344
};
13251345

13261346
// expr.f() method call
@@ -2776,20 +2796,24 @@ pub impl Parser {
27762796
}
27772797
}
27782798

2779-
fn parse_generic_values(&self) -> ~[@Ty] {
2799+
fn parse_generic_values(
2800+
&self) -> (OptVec<ast::Lifetime>, ~[@Ty])
2801+
{
27802802
if !self.eat(&token::LT) {
2781-
~[]
2803+
(opt_vec::Empty, ~[])
27822804
} else {
27832805
self.parse_generic_values_after_lt()
27842806
}
27852807
}
27862808

2787-
fn parse_generic_values_after_lt(&self) -> ~[@Ty] {
2788-
let _lifetimes = self.parse_lifetimes();
2809+
fn parse_generic_values_after_lt(
2810+
&self) -> (OptVec<ast::Lifetime>, ~[@Ty])
2811+
{
2812+
let lifetimes = self.parse_lifetimes();
27892813
let result = self.parse_seq_to_gt(
27902814
Some(token::COMMA),
27912815
|p| p.parse_ty(false));
2792-
opt_vec::take_vec(result)
2816+
(lifetimes, opt_vec::take_vec(result))
27932817
}
27942818

27952819
fn parse_fn_decl(&self, parse_arg_fn: fn(&Parser) -> arg_or_capture_item)

0 commit comments

Comments
 (0)