@@ -307,9 +307,9 @@ macro_rules! __fn_args {
307307/// Rust struct).
308308///
309309/// Note that the class name should be unique across the entire application!
310- /// As a tip, you can declare the class with the desired unique name like
311- /// `MyCrateCustomObject` using this macro , and then expose a renamed type
312- /// alias like `pub type CustomObject = MyCrateCustomObject;` instead .
310+ /// You can declare the class with the desired unique name like
311+ /// `" MyCrateCustomObject"` by specifying it in `ClassType::NAME` , and then
312+ /// give the exposed type a different name like `CustomObject` .
313313///
314314/// The class is guaranteed to have been created and registered with the
315315/// Objective-C runtime after the [`ClassType::class`] function has been
@@ -406,6 +406,8 @@ macro_rules! __fn_args {
406406///
407407/// unsafe impl ClassType for MyCustomObject {
408408/// type Super = NSObject;
409+ /// // Optionally specify a different name
410+ /// // const NAME: &'static str = "MyCustomObject";
409411/// }
410412///
411413/// unsafe impl MyCustomObject {
@@ -575,6 +577,8 @@ macro_rules! declare_class {
575577 unsafe impl ClassType for $for: ty {
576578 $( #[ inherits( $( $inheritance_rest: ty) ,+) ] ) ?
577579 type Super = $superclass: ty;
580+
581+ $( const NAME : & ' static str = $name_const: literal; ) ?
578582 }
579583
580584 $( $methods: tt) *
@@ -612,6 +616,7 @@ macro_rules! declare_class {
612616 // Creation
613617 unsafe impl ClassType for $for {
614618 type Super = $superclass;
619+ const NAME : & ' static str = $crate:: __select_name!( $name; $( $name_const) ?) ;
615620
616621 fn class( ) -> & ' static $crate:: runtime:: Class {
617622 // TODO: Use `core::cell::LazyCell`
@@ -623,10 +628,10 @@ macro_rules! declare_class {
623628 let superclass = <$superclass as $crate:: ClassType >:: class( ) ;
624629 let err_str = concat!(
625630 "could not create new class " ,
626- stringify !( $name) ,
631+ $crate :: __select_name !( $name; $ ( $name_const ) ? ) ,
627632 ". Perhaps a class with that name already exists?" ,
628633 ) ;
629- let mut builder = $crate:: declare:: ClassBuilder :: new( stringify! ( $name ) , superclass) . expect( err_str) ;
634+ let mut builder = $crate:: declare:: ClassBuilder :: new( Self :: NAME , superclass) . expect( err_str) ;
630635
631636 // Ivars
632637 $(
@@ -655,7 +660,7 @@ macro_rules! declare_class {
655660 } ) ;
656661
657662 // We just registered the class, so it should be available
658- $crate:: runtime:: Class :: get( stringify! ( $name ) ) . unwrap( )
663+ $crate:: runtime:: Class :: get( Self :: NAME ) . unwrap( )
659664 }
660665
661666 #[ inline]
@@ -689,6 +694,17 @@ macro_rules! declare_class {
689694 } ;
690695}
691696
697+ #[ doc( hidden) ]
698+ #[ macro_export]
699+ macro_rules! __select_name {
700+ ( $_name: ident; $name_const: literal) => {
701+ $name_const
702+ } ;
703+ ( $name: ident; ) => {
704+ $crate:: __macro_helpers:: stringify!( $name)
705+ } ;
706+ }
707+
692708#[ doc( hidden) ]
693709#[ macro_export]
694710macro_rules! __declare_class_methods {
0 commit comments