Remove refs from pat slices
This commit is contained in:
parent
26366828a4
commit
1537cd4fb1
12 changed files with 85 additions and 68 deletions
|
@ -1067,6 +1067,15 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
eq_sign_span: Span,
|
||||
assignments: &mut Vec<hir::Stmt<'hir>>,
|
||||
) -> &'hir hir::Pat<'hir> {
|
||||
self.arena.alloc(self.destructure_assign_mut(lhs, eq_sign_span, assignments))
|
||||
}
|
||||
|
||||
fn destructure_assign_mut(
|
||||
&mut self,
|
||||
lhs: &Expr,
|
||||
eq_sign_span: Span,
|
||||
assignments: &mut Vec<hir::Stmt<'hir>>,
|
||||
) -> hir::Pat<'hir> {
|
||||
match &lhs.kind {
|
||||
// Underscore pattern.
|
||||
ExprKind::Underscore => {
|
||||
|
@ -1080,7 +1089,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
let (before, after) = pats.split_at(i);
|
||||
hir::PatKind::Slice(
|
||||
before,
|
||||
Some(self.pat_without_dbm(span, hir::PatKind::Wild)),
|
||||
Some(self.arena.alloc(self.pat_without_dbm(span, hir::PatKind::Wild))),
|
||||
after,
|
||||
)
|
||||
} else {
|
||||
|
@ -1165,14 +1174,14 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
let tuple_pat = hir::PatKind::Tuple(&[], Some(0));
|
||||
return self.pat_without_dbm(lhs.span, tuple_pat);
|
||||
} else {
|
||||
return self.destructure_assign(e, eq_sign_span, assignments);
|
||||
return self.destructure_assign_mut(e, eq_sign_span, assignments);
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
// Treat all other cases as normal lvalue.
|
||||
let ident = Ident::new(sym::lhs, lhs.span);
|
||||
let (pat, binding) = self.pat_ident(lhs.span, ident);
|
||||
let (pat, binding) = self.pat_ident_mut(lhs.span, ident);
|
||||
let ident = self.expr_ident(lhs.span, ident, binding);
|
||||
let assign = hir::ExprKind::Assign(self.lower_expr(lhs), ident, eq_sign_span);
|
||||
let expr = self.expr(lhs.span, assign, ThinVec::new());
|
||||
|
@ -1191,7 +1200,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
ctx: &str,
|
||||
eq_sign_span: Span,
|
||||
assignments: &mut Vec<hir::Stmt<'hir>>,
|
||||
) -> (&'hir [&'hir hir::Pat<'hir>], Option<(usize, Span)>) {
|
||||
) -> (&'hir [hir::Pat<'hir>], Option<(usize, Span)>) {
|
||||
let mut rest = None;
|
||||
let elements =
|
||||
self.arena.alloc_from_iter(elements.iter().enumerate().filter_map(|(i, e)| {
|
||||
|
@ -1204,7 +1213,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
}
|
||||
None
|
||||
} else {
|
||||
Some(self.destructure_assign(e, eq_sign_span, assignments))
|
||||
Some(self.destructure_assign_mut(e, eq_sign_span, assignments))
|
||||
}
|
||||
}));
|
||||
(elements, rest)
|
||||
|
|
|
@ -2577,21 +2577,35 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
self.pat_ident_binding_mode(span, ident, hir::BindingAnnotation::Unannotated)
|
||||
}
|
||||
|
||||
fn pat_ident_mut(&mut self, span: Span, ident: Ident) -> (hir::Pat<'hir>, hir::HirId) {
|
||||
self.pat_ident_binding_mode_mut(span, ident, hir::BindingAnnotation::Unannotated)
|
||||
}
|
||||
|
||||
fn pat_ident_binding_mode(
|
||||
&mut self,
|
||||
span: Span,
|
||||
ident: Ident,
|
||||
bm: hir::BindingAnnotation,
|
||||
) -> (&'hir hir::Pat<'hir>, hir::HirId) {
|
||||
let (pat, hir_id) = self.pat_ident_binding_mode_mut(span, ident, bm);
|
||||
(self.arena.alloc(pat), hir_id)
|
||||
}
|
||||
|
||||
fn pat_ident_binding_mode_mut(
|
||||
&mut self,
|
||||
span: Span,
|
||||
ident: Ident,
|
||||
bm: hir::BindingAnnotation,
|
||||
) -> (hir::Pat<'hir>, hir::HirId) {
|
||||
let hir_id = self.next_id();
|
||||
|
||||
(
|
||||
self.arena.alloc(hir::Pat {
|
||||
hir::Pat {
|
||||
hir_id,
|
||||
kind: hir::PatKind::Binding(bm, hir_id, ident.with_span_pos(span), None),
|
||||
span,
|
||||
default_binding_modes: true,
|
||||
}),
|
||||
},
|
||||
hir_id,
|
||||
)
|
||||
}
|
||||
|
@ -2609,13 +2623,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
})
|
||||
}
|
||||
|
||||
fn pat_without_dbm(&mut self, span: Span, kind: hir::PatKind<'hir>) -> &'hir hir::Pat<'hir> {
|
||||
self.arena.alloc(hir::Pat {
|
||||
hir_id: self.next_id(),
|
||||
kind,
|
||||
span,
|
||||
default_binding_modes: false,
|
||||
})
|
||||
fn pat_without_dbm(&mut self, span: Span, kind: hir::PatKind<'hir>) -> hir::Pat<'hir> {
|
||||
hir::Pat { hir_id: self.next_id(), kind, span, default_binding_modes: false }
|
||||
}
|
||||
|
||||
fn ty_path(
|
||||
|
|
|
@ -10,7 +10,11 @@ use rustc_span::symbol::Ident;
|
|||
use rustc_span::{source_map::Spanned, Span};
|
||||
|
||||
impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||
crate fn lower_pat(&mut self, mut pattern: &Pat) -> &'hir hir::Pat<'hir> {
|
||||
crate fn lower_pat(&mut self, pattern: &Pat) -> &'hir hir::Pat<'hir> {
|
||||
self.arena.alloc(self.lower_pat_mut(pattern))
|
||||
}
|
||||
|
||||
crate fn lower_pat_mut(&mut self, mut pattern: &Pat) -> hir::Pat<'hir> {
|
||||
ensure_sufficient_stack(|| {
|
||||
// loop here to avoid recursion
|
||||
let node = loop {
|
||||
|
@ -34,7 +38,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
}
|
||||
PatKind::Or(ref pats) => {
|
||||
break hir::PatKind::Or(
|
||||
self.arena.alloc_from_iter(pats.iter().map(|x| self.lower_pat(x))),
|
||||
self.arena.alloc_from_iter(pats.iter().map(|x| self.lower_pat_mut(x))),
|
||||
);
|
||||
}
|
||||
PatKind::Path(ref qself, ref path) => {
|
||||
|
@ -101,7 +105,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
&mut self,
|
||||
pats: &[P<Pat>],
|
||||
ctx: &str,
|
||||
) -> (&'hir [&'hir hir::Pat<'hir>], Option<usize>) {
|
||||
) -> (&'hir [hir::Pat<'hir>], Option<usize>) {
|
||||
let mut elems = Vec::with_capacity(pats.len());
|
||||
let mut rest = None;
|
||||
|
||||
|
@ -140,7 +144,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
}
|
||||
|
||||
// It was not a sub-tuple pattern so lower it normally.
|
||||
elems.push(self.lower_pat(pat));
|
||||
elems.push(self.lower_pat_mut(pat));
|
||||
}
|
||||
|
||||
for (_, pat) in iter {
|
||||
|
@ -149,7 +153,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
// ...but there was one again, so error.
|
||||
self.ban_extra_rest_pat(pat.span, rest.unwrap().1, ctx);
|
||||
} else {
|
||||
elems.push(self.lower_pat(pat));
|
||||
elems.push(self.lower_pat_mut(pat));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -189,11 +193,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
// Record, lower it to `$binding_mode $ident @ _`, and stop here.
|
||||
PatKind::Ident(ref bm, ident, Some(ref sub)) if sub.is_rest() => {
|
||||
prev_rest_span = Some(sub.span);
|
||||
slice = Some(lower_rest_sub(self, pat, bm, ident, sub));
|
||||
slice = Some(self.arena.alloc(lower_rest_sub(self, pat, bm, ident, sub)));
|
||||
break;
|
||||
}
|
||||
// It was not a subslice pattern so lower it normally.
|
||||
_ => before.push(self.lower_pat(pat)),
|
||||
_ => before.push(self.lower_pat_mut(pat)),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -214,7 +218,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
self.ban_extra_rest_pat(rest_span, prev_rest_span.unwrap(), "slice");
|
||||
} else {
|
||||
// Lower the pattern normally.
|
||||
after.push(self.lower_pat(pat));
|
||||
after.push(self.lower_pat_mut(pat));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -268,17 +272,17 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
}
|
||||
|
||||
fn pat_wild_with_node_id_of(&mut self, p: &Pat) -> &'hir hir::Pat<'hir> {
|
||||
self.pat_with_node_id_of(p, hir::PatKind::Wild)
|
||||
self.arena.alloc(self.pat_with_node_id_of(p, hir::PatKind::Wild))
|
||||
}
|
||||
|
||||
/// Construct a `Pat` with the `HirId` of `p.id` lowered.
|
||||
fn pat_with_node_id_of(&mut self, p: &Pat, kind: hir::PatKind<'hir>) -> &'hir hir::Pat<'hir> {
|
||||
self.arena.alloc(hir::Pat {
|
||||
fn pat_with_node_id_of(&mut self, p: &Pat, kind: hir::PatKind<'hir>) -> hir::Pat<'hir> {
|
||||
hir::Pat {
|
||||
hir_id: self.lower_node_id(p.id),
|
||||
kind,
|
||||
span: p.span,
|
||||
default_binding_modes: true,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/// Emit a friendly error for extra `..` patterns in a tuple/tuple struct/slice pattern.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue