mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
Fix panics on pattern_arena.borrow with ugly cloning
This commit is contained in:
parent
975109051c
commit
de6f430140
@ -837,20 +837,19 @@ impl Fields {
|
|||||||
pat: PatId,
|
pat: PatId,
|
||||||
cx: &MatchCheckCtx<'_>,
|
cx: &MatchCheckCtx<'_>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
// TODO: these alocations are so unfortunate (+1 for switching to references)
|
// TODO: these alocations and clones are so unfortunate (+1 for switching to references)
|
||||||
match cx.pattern_arena.borrow()[pat].kind.as_ref() {
|
let mut arena = cx.pattern_arena.borrow_mut();
|
||||||
|
match arena[pat].kind.as_ref() {
|
||||||
PatKind::Deref { subpattern } => {
|
PatKind::Deref { subpattern } => {
|
||||||
assert_eq!(self.len(), 1);
|
assert_eq!(self.len(), 1);
|
||||||
let subpattern = cx.pattern_arena.borrow_mut().alloc(subpattern.clone());
|
let subpattern = subpattern.clone();
|
||||||
Fields::from_single_pattern(subpattern)
|
Fields::from_single_pattern(arena.alloc(subpattern))
|
||||||
}
|
}
|
||||||
PatKind::Leaf { subpatterns } | PatKind::Variant { subpatterns, .. } => {
|
PatKind::Leaf { subpatterns } | PatKind::Variant { subpatterns, .. } => {
|
||||||
let subpatterns = subpatterns.iter().map(|field_pat| {
|
let subpatterns = subpatterns.clone();
|
||||||
(
|
let subpatterns = subpatterns
|
||||||
field_pat.field,
|
.iter()
|
||||||
cx.pattern_arena.borrow_mut().alloc(field_pat.pattern.clone()),
|
.map(|field_pat| (field_pat.field, arena.alloc(field_pat.pattern.clone())));
|
||||||
)
|
|
||||||
});
|
|
||||||
self.replace_with_fieldpats(subpatterns)
|
self.replace_with_fieldpats(subpatterns)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,12 +94,12 @@ impl PatIdExt for PatId {
|
|||||||
fn expand_or_pat(self, cx: &MatchCheckCtx<'_>) -> Vec<Self> {
|
fn expand_or_pat(self, cx: &MatchCheckCtx<'_>) -> Vec<Self> {
|
||||||
fn expand(pat: PatId, vec: &mut Vec<PatId>, mut pat_arena: &mut PatternArena) {
|
fn expand(pat: PatId, vec: &mut Vec<PatId>, mut pat_arena: &mut PatternArena) {
|
||||||
if let PatKind::Or { pats } = pat_arena[pat].kind.as_ref() {
|
if let PatKind::Or { pats } = pat_arena[pat].kind.as_ref() {
|
||||||
// for pat in pats {
|
let pats = pats.clone();
|
||||||
// // TODO(iDawer): Ugh, I want to go back to references (PatId -> &Pat)
|
for pat in pats {
|
||||||
// let pat = pat_arena.alloc(pat.clone());
|
// TODO(iDawer): Ugh, I want to go back to references (PatId -> &Pat)
|
||||||
// expand(pat, vec, pat_arena);
|
let pat = pat_arena.alloc(pat.clone());
|
||||||
// }
|
expand(pat, vec, pat_arena);
|
||||||
todo!()
|
}
|
||||||
} else {
|
} else {
|
||||||
vec.push(pat)
|
vec.push(pat)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user