@@ -44,15 +44,9 @@ macro_rules! class {
4444/// ```
4545#[ macro_export]
4646macro_rules! sel {
47- ( $name : ident) => ( {
47+ ( $first : ident $ ( : $ ( $rest : ident : ) * ) ? ) => ( {
4848 static SEL : $crate:: __CachedSel = $crate:: __CachedSel:: new( ) ;
49- let name = concat!( stringify!( $name) , '\0' ) ;
50- #[ allow( unused_unsafe) ]
51- unsafe { SEL . get( name) }
52- } ) ;
53- ( $( $name: ident : ) +) => ( {
54- static SEL : $crate:: __CachedSel = $crate:: __CachedSel:: new( ) ;
55- let name = concat!( $( stringify!( $name) , ':' ) ,+, '\0' ) ;
49+ let name = concat!( stringify!( $first) , $( ':' , $( stringify!( $rest) , ':' , ) * ) ? '\0' ) ;
5650 #[ allow( unused_unsafe) ]
5751 unsafe { SEL . get( name) }
5852 } ) ;
@@ -135,40 +129,76 @@ macro_rules! sel {
135129/// [RFC-2945]: https://rust-lang.github.io/rfcs/2945-c-unwind-abi.html
136130#[ macro_export]
137131macro_rules! msg_send {
138- ( super ( $obj: expr, $superclass: expr) , $name : ident) => ( {
139- let sel = $crate:: sel!( $name ) ;
132+ [ super ( $obj: expr, $superclass: expr) , $selector : ident $ ( , ) ? ] => ( {
133+ let sel = $crate:: sel!( $selector ) ;
140134 let result;
141135 match $crate:: MessageReceiver :: send_super_message( & $obj, $superclass, sel, ( ) ) {
142136 Err ( s) => panic!( "{}" , s) ,
143137 Ok ( r) => result = r,
144138 }
145139 result
146140 } ) ;
147- ( super ( $obj: expr, $superclass: expr) , $( $name : ident : $arg : expr $( , ) ?) +) => ( {
148- let sel = $crate:: sel!( $( $name : ) +) ;
141+ [ super ( $obj: expr, $superclass: expr) , $( $selector : ident : $argument : expr $( , ) ?) +] => ( {
142+ let sel = $crate:: sel!( $( $selector : ) +) ;
149143 let result;
150- match $crate:: MessageReceiver :: send_super_message( & $obj, $superclass, sel, ( $( $arg , ) +) ) {
144+ match $crate:: MessageReceiver :: send_super_message( & $obj, $superclass, sel, ( $( $argument , ) +) ) {
151145 Err ( s) => panic!( "{}" , s) ,
152146 Ok ( r) => result = r,
153147 }
154148 result
155149 } ) ;
156- ( $obj: expr, $name : ident) => ( {
157- let sel = $crate:: sel!( $name ) ;
150+ [ $obj: expr, $selector : ident $ ( , ) ? ] => ( {
151+ let sel = $crate:: sel!( $selector ) ;
158152 let result;
159153 match $crate:: MessageReceiver :: send_message( & $obj, sel, ( ) ) {
160154 Err ( s) => panic!( "{}" , s) ,
161155 Ok ( r) => result = r,
162156 }
163157 result
164158 } ) ;
165- ( $obj: expr, $( $name : ident : $arg : expr $( , ) ?) +) => ( {
166- let sel = $crate:: sel!( $( $name : ) +) ;
159+ [ $obj: expr, $( $selector : ident : $argument : expr $( , ) ?) +] => ( {
160+ let sel = $crate:: sel!( $( $selector : ) +) ;
167161 let result;
168- match $crate:: MessageReceiver :: send_message( & $obj, sel, ( $( $arg , ) +) ) {
162+ match $crate:: MessageReceiver :: send_message( & $obj, sel, ( $( $argument , ) +) ) {
169163 Err ( s) => panic!( "{}" , s) ,
170164 Ok ( r) => result = r,
171165 }
172166 result
173167 } ) ;
174168}
169+
170+ /// A less error-prone version of [`msg_send!`] for methods returning `BOOL`.
171+ ///
172+ /// Objective-C's `BOOL` is different from Rust's [`bool`] (see [`Bool`]), so
173+ /// a conversion step must be performed before using it - this macro does that
174+ /// for you!
175+ ///
176+ /// [`Bool`]: crate::runtime::Bool
177+ ///
178+ /// Equivalent to the following:
179+ ///
180+ /// ```ignore
181+ /// # use objc2::msg_send;
182+ /// # use objc2::runtime::Bool;
183+ /// # let obj: *mut Object = 0 as *mut Object;
184+ /// {
185+ /// let result: Bool = msg_send![obj, selector];
186+ /// result.as_bool()
187+ /// };
188+ /// ```
189+ ///
190+ /// # Examples
191+ ///
192+ /// ```no_run
193+ /// # use objc2::msg_send_bool;
194+ /// # use objc2::runtime::Object;
195+ /// # let obj: *mut Object = 0 as *mut Object;
196+ /// assert!(unsafe { msg_send_bool![obj, isEqual: obj] });
197+ /// ```
198+ #[ macro_export]
199+ macro_rules! msg_send_bool {
200+ [ $( $msg_send_args: tt) +] => ( {
201+ let result: $crate:: runtime:: Bool = $crate:: msg_send![ $( $msg_send_args) +] ;
202+ result. as_bool( )
203+ } ) ;
204+ }
0 commit comments