Skip to content

Commit bc7aa64

Browse files
committed
Simplify parse_self_param
1 parent 23a7052 commit bc7aa64

File tree

1 file changed

+20
-43
lines changed
  • compiler/rustc_parse/src/parser

1 file changed

+20
-43
lines changed

compiler/rustc_parse/src/parser/item.rs

+20-43
Original file line numberDiff line numberDiff line change
@@ -2954,6 +2954,8 @@ impl<'a> Parser<'a> {
29542954
}
29552955
_ => unreachable!(),
29562956
};
2957+
// is lifetime `n` tokens ahead?
2958+
let is_lifetime = |this: &Self, n| this.look_ahead(n, |t| t.is_lifetime());
29572959
// Is `self` `n` tokens ahead?
29582960
let is_isolated_self = |this: &Self, n| {
29592961
this.is_keyword_ahead(n, &[kw::SelfLower])
@@ -3023,60 +3025,35 @@ impl<'a> Parser<'a> {
30233025
let eself_lo = self.token.span;
30243026
let (eself, eself_ident, eself_hi) = match self.token.uninterpolate().kind {
30253027
token::BinOp(token::And) => {
3026-
let eself = if is_isolated_self(self, 1) {
3027-
// `&self`
3028-
self.bump();
3029-
SelfKind::Region(None, Mutability::Not)
3030-
} else if is_isolated_mut_self(self, 1) {
3031-
// `&mut self`
3032-
self.bump();
3033-
self.bump();
3034-
SelfKind::Region(None, Mutability::Mut)
3035-
} else if is_isolated_pin_const_self(self, 1) {
3036-
// `&pin const self`
3028+
let has_lifetime = is_lifetime(self, 1);
3029+
let skip_lifetime_count = has_lifetime as usize;
3030+
let eself = if is_isolated_self(self, skip_lifetime_count + 1) {
3031+
// `&{'lt} self`
30373032
self.bump(); // &
3038-
self.psess.gated_spans.gate(sym::pin_ergonomics, self.token.span);
3039-
self.bump(); // pin
3040-
self.bump(); // const
3041-
SelfKind::Pinned(None, Mutability::Not)
3042-
} else if is_isolated_pin_mut_self(self, 1) {
3043-
// `&pin mut self`
3033+
let lifetime = has_lifetime.then(|| self.expect_lifetime());
3034+
SelfKind::Region(lifetime, Mutability::Not)
3035+
} else if is_isolated_mut_self(self, skip_lifetime_count + 1) {
3036+
// `&{'lt} mut self`
30443037
self.bump(); // &
3045-
self.psess.gated_spans.gate(sym::pin_ergonomics, self.token.span);
3046-
self.bump(); // pin
3038+
let lifetime = has_lifetime.then(|| self.expect_lifetime());
30473039
self.bump(); // mut
3048-
SelfKind::Pinned(None, Mutability::Mut)
3049-
} else if self.look_ahead(1, |t| t.is_lifetime()) && is_isolated_self(self, 2) {
3050-
// `&'lt self`
3051-
self.bump();
3052-
let lt = self.expect_lifetime();
3053-
SelfKind::Region(Some(lt), Mutability::Not)
3054-
} else if self.look_ahead(1, |t| t.is_lifetime()) && is_isolated_mut_self(self, 2) {
3055-
// `&'lt mut self`
3056-
self.bump();
3057-
let lt = self.expect_lifetime();
3058-
self.bump();
3059-
SelfKind::Region(Some(lt), Mutability::Mut)
3060-
} else if self.look_ahead(1, |t| t.is_lifetime())
3061-
&& is_isolated_pin_const_self(self, 2)
3062-
{
3063-
// `&'lt pin const self`
3040+
SelfKind::Region(lifetime, Mutability::Mut)
3041+
} else if is_isolated_pin_const_self(self, skip_lifetime_count + 1) {
3042+
// `&{'lt} pin const self`
30643043
self.bump(); // &
3065-
let lt = self.expect_lifetime();
3044+
let lifetime = has_lifetime.then(|| self.expect_lifetime());
30663045
self.psess.gated_spans.gate(sym::pin_ergonomics, self.token.span);
30673046
self.bump(); // pin
30683047
self.bump(); // const
3069-
SelfKind::Pinned(Some(lt), Mutability::Not)
3070-
} else if self.look_ahead(1, |t| t.is_lifetime())
3071-
&& is_isolated_pin_mut_self(self, 2)
3072-
{
3073-
// `&'lt pin mut self`
3048+
SelfKind::Pinned(lifetime, Mutability::Not)
3049+
} else if is_isolated_pin_mut_self(self, skip_lifetime_count + 1) {
3050+
// `&{'lt} pin mut self`
30743051
self.bump(); // &
3075-
let lt = self.expect_lifetime();
3052+
let lifetime = has_lifetime.then(|| self.expect_lifetime());
30763053
self.psess.gated_spans.gate(sym::pin_ergonomics, self.token.span);
30773054
self.bump(); // pin
30783055
self.bump(); // mut
3079-
SelfKind::Pinned(Some(lt), Mutability::Mut)
3056+
SelfKind::Pinned(lifetime, Mutability::Mut)
30803057
} else {
30813058
// `&not_self`
30823059
return Ok(None);

0 commit comments

Comments
 (0)