Skip to content

Commit a0b9931

Browse files
committed
Add take() method to SyntaxEditor
1 parent bf0c394 commit a0b9931

File tree

3 files changed

+20
-25
lines changed

3 files changed

+20
-25
lines changed

crates/ide-assists/src/handlers/add_missing_match_arms.rs

+14-24
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
use std::iter::{self, Peekable};
2-
use std::ops::Deref;
3-
use std::rc::Rc;
42

53
use either::Either;
64
use hir::{sym, Adt, Crate, HasAttrs, ImportPathConfig, ModuleDef, Semantics};
@@ -78,10 +76,7 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext<'_>)
7876

7977
let cfg = ctx.config.import_path_config();
8078

81-
// As `make` is borrowed by the closure that builds `missing_pats`, this is needed
82-
// to satisfy the borrow checker.
83-
let make = Rc::new(SyntaxFactory::new());
84-
let make_weak = Rc::downgrade(&make);
79+
let make = SyntaxFactory::new();
8580

8681
let module = ctx.sema.scope(expr.syntax())?.module();
8782
let (mut missing_pats, is_non_exhaustive, has_hidden_variants): (
@@ -99,9 +94,8 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext<'_>)
9994
let missing_pats = variants
10095
.into_iter()
10196
.filter_map(|variant| {
102-
let make = make_weak.upgrade()?;
10397
Some((
104-
build_pat(ctx, make, module, variant, cfg)?,
98+
build_pat(ctx, &make, module, variant, cfg)?,
10599
variant.should_be_hidden(ctx.db(), module.krate()),
106100
))
107101
})
@@ -148,17 +142,15 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext<'_>)
148142
.into_iter()
149143
.multi_cartesian_product()
150144
.inspect(|_| cov_mark::hit!(add_missing_match_arms_lazy_computation))
151-
.filter_map(|variants| {
145+
.map(|variants| {
152146
let is_hidden = variants
153147
.iter()
154148
.any(|variant| variant.should_be_hidden(ctx.db(), module.krate()));
155-
let patterns = variants.into_iter().filter_map(|variant| {
156-
make_weak.upgrade().and_then(|make| build_pat(ctx, make, module, variant, cfg))
157-
});
149+
let patterns = variants
150+
.into_iter()
151+
.filter_map(|variant| build_pat(ctx, &make, module, variant, cfg));
158152

159-
make_weak
160-
.upgrade()
161-
.map(|make| (ast::Pat::from(make.tuple_pat(patterns)), is_hidden))
153+
(ast::Pat::from(make.tuple_pat(patterns)), is_hidden)
162154
})
163155
.filter(|(variant_pat, _)| is_variant_missing(&top_lvl_pats, variant_pat));
164156
(
@@ -183,17 +175,15 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext<'_>)
183175
.into_iter()
184176
.multi_cartesian_product()
185177
.inspect(|_| cov_mark::hit!(add_missing_match_arms_lazy_computation))
186-
.filter_map(|variants| {
178+
.map(|variants| {
187179
let is_hidden = variants
188180
.iter()
189181
.any(|variant| variant.should_be_hidden(ctx.db(), module.krate()));
190-
let patterns = variants.into_iter().filter_map(|variant| {
191-
make_weak.upgrade().and_then(|make| build_pat(ctx, make, module, variant, cfg))
192-
});
182+
let patterns = variants
183+
.into_iter()
184+
.filter_map(|variant| build_pat(ctx, &make, module, variant, cfg));
193185

194-
make_weak
195-
.upgrade()
196-
.map(|make| (ast::Pat::from(make.slice_pat(patterns)), is_hidden))
186+
(ast::Pat::from(make.slice_pat(patterns)), is_hidden)
197187
})
198188
.filter(|(variant_pat, _)| is_variant_missing(&top_lvl_pats, variant_pat));
199189
(
@@ -303,7 +293,7 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext<'_>)
303293
}
304294
}
305295

306-
editor.add_mappings(Rc::into_inner(make).unwrap().finish_with_mappings());
296+
editor.add_mappings(make.take());
307297
builder.add_file_edits(ctx.file_id(), editor);
308298
},
309299
)
@@ -458,7 +448,7 @@ fn resolve_array_of_enum_def(
458448

459449
fn build_pat(
460450
ctx: &AssistContext<'_>,
461-
make: impl Deref<Target = SyntaxFactory>,
451+
make: &SyntaxFactory,
462452
module: hir::Module,
463453
var: ExtendedVariant,
464454
cfg: ImportPathConfig,

crates/syntax/src/ast/syntax_factory.rs

+5
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ impl SyntaxFactory {
3333
self.mappings.unwrap_or_default().into_inner()
3434
}
3535

36+
/// Take all of the tracked syntax mappings, leaving `SyntaxMapping::default()` in its place, if any.
37+
pub fn take(&self) -> SyntaxMapping {
38+
self.mappings.as_ref().map(|mappings| mappings.take()).unwrap_or_default()
39+
}
40+
3641
fn mappings(&self) -> Option<RefMut<'_, SyntaxMapping>> {
3742
self.mappings.as_ref().map(|it| it.borrow_mut())
3843
}

crates/syntax/src/ast/syntax_factory/constructors.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ impl SyntaxFactory {
331331
}
332332

333333
pub fn expr_paren(&self, expr: ast::Expr) -> ast::ParenExpr {
334-
// FIXME: `make::expr_paren` should return a `MethodCallExpr`, not just an `Expr`
334+
// FIXME: `make::expr_paren` should return a `ParenExpr`, not just an `Expr`
335335
let ast::Expr::ParenExpr(ast) = make::expr_paren(expr.clone()).clone_for_update() else {
336336
unreachable!()
337337
};

0 commit comments

Comments
 (0)