syntax refactor parse_self_param
(5)
This commit is contained in:
parent
4306d0037e
commit
0492302dbd
1 changed files with 21 additions and 22 deletions
|
@ -1197,15 +1197,12 @@ impl<'a> Parser<'a> {
|
||||||
/// Evaluates the closure with restrictions in place.
|
/// Evaluates the closure with restrictions in place.
|
||||||
///
|
///
|
||||||
/// Afters the closure is evaluated, restrictions are reset.
|
/// Afters the closure is evaluated, restrictions are reset.
|
||||||
fn with_res<F, T>(&mut self, r: Restrictions, f: F) -> T
|
fn with_res<T>(&mut self, res: Restrictions, f: impl FnOnce(&mut Self) -> T) -> T {
|
||||||
where F: FnOnce(&mut Self) -> T
|
|
||||||
{
|
|
||||||
let old = self.restrictions;
|
let old = self.restrictions;
|
||||||
self.restrictions = r;
|
self.restrictions = res;
|
||||||
let r = f(self);
|
let res = f(self);
|
||||||
self.restrictions = old;
|
self.restrictions = old;
|
||||||
return r;
|
res
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_fn_params(
|
fn parse_fn_params(
|
||||||
|
@ -1275,6 +1272,11 @@ impl<'a> Parser<'a> {
|
||||||
&& self.look_ahead(n + 1, |t| t != &token::ModSep)
|
&& self.look_ahead(n + 1, |t| t != &token::ModSep)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_isolated_mut_self(&self, n: usize) -> bool {
|
||||||
|
self.is_keyword_ahead(n, &[kw::Mut])
|
||||||
|
&& self.is_isolated_self(n + 1)
|
||||||
|
}
|
||||||
|
|
||||||
fn expect_self_ident(&mut self) -> Ident {
|
fn expect_self_ident(&mut self) -> Ident {
|
||||||
match self.token.kind {
|
match self.token.kind {
|
||||||
// Preserve hygienic context.
|
// Preserve hygienic context.
|
||||||
|
@ -1320,34 +1322,31 @@ impl<'a> Parser<'a> {
|
||||||
let eself_lo = self.token.span;
|
let eself_lo = self.token.span;
|
||||||
let (eself, eself_ident, eself_hi) = match self.token.kind {
|
let (eself, eself_ident, eself_hi) = match self.token.kind {
|
||||||
token::BinOp(token::And) => {
|
token::BinOp(token::And) => {
|
||||||
// `&self`
|
let eself = if self.is_isolated_self(1) {
|
||||||
// `&mut self`
|
// `&self`
|
||||||
// `&'lt self`
|
|
||||||
// `&'lt mut self`
|
|
||||||
// `¬_self`
|
|
||||||
(if self.is_isolated_self(1) {
|
|
||||||
self.bump();
|
self.bump();
|
||||||
SelfKind::Region(None, Mutability::Immutable)
|
SelfKind::Region(None, Mutability::Immutable)
|
||||||
} else if self.is_keyword_ahead(1, &[kw::Mut]) &&
|
} else if self.is_isolated_mut_self(1) {
|
||||||
self.is_isolated_self(2) {
|
// `&mut self`
|
||||||
self.bump();
|
self.bump();
|
||||||
self.bump();
|
self.bump();
|
||||||
SelfKind::Region(None, Mutability::Mutable)
|
SelfKind::Region(None, Mutability::Mutable)
|
||||||
} else if self.look_ahead(1, |t| t.is_lifetime()) &&
|
} else if self.look_ahead(1, |t| t.is_lifetime()) && self.is_isolated_self(2) {
|
||||||
self.is_isolated_self(2) {
|
// `&'lt self`
|
||||||
self.bump();
|
self.bump();
|
||||||
let lt = self.expect_lifetime();
|
let lt = self.expect_lifetime();
|
||||||
SelfKind::Region(Some(lt), Mutability::Immutable)
|
SelfKind::Region(Some(lt), Mutability::Immutable)
|
||||||
} else if self.look_ahead(1, |t| t.is_lifetime()) &&
|
} else if self.look_ahead(1, |t| t.is_lifetime()) && self.is_isolated_mut_self(2) {
|
||||||
self.is_keyword_ahead(2, &[kw::Mut]) &&
|
// `&'lt mut self`
|
||||||
self.is_isolated_self(3) {
|
|
||||||
self.bump();
|
self.bump();
|
||||||
let lt = self.expect_lifetime();
|
let lt = self.expect_lifetime();
|
||||||
self.bump();
|
self.bump();
|
||||||
SelfKind::Region(Some(lt), Mutability::Mutable)
|
SelfKind::Region(Some(lt), Mutability::Mutable)
|
||||||
} else {
|
} else {
|
||||||
|
// `¬_self`
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
}, self.expect_self_ident(), self.prev_span)
|
};
|
||||||
|
(eself, self.expect_self_ident(), self.prev_span)
|
||||||
}
|
}
|
||||||
// `*self`
|
// `*self`
|
||||||
token::BinOp(token::Star) if self.is_isolated_self(1) => {
|
token::BinOp(token::Star) if self.is_isolated_self(1) => {
|
||||||
|
@ -1368,7 +1367,7 @@ impl<'a> Parser<'a> {
|
||||||
self.parse_self_possibly_typed(Mutability::Immutable)?
|
self.parse_self_possibly_typed(Mutability::Immutable)?
|
||||||
}
|
}
|
||||||
// `mut self` and `mut self: TYPE`
|
// `mut self` and `mut self: TYPE`
|
||||||
token::Ident(..) if self.token.is_keyword(kw::Mut) && self.is_isolated_self(1) => {
|
token::Ident(..) if self.is_isolated_mut_self(0) => {
|
||||||
self.bump();
|
self.bump();
|
||||||
self.parse_self_possibly_typed(Mutability::Mutable)?
|
self.parse_self_possibly_typed(Mutability::Mutable)?
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue