chore: Hoist non-generic part out of add_action_internal. (#2981)

Piotr Osiewicz created

add_action_internal shows up often in downstream crates (as it should
be, since it's a generic function it's codegened in each crate that uses
it); it adds non-trivial amounts of LLVM IR to the build as a whole
which we can cut down a bit by doing the inner fn trick.

Release Notes:

- N/A

Change summary

crates/gpui/src/app.rs | 50 +++++++++++++++++++++++++++++--------------
1 file changed, 34 insertions(+), 16 deletions(-)

Detailed changes

crates/gpui/src/app.rs 🔗

@@ -684,23 +684,41 @@ impl AppContext {
                 );
             },
         );
+        fn inner(
+            this: &mut AppContext,
+            name: &'static str,
+            deserializer: fn(serde_json::Value) -> anyhow::Result<Box<dyn Action>>,
+            action_id: TypeId,
+            view_id: TypeId,
+            handler: Box<ActionCallback>,
+            capture: bool,
+        ) {
+            this.action_deserializers
+                .entry(name)
+                .or_insert((action_id.clone(), deserializer));
+
+            let actions = if capture {
+                &mut this.capture_actions
+            } else {
+                &mut this.actions
+            };
 
-        self.action_deserializers
-            .entry(A::qualified_name())
-            .or_insert((TypeId::of::<A>(), A::from_json_str));
-
-        let actions = if capture {
-            &mut self.capture_actions
-        } else {
-            &mut self.actions
-        };
-
-        actions
-            .entry(TypeId::of::<V>())
-            .or_default()
-            .entry(TypeId::of::<A>())
-            .or_default()
-            .push(handler);
+            actions
+                .entry(view_id)
+                .or_default()
+                .entry(action_id)
+                .or_default()
+                .push(handler);
+        }
+        inner(
+            self,
+            A::qualified_name(),
+            A::from_json_str,
+            TypeId::of::<A>(),
+            TypeId::of::<V>(),
+            handler,
+            capture,
+        );
     }
 
     pub fn add_async_action<A, V, F>(&mut self, mut handler: F)