on master help sign in
Simplify compositor.find
fa4c59dBlaž Hrastnik
helix-term/src/application.rs+3−15
@@ -270,12 +270,8 @@ impl Application {
270 }
270 }
271 let editor_view = self
271 let editor_view = self
272 .compositor
272 .compositor
273− .find(std::any::type_name::<ui::EditorView>())
273+ .find::<ui::EditorView>()
274 .expect("expected at least one EditorView");
274 .expect("expected at least one EditorView");
275− let editor_view = editor_view
276− .as_any_mut()
277− .downcast_mut::<ui::EditorView>()
278− .unwrap();
279
275
280 if editor_view.completion.is_some() {
276 if editor_view.completion.is_some() {
281 return;
277 return;
@@ -440,12 +436,8 @@ impl Application {
440 {
436 {
441 let editor_view = self
437 let editor_view = self
442 .compositor
438 .compositor
443− .find(std::any::type_name::<ui::EditorView>())
439+ .find::<ui::EditorView>()
444 .expect("expected at least one EditorView");
440 .expect("expected at least one EditorView");
445− let editor_view = editor_view
446− .as_any_mut()
447− .downcast_mut::<ui::EditorView>()
448− .unwrap();
449 let lsp::ProgressParams { token, value } = params;
441 let lsp::ProgressParams { token, value } = params;
450
442
451 let lsp::ProgressParamsValue::WorkDone(work) = value;
443 let lsp::ProgressParamsValue::WorkDone(work) = value;
@@ -559,12 +551,8 @@ impl Application {
559
551
560 let editor_view = self
552 let editor_view = self
561 .compositor
553 .compositor
562− .find(std::any::type_name::<ui::EditorView>())
554+ .find::<ui::EditorView>()
563 .expect("expected at least one EditorView");
555 .expect("expected at least one EditorView");
564− let editor_view = editor_view
565− .as_any_mut()
566− .downcast_mut::<ui::EditorView>()
567− .unwrap();
568 let spinner = editor_view.spinners_mut().get_or_create(server_id);
556 let spinner = editor_view.spinners_mut().get_or_create(server_id);
569 if spinner.is_stopped() {
557 if spinner.is_stopped() {
570 spinner.start();
558 spinner.start();
helix-term/src/commands.rs+9−13
@@ -4735,19 +4735,15 @@ pub fn completion(cx: &mut Context) {
4735 return;
4735 return;
4736 }
4736 }
4737 let size = compositor.size();
4737 let size = compositor.size();
4738− let ui = compositor
4738+ let ui = compositor.find::<ui::EditorView>().unwrap();
4739− .find(std::any::type_name::<ui::EditorView>())
4740− .unwrap();
4741− if let Some(ui) = ui.as_any_mut().downcast_mut::<ui::EditorView>() {
4742− ui.set_completion(
4739+ ui.set_completion(
4743− editor,
4740+ editor,
4744− items,
4741+ items,
4745− offset_encoding,
4742+ offset_encoding,
4746− start_offset,
4743+ start_offset,
4747− trigger_offset,
4744+ trigger_offset,
4748− size,
4745+ size,
4749− );
4746+ );
4750− };
4751 },
4747 },
4752 );
4748 );
4753}
4749}
helix-term/src/compositor.rs+3−2
@@ -177,11 +177,12 @@ impl Compositor {
177 .any(|component| component.type_name() == type_name)
177 .any(|component| component.type_name() == type_name)
178 }
178 }
179
179
180− pub fn find(&mut self, type_name: &str) -> Option<&mut dyn Component> {
180+ pub fn find<T: 'static>(&mut self) -> Option<&mut T> {
181+ let type_name = std::any::type_name::<T>();
181 self.layers
182 self.layers
182 .iter_mut()
183 .iter_mut()
183 .find(|component| component.type_name() == type_name)
184 .find(|component| component.type_name() == type_name)
184− .map(|component| component.as_mut())
185+ .and_then(|component| component.as_any_mut().downcast_mut())
185 }
186 }
186}
187}
187
188