Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide_assists/src/assist_context.rs')
-rw-r--r--crates/ide_assists/src/assist_context.rs32
1 files changed, 18 insertions, 14 deletions
diff --git a/crates/ide_assists/src/assist_context.rs b/crates/ide_assists/src/assist_context.rs
index 1474505971..0244f5fb29 100644
--- a/crates/ide_assists/src/assist_context.rs
+++ b/crates/ide_assists/src/assist_context.rs
@@ -131,12 +131,8 @@ impl Assists {
target: TextRange,
f: impl FnOnce(&mut AssistBuilder),
) -> Option<()> {
- if !self.is_allowed(&id) {
- return None;
- }
- let label = Label::new(label.into());
- let assist = Assist { id, label, group: None, target, source_change: None };
- self.add_impl(assist, f)
+ let mut f = Some(f);
+ self.add_impl(None, id, label.into(), target, &mut |it| f.take().unwrap()(it))
}
pub(crate) fn add_group(
@@ -147,25 +143,33 @@ impl Assists {
target: TextRange,
f: impl FnOnce(&mut AssistBuilder),
) -> Option<()> {
+ let mut f = Some(f);
+ self.add_impl(Some(group), id, label.into(), target, &mut |it| f.take().unwrap()(it))
+ }
+
+ fn add_impl(
+ &mut self,
+ group: Option<&GroupLabel>,
+ id: AssistId,
+ label: String,
+ target: TextRange,
+ f: &mut dyn FnMut(&mut AssistBuilder),
+ ) -> Option<()> {
if !self.is_allowed(&id) {
return None;
}
- let label = Label::new(label.into());
- let assist = Assist { id, label, group: Some(group.clone()), target, source_change: None };
- self.add_impl(assist, f)
- }
- fn add_impl(&mut self, mut assist: Assist, f: impl FnOnce(&mut AssistBuilder)) -> Option<()> {
- let source_change = if self.resolve.should_resolve(&assist.id) {
+ let source_change = if self.resolve.should_resolve(&id) {
let mut builder = AssistBuilder::new(self.file);
f(&mut builder);
Some(builder.finish())
} else {
None
};
- assist.source_change = source_change;
- self.buf.push(assist);
+ let label = Label::new(label.into());
+ let group = group.cloned();
+ self.buf.push(Assist { id, label, group, target, source_change });
Some(())
}